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

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

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

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

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

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

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

複数ロボットの動作記録

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

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

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

動作のマクロ機能を追加

ピノキオ(スマホコントローラー)に、動作を記録して再現する機能を追加した。予定した行動をさせる機能としては、口頭でコマンドを与える機能も持っている。二本立てになった。これによって、複数のロボットを操りやすくなった。事前に動作を決めておいて、マクロの実行コマンドだけを与えれば、複数のロボットが一連の動作を、ほぼ同時に開始させることができる。

理解できないことに直面して

この数日テレパシーに関わる作業を続けてきたが、どうしてもうまくいかないことが続いた。ある方向で実行すると動かない、別の方向では動く、これが多種多様に発生して何が何だかわらかなくなってきた。が、おそらく次の二つが原因になっているのではないかと思う。それを書き留めておこう。
(1)あるローカルモジュール内で登録したALMemoryイベントを、同一モジュール内で、raiseEventメソッドで、イベント発生させハンドラを呼び出すことはできない。
そもそもやろうとしていることが奇妙に思える。同一モジュール内だったら、直接そのイベントハンドラに対応する関数を呼び出せば良いからである。ただ、ここで必要になったのは、子プロセスから親プロセスのハンドラを呼び出すことをしたかったわけだ。Linuxのネイティブなシステムコールなどを使えばできるのかもしない。また、naoqiのリモートモジュールだったらこれもできることは確認した。が、ローカルモジュールになった途端できない。そのハンドラを、他のモジュールや、外側のPythonから呼び出すと正常に呼び出すことができる。
できないなら仕方がない。本質的には、他のモジュールから呼び出せる限り問題ないとは言える。
(2)これも不思議なのだが、子プロセスから、textspeechなどの機能を呼び出せないーようだ。親プロセスと子プロセスを取り替えた途端しゃべるので、たぶん、そうだろうと。
JAVAだったか、グラフィックツールはメインスレッドでしかうごかせないなどという制約があったのと同じかもしれない。つまり、ハードウェアをコントロールするAPIは、メインプロセスでしかうごかせないのかもしれないということである。
上記の二つが本当かどうか、絶対にそうだとは言えない。何か他の要因でできないでいるだけかもしれない。しかし、何日も無駄にしたので、腹立ち紛れに書いておいた。
イソップ物語にある、狐と葡萄の話だ。ブドウのふさに跳びついて取れないとわかった途端、狐は「こんなぶどうは酸っぱいに決まっている」と言い捨てて立ち去ったという話だ。高校生の頃に知ったのだが、いまだにこの狐のたくましさが好きだ。

ロボットの相互把握

目的としては図のようにしたいわけである。(理想的なところはどこにあるかを記録のためにここに書いておく。)
search_robotsしかし、当面2台しか持っていないので、この図で言う認識すべきロボット数をブロードキャストで流すという部分を省略している。
デフォルトで、2台のロボットを認識すようにして、それ以上の場合は、認識すべき台数だけは、頭にタッチする以前に、個々のロボットにセットしなくてはならなくしている。
また、今は、頭頂前部のタッチにしているが、いずれは、一旦タッチすると無効にして、再有効化のためにはブロードキャストで、またセットし直す必要があるようにしたい。