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

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

複数ロボットと複数端末

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

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

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

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

ロボットを倒さない

テレパシーモジュール(ロボットに組み込むローカルライブラリ)に関わって、対話をめぐるシグナルのやりとりは、すでにビデオにアップしているように、問題無く機能する。ただ、対話と動作を組み込んだテレパシーのやりとりに問題が発生した。動作を開始しようとすると突然倒れるのだ。この問題を回避するために、十日以上時間を使ったことになる。
テレパシーモジュールがらみの問題だと思った。この間の経験から、メモリエラーが発生すると、すぐに倒れる。例えば、配列の枠以上のところにアクセスすると、セグメントエラーで、ロボットが麻痺して倒れることはよくあった。
そのために、モジュールの怪しい箇所を徹底的に調べた。結果的に、forkコマンドからpthreadによるスレッド処理にかえたり、自動で体を動かす機能をコントロールしたり、したが結局それらは問題ではなかった。そもそも、テレパシーモジュールの問題ではなかった。
要するに、歩行開始前の状態の問題だった。歩行開始前は、StandInitのポーズにしなければならない。ibotの基本モジュールでは、初期状態をALPostureモジュールで把握して、それがStandInitでなければ、ポーズをStandInitにセットするとしていたのだが、じつは、実際の姿勢がStandInitではなくても、そうであるかのように値を返すことが分かった。
そのあたりの問題があることに気づいたのは、実は、Choregrapheでも、初期状態をちょっと変にしておくと、Poseをとったときに、バーチャルロボットが倒れることがわかったことが大きい。つまり、Choregrapheも状況によって、機能できないと倒れるのだ。ここがヒントになって、上記のチェックを行った結果、どのような状況でも、moveToコマンド前に、StandInit状態にすることで、倒れなくなった。
さらに、moveToの終了後、まず、Standのポーズをとらせてから、体を自動的に動かす機能を復活させるにしたことも大切な対応だった。というのも、ロボットは、こうしたAutolife機能は、Standの状態で行うので、早めにStandを確保しないと、自動の動きを突然やらせると、体が揺れて、そのために倒れることがあるのだ。これも回避することができるようになった。
ロボットにとって、倒れることは深刻な問題だ。Pepperは、プログラマティカルに倒れることはないだろう。しかし、NAOは二足歩行である。倒れやすい。というか、倒れることを前提に、いろいろな対応が取られている。PepperにはPushrecovery機能があるのに、NAOには、なぜかその機能が組み込まれていない。NAOの足の裏には、片足、4個のセンサーが付いていて、圧力をチェックしているので、それを使って、Pushrecovery機能を持たせることができそうだが、なぜか、そのイベントと値を取得できない。
NAOにとって倒れないプログラム作りは決定的に重要なのだ。

生き物はつながっている:教科書準拠、ぴっきー、のっきーのロボット対話

東京書籍の『新しい理科6』の「4 生き物の暮らしと環境」をはじめるにあたって、子供達に見せたら刺激になりそうな、ぴっきー、のっきーの対話です。ぴっきー、のっきーは、通常の人との対話のようなものもできますが、それでは会話が間延びしてしまうので、ibotのテレパシー機能を使って、対話を実現しています。

今回は特に、ロボット同士の対話の間に、児童との質問と回答のやりとりも挟んでいます。

虚構と真実について、ぴっきー、のっきーが語り合う

ibotのテレパシー機能を使って、ぴっきーとのっきーに語り合わせる例の2つめ。
truth
ロ­ボットの目から見て、人間が、虚構と真実を適当に妥協させて、生きているようにみえる­という話です。しかし、それが人間の持っている自由の表れであること、プログラム化する­自分たちとは違うことを議論させてみました。

テレパシー機能実演:ぴっきー、のっきー地球温暖化問題を語り合う

テレパシー機能の実演として、ぴっきー、のっきーに地球温暖化問題をかたり合わせてみた。
global
通常の、相手の言葉を聞き、認識して指定された自分の言葉を語りALDialogの機能では、相手が終わった途端(あるいは途中)から、話し出すことはできずにモタモタする。テレパシー機能を使うと、リズムに関しては人間の会話に近づくことができる。
ただ、言葉がロボット訛りがあるのと、台本の若干の誤り、ロボットの警報音、15分近い長さ、など、まだ、完成ではありませんが、テレパシー機能とは何かを感じ取ってもらえるのではないかと思います。
課題はまだまだあります。

複数ロボットの動作記録

ロボットの動作を記録することができるようにしたことは既に書いた。が、複数のロボットの場合に、問題が生じる。1台のピノキオで、複数のロボットをコントロールすることを前提にしているので、ロボット名で動作をlocalStorageに1回分だけ記録することができるようにした。テレパシーのロボット探査機能を使って、その時動かしているロボットの名前をセットし、動作を記録する。そして、記録の実行は、そのとき繋いでいるロボットの記録を実行することにした。

テレパシーモジュール:もう一つ問題そして解決

先に困難を書いたが、テレパシーモジュールを機能させる上で、決定的な問題は、ローカルモジュール内で子プロセスからALMemoryのイベントを呼び出せないことだ。数日無駄にした。最終的に、forkでサーバー機能を持たせることを諦めた。そして、結果的にそれでうまくいった。今日、二台のロボットに、人と同じような、素早いレスポンスの対話をさせることができた。2、3日中に、youtubeにアップできると思う。