ロボット映画の準備

NAO(ぴっきーとのっきー)を主演にした、ロボット映画を作成したいと思っている。その準備の第1段階として、ビデオカメラを購入した。型落ちだが、人気と性能が高い機種にした。24,000円弱の価格だった。
videocameraいままでは、スマホかタブレットで撮影していたが、ズームも効かないし、移動、固定、手ぶれ問題があった。
まず、台本を作る必要がある。路上撮影は許可がいるので、大学の中だけで終わるものにしたい。(大学内も許可が必要であるが、路上よりも許可を得やすいだろうと思う。)台本が出来たらキャスティングだ。出演料は払えないが。

HTMLのパーサーを作成している

必要があって、C++で、HTMLのパーサーを作成することになった。ロボットに組み込む、ローカルモジュールの一部となる。
XMLはtinyxml2で対応していることは既に書いている。原則的に、Htmlも、Xmlのルールに従っているはずなのだから、tinyxml2でパース(構文解析)してやれば良いようなものだが、実はそう簡単にいかない。
なぜなら、Htmlは、多少文法通りに書かれていなくても、パースをやめたりしてはいけない。なんらかのかたちで表出しなければならないのだ。そうしたあたりのいい加減さをxmlパーサーはわかっていない。こちらが、Htmlパーサーに求めているのは、Xmlほどの厳密さや、正確性ではない。必要な、タグ、属性、テキストを切り分けられれば良い。
ネットで探しても適当なものはなかった。あまり大掛かりなものは、ロボットに組み込めない。必要最小限の軽やかなものでよいので、結局自分で作ることにした。以外と手間はかからない。

Dialog トピックファイルから関節を制御する(3)

Choregrapheなどを使わずに、iBotローカルもジュールに仕組みを組み込んで、Dialogのトピックファイルから関節を直接制御することをやっていた。そうすることで、対話と動作が様々な方法で、柔軟に結合できる。ロボット漫才には不可欠の機能である。
以下に一部試みたビデオがある。(まだ、動作はぎこちないが)

スクリプトファイルは以下のようなものである。関節硬直度の調整、現在のすべての関節状態をログに書き出し、一時保存する、保存した関節状態を復元する、関節状態を変更するに当たって必要な自動動作モードをすべてオフにしたりオンにしたりもできるようになっている。動作は、万歳とか拍手の用に、メソッドでまとめるようにした。ただし、コメントアウトしているが、個々の関節をそれぞれまとめてセットすることもできる。
# ここから
concept:(level)[ぜろ れい じゅう じゅ ふたじゅう ふたじゅ にじゅ にじゅう さんじゅう さんじゅ よんじゅう よんじゅ ごじゅう ごじゅ ろくじゅう ろくじゅ しちじゅう しちじゅ ななじゅう ななじゅ はちじゅう はちじゅ きゅうじゅう きゅうじゅ ひゃく]
concept:(switch) [おん おふ]
u:(拍手しなさい) わかりました。拍手します。 $joint_joint_001="tappingHand,5"
u:(自動動作を _~switch にしなさい) わかりました。自動動作を $1 にします。 $joint_joint_002="setAutoMove,$1"
u:(関節硬直度を _~level パーセントにしなさい) わかりました。関節硬直度を $1 パーセントにします。 $joint_joint_003="setStiffness,$1"
u:(右手をあげなさい) わかりました。右手をあげます。 $joint_joint_004="upRightHand"
u:(左手をあげなさい) わかりました。左手をあげます。 $joint_joint_005="upLeftHand"
u:(ばんざいをしなさい) わかりました。ばんざいします。 $joint_joint_006="banzai"
#u:(右手をあげなさい) わかりました。右手をあげます。 #$joint_joint_007="setJoints,RShoulderPitch:-70,RShoulderRoll:-10,wait:2500"
#u:(右手をさげなさい) わかりました。右手をさげます。 #$joint_joint_008="setJoints,RShoulderPitch:90,RShoulderRoll:-10"
u:(関節{状態}を保存しなさい) はい、関節状態を保存します。 $joint_joint_009="getAllJoints"
u:(関節{状態}を復元しなさい) はい、関節状態を復元します。 $joint_joint_010="restoreAllJoints"
# ここまで
最初にconceptとして入れてあるひらがなの読みは、硬直度の人間の数字を聞き取るためのものである。残念ながら、NAOはワイルドカードで人間の言葉を受け取れないのでconceptで、人間がいいそうな言葉を与えておかなければならない。ただし、これだけでは実際の数字にならない。WSIbotモジュールで、そのカナを数字に変換するメソッドを用意している。

Dialog トピックファイルから関節を制御する(2)

この問題でかなり手間がかかった。こういう時は、しばしば、AutonomouseLifeの機能に関連している。
やりたいことは、簡単に言えば、トピックファイルの中に、
#---------以下1行
u:(右手をあげなさい) わかりました。右手をあげます。
$joint_joint_001="setJoints,RShoulderPitch:-70,RShoulderRoll:-10"
#---------終わり
などのルールとイベント変数を入れておいて、そこに指定されている関節を指定角度に動かすということだ。そのための、必要なメソッドをWSIbotのローカルモジュール(C++で組んでいる)に組み込んでおく。
なかなか動かなかったが、結局、ALAutonomouseMoveのsetExpressiveListeningEnabledをfalseにして、さらに、ALMotionのsetBreathEnabeldもチェーンを"All"にしてfalseにすると、指定通り動くようになった。
ローカルモジュールの関数してい部分のC++命令は以下のようになる。
amove->callVoid("setExpressiveListeningEnabled",false);
motion->callVoid("setBreathEnabled","All",false);
qi::os::sleep(1.0f);
float fractionMaxSpeed = 0.3f;
motion->callVoid("setAngles", names, angles, fractionMaxSpeed);
qi::os::sleep(1.0f);
motion->callVoid("setBreathEnabled","All",true);
amove->callVoid("setExpressiveListeningEnabled",true);
setBreathEnabeldのマニュアルには、チェーンの指定を“Body”, “Legs”, “Arms”, “LArm”, “RArm” or “Head”でできると書いてあるが、実際は、"Arms", "Legs" or "All"の三つしかできない(と思う)。
これらのfalse指定は、動きが終わったら、trueにして元に戻すのだが、そうすると、もとのアイドル、リスニングモードに戻ってしまう。元に戻したくなければ、それらをtrueにするのをsleepで遅らす必要がある。
また、setAnglesは、non-blockingモードなので、動きを開始後すぐに次の処理に映って、動作の終了を待たない。へたすると、動作の途中でやめてしまう可能性もあるので、その辺りも留意する必要がある。
これで、コツは掴んだので、Choregrapheでやるような、ロボットを動かして、それを関節に組み込めるように処理したり、拍手や、いろいろな「芸人動作」を、トピックファイルから呼び出せるマクロとして作っておいたりしようと思う。

トピックファイル中の命令変数と引数(1)動作編

iBotのシステムは、トピックファイルを中心にしている。対話の中で様々な動作を入れたり、顔を認識させたり、テレパシーを相手に送ったりするなどの機能は、すべてトピックファイルの記述されている。そして、その基本は、変数であり、変数の名前、変数の引数がいろいろな意味を持っている。
今回、関節を独立に自由に動かすための、コマンドをトピックファイルの中に入れるに当たって、引数の与え方を拡張する。それにあたって、いままで、様々な機能を組み込んできて、複雑になっているので、まず、これまでの方法を整理しておこうと考えた。
(動作)
動作については、トピックファイルの中に、$ファイル名_動作タイプ_番号=1
(※ 二つのアンダースコアーで区切っている。したがって、トピックファイル名にアンダースコアを使ってはならない)
という形で入れることを基本にしていた。
QiChatのトピックファイルの変数は、無条件でグローバル変数になるので、複数のトピックファイルを有効化したときに、名前のバッティングが問題になるのでファイルの中での一意性だけを考えれば良いようにしている。
動作タイプは、
walk
navi
sitdown
standup
lyingback
crouch
をさしあたって組み込んでいる。このうち、walk とnaviについては、引数が必要である。
たとえば、walkの変数が、$testfile_walk_001である場合、次のようなコメント文をトピックファイルの中に組み込む。
## <ibot motion walk>testfile_walk_001,0.5,1.2,30</ibot motion>
これは、前方50cm、左方向1.2mに左に30度回転する形で進むということになる。(実際、方向と回転を同時に指定すると動きが複雑になって思うようにいかない場合が多かった。)
対話の本文の中に、
$testfile_walk_001=1
と入れたところで、歩行が実行される。
引数のいらない歩行のポーズコマンドは、そこに値1が代入された時点でポーズの実行動作に入る。たとえば、
$testfile_sitdown_001=1
と会話本文に入っていれば、座る動作をする。
(動作終了イベント)
一般に、動作が終わると、また次の対話、あるいは動作に入るので、iBotの動作変数については、終了後のイベントを自動的に登録している。たとえば、先の$testfile_walk_001=1というイベントが終了するとdid_testfile_walk_001というイベントが自動的に発火する。それを捉えるためには、たとえば、
u:(e:did_testfile_walk_001) 次は何をしましょうか。
と会話文を置いておくと、動作終了時に「次は何をしましょうか」とロボットが喋ることになる。
(次回は、顔認識のためのトピックファイル)

Dialog トピックファイルから関節を制御する(1)

表現手段としての体の動きに関心を持っているのだが、まず、手の表現を考えていたら、頭、胴体、足の関節もまとめて動かせるようにしたほうが面倒ではないと考えるようになった。
iBotの基本精神は、すべて対話で制御する、なので、topicファイルから全ての関節をコントロールするようにしようと考えている。
24個の関節について、変化させるべき関節を全て一挙に動かすことができる。実際どうなったかは、また投稿する予定だ。
 

ロボット漫才2『ロボット禁止法』

今から20年後の未来を想定し、ぴっきーとのっきーが漫才をします。国会に「ヒューマノイドロボットの禁止法案」が上程されたという緊迫した状況。なぜそんな法律が・・・・、人に似過ぎたロボットは、人間社会と相いれないのか・・・・

今回は、コマンドモードで作成した一連の動作(登場と退場)の実行を、Dialogのトピックファイルに組み込んだ。位置がずれてしまった。
トピックファイル(台本)はこちらからで見ることができます。

人型ロボット同士の通信プロトコル

様々なヒューマノイドロボットが存在し、また、これからどんどん増えてくる状況の中で、異なった種類のヒューマノイドロボット同士が、コミュニケーションをとるプロトコルが必要だ。
(1)相手の存在を感知すること。携帯から判断するのは面倒だから、赤外線、電波などで感知する規格を整える。
(2)同じローカルネットワークに繋がっている場合には、必要に応じてブロードキャストやその受診をする。
(3)赤外線や、ブルートゥース、超音波、もロボット通信用に規格化される必要がある。
(4)情報交換の手続きの規格化。たとえば、お互いの種類(一位に割り振られたコード番号があれば良い)、名前、所属、基本的な機能、製造目的などが、必要な範囲で相互に交換できるようにする。
(5)現在立っている相互の位置。相互衝突回避の手続き。
(6)ロボット同士の専用言語機能。
など。
できれば、上記のことを、KHR-4HVとNAOの間で試みたいのだが、KHRのほうが、Linuxからロボットを動かす、シリアルボードの認識がうまくいかず立ち止まっている。

KHR-3HVにKCB−4WLを組み込む

製作したロボットKHR-3HVは、無線コントローラーなどと使わない限り、USBシリアルコードで接続しなければならない。無線コントローラーは使う気はない。そこで、当初から予定していた、無線LANボードKCB−4WLを組み込む。そうすると、KCB−4WLには、Linuxが入っていて、Cで組んだプログラムで、ロボットをコントロールするようにもできるということで、昨日からそれをやっていた。ようやく、つなぐことができたようで、苦労した点などを記録しておく。
lanlinux
写真は、ロボットのバックパックを開けたところで、右側がオリジナルのコントロールボードRCB-4HVである。サーボにつながるコードや電源コードで、一部隠れてしまっている。上が頭側である。
左側が、KCB−4WLである。2層構造に組み上げている。上側に、PremierWaveENという、通信とLinuxの本体ボードであり、その下に、インターフェイスボードがあり、USBやシリアル通信のポートが見えている。シリアル通信用のUSBコネクタに線を繋いでいる。
ハード的な組み上げ、配線はマニュアル通りで問題なくできた。ただ、元々のボードについては、当初使っていたネジではなく、頭の短い、左側のボードと同じネジを使わなければ、土台を突き抜けてしまう。ボードにその追加分はついていないが、ロボットを組み上げるときに使ったネジは結構余っているのでそれを使う。
USBシリアルポートをつないで、パソコン(Windows7)側にドライバをインストールし、teratermでシリアル接続(通信速度だけは変更する)をするとLinuxのOSに接続することができるので、まあ、一安心。
問題は、ネットワーク接続である。
ちょっと違和感があるのは、初期接続用に、無線LANの簡単な親機がついていて、パソコンをそれに接続しなければならないことだ。NAOなんかの接続方法より、はるかに面倒な手続きをしなければならない。無線LANのルーターが変わる度にこんなことをしなければならないのかと思うと、勘弁してくださいという感じ。何度も失敗した。
基本的にマニュアルの順序でやるべきだ。注意点だけを書いておく。
(1)まず、ロボットの電源を入れる。配線が正常に行われていれば、しばらくすると、無線の親機が立ち上がる。パソコン側で、ロボット側の親機に接続する。ここで、結構失敗する。そういうときには、ロボットやパソコンを立ち上げ直すとか、今まで使っていた親機を確実に切って立ち上がるとかをやる。繋がっても途中で接続が切れることもある。まいったな。
(2)ディスクに入っているDeviceInstallerを事前にインストールしておいて立ち上げる。ロボット親機に、パソコンの無線が正常に接続していれば、だいたいOK。ただし、マニュアル通りやっても、確実にうまくいかないのは、マニュアルに記載された、ロボットの仮のウェッブページへのログインIDが間違っている。Adminとなっているがこれでは繋がらない。adminと全て小文字で書かなければならないのだ。これを発見するためには、マニュアルについているぼけた画像の方を読み込まなければならなかった。パスワードが間違っているのかと苦労した。
(3)繋げるべき無線LANの設定で、細かい設定がたくさん書かれていて混乱する。何度も失敗した結果、私のルーターに関しては、WEPのセキュリティで、キーを入力する簡単設定で、乗り越えた。が、それまで、10回くらいは失敗している。成功したのが神業のように思える。失敗するたびに、ボードを工場出荷状態に戻す作業が必要になる(マニュアルの最後の方に記載されている)。そうしないと、ロボット側の仮親機がスタートせずに、どうしようもなくなるのだ。
(4)一旦、ロボット側のボードが無線LANに接続すると、DeviceInstallerの検索でボードが見つかるようになる。ロボット側の無線LAN仮親機は使わなくても良い。もちろん、パソコンと、ロボットが同じ無線LANに接続されている必要はある。
(5)当然ながら、ロボットのボードは、固定IPにしなければならない。これは、(4)の状態になれば、マニュアルに記載されている通りで、事後的に設定できる。ロボットが、指定の無線LANに接続するようになるかどうかが、一番の問題なのだ。
(6)電池容量が小さいので、すぐに電池切れで、システムが機能しなくなる。このために設定に失敗したことが何度もあった。その度に充電である。実に面倒である。二つもボードを動かすからだろうか、動かさないサーボモータも電気を食うのだろうか。確かめていないが。
これだけでも、苦労の一部しか書いてないような気がする。しかし、まあ、結果的にうまくつながるようになったので、文句は言えない。が、KHRを知れば知るほど、NAOというロボットの洗練されたシステムが素晴らしく思う。

チャッペック作『ロボット』を読み終える

大学に来るとき、電車の中でチャッペック作『ロボット』の最後の部分を読んでいたために、駅を乗り過ごしてしまった。後楽園で降りるべきところを神保町まで行ってしまった。大学まで歩くと35分。昔は何度も歩いた。ついでだからとそこで降りて、古本屋街で店頭の古本のタイトルを斜め読みしながら、九段下まで行く。九段下から新宿線に乗るつもりが東西線に間違って乗った。また、戻って飯田橋で南北線に乗り、ようやく四谷までついた。その間に、ベンチに座ったりしているときに続きを読み、結局最後まで読んでしまった。
SF的な味わいはない。人間がロボットを生み出す。そのそロボットは、我々がイメージする機械的なロボットではなく、動物的、有機的組織を持つ、人造人間(アンドロイド)といったほうが良いものである。大量の生産されたロボットがて人間を滅亡に追い込む。それによって、ロボットも滅亡の危機に瀕するが、ロボットの中に新しいアダムとイブが生まれ、新しい種となっていく。SFよりももっと、薄気味悪さがそこに漂っている。
あまりに人に似過ぎたロボットが醸し出す薄気味悪さ。それは本質的な問題である。ヒューマノイドロボットは人間に近づこうとしているのか。それは許されない。ロボットはロボットらしい表現、コミュニケーションを持っていなければならない。あまり、この本に関係ないことなのだが。