ユーザー管理とトピックファイル作成

mysqlの構築が終わった。その上で、トピックファイルの保存まで来た。
ここからはどうしてもロボットがなければならないので、大学に来た。
ロボットととのあいだで、トピックファイルのやり取りをする。今ロボットの中に、どのトピックファイルがあるのかも気になる。パソコンの方に、みあたらない、基本的なファイルがあるからだ。

復活したかな?

NAOを、再度、動かそうという意欲が、強く湧いてきている。
スマホのコントローラー、ピノキオは、ほぼ完璧に作ったつもりだったが、問題がある。パソコンからウエブサーバー経由でコントロールした方が、実用的かもしれない。
当面の戦略は、MacBookにバーチャルにlinuxを入れてウエブサーバーを立ち上げ、モバイルルーターを噛ませる。その、ローカルネットワーク経由で、qimessaging,jsを使って、ロボットをコントロールるすることだ。

システムのバージョンアップ

この間、ロボットをこまめに動かして、システムの全体を再度把握して、問題などをチェックしてきた。
いろいろ、手を広げすぎたきらいがある。
ロボットに組み込むiBotのローカルモジュール群と、スマホのコントローラー、ピノキオを更新しようと思う。前は、ibotのクラウドからの管理を意図していたので、逆に使いにくくなっていた。そんなことはやめて、単純にスマホとローカルなパソコンでロボットを制御するシステムに凝縮させよう。

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でやるような、ロボットを動かして、それを関節に組み込めるように処理したり、拍手や、いろいろな「芸人動作」を、トピックファイルから呼び出せるマクロとして作っておいたりしようと思う。

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

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

iBotのロボット動作モード

iBotシステムには、ロボットの動きを制御するための三つのモードがある。(WSと頭につくモジュールは、当方が作成してロボットに組み込まれるモジュール)
(1)androidアプリのピノキオの動作機能で、直接ロボットを動かす。android端末のコントローラーで動きを制御する。直接といっても、ALMotionのmoveToなどでうごかすのではなく、ibotのメインモジュールWSIbotで一旦コマンドをうけとって、ALMotionを起動する仕組みになっている。このモードには、動作記録、記録された動作の実行も可能になっている。
(2)第二には、WSIbotモジュールの中のWSCommandクラスの機能を使う。これは基本的に、ロボットに口頭で動作コマンド(進んだり回転したりナビゲートする)を与えて、記録したり、実行したりできる。コマンドは最初は与えて記憶するだけで、実行命令が口頭で与えられるまで実行しない。一連のコマンド群を保存したり際ロードしたりもできる。
(3)第三の方法は、Dialogのトピックファイルに、実行コマンドを埋め込む。ロミオとジュリエットで対話しながら動作をさせているが、これは、トピックファイルに詳細な動作を埋め込んでいるからだ。この処理と実行にも、WSIbotを使っている。
これらは現状では相互に独立しているが、この第二の機能と第三の機能を繋げたいと思っていた。そこで、Dialogのなかから、コマンドモードに保存した一連の動作機能を起動させることができるようにしようと考えている。コマンドモードの保存機能も、現状一つのコマンド群(一つのコマンド群には、多数の個別コマンドが保存できる)しか保存できていないが、これを10とか20くらいのコマンド群でも保存できるようにして、それをDialogのトピックファイルから指定して、実行できるようにしたい。
そうすると、ロボットは、たとえば、舞台に入場して、何かを演じて、退場するところまでをすべて、トピックファイルに記述することができ、また、最初と最後の動作をその場に合わせて、コマンドに組み替えることが容易になる。まさに、パソコンも、スマホも不要になって、全ての機能を口頭、コミュニケーションで与えることが可能になるのだ。
 

1つのスクリプトで、2台のロボットが対話/動作

これまで、2台のロボットにシナリオを交互に対話/動作させる時、それぞれ別のスクリプト(TOPICファイル)を用意し、テレパシーシグナルでやり取りしあった。もともとの台本は一つのファイルに作成し、それをロボットごとに切り分けるのが、とても面倒だった。
これを一つのスクリプトで済ませることができるようになった。つまり、同じスクリプトをそれぞれのロボットにインストールしても、交互対話が実現できるのである。
工夫は難しくない。開始の構文の中に、そのロボット名と一致しなければ、有効ではなくなる条件式を入れただけである。開始ロボットが確定し、そのルールが起動すると、あとは、テレパシーシグナルがそこから交互に呼び出されるので、意図した対話/動作が実現できる。
こうすると、修正も楽である。一つの台本をいじればよいので。そうでなければ、二つの台本を、常に調整し合わなければならなかったから。
演劇などで、一つの台本をみんなで使う、人間のやり方に近づいた。

複数ロボットと複数端末

ピノキオはスマホタブレットの端末で、一台で複数のロボットを管理するためのツールだった。複数のロボット同士はテレパシーでコミュニケーションする。これに対して、あらたに、一台のロボットが多数の端末とコミュニケーションを取る状況が想定されることが分かった。
(1)ロボット自身が授業を進行させる状況下で、児童・生徒が持っているタブレット端末から、ロボットの問いかけに対する回答を集める。それらの回答をもとになんらかのリアクションをとるような場合。
(2)ロボットの次の言動を複数の人々の意見を元に決定していく状況。(たとえば、その場で創造的に作成されるロボット演劇)
そのために、ロボット側が全ての存在端末を認識することが必要である。端末からの情報をすべて集めて、その中から特定のメッセージ、リクエストを選び出し、それ言動として出力する機能が必要となる。

ロボット演劇「ロミオとジュリエット」

ibotのテレパシー機能を使って、シグナルをやりとりして、会話のタイミングをとり、また、動作を行う。これの実証実験として、シェークスピアのロミオとジュリエットの有名な場面、第二幕、第一場、「キャピューレット家の庭園」の場面を演じさせてみた。

動きは、まだ、十分な演出を行っていないので、ある意味、適当だが、もっと凝らした演出は可能である。最後に、奥から乳母が呼ぶ声を、ピッチを上げた声でしゃべらしたら、裏声になっている、ちょっと笑う。最後の最後で、「充電不足」のメッセージが出てしまった。普通に充電していれば問題なかったのだが、つい怠った。
こうしたロボット演劇は、すでに、「夕鶴」でもやっていたのだが、そちらは著作権問題がややこしそうだったので、公開はやめた。こちらは、青空文庫の坪内逍遙の訳を、私が現代語に改めたもの。著作権問題はないので、公開している。
もっともっと、ロボットによる対話という技術、コミュニケーションという技術を高めて、ロボットにできることの限界を探っていきたい。それをとおして、「人間のコミュニケーション」への理解を深めたいと思う。