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

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

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

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

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

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

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

ロボットの相互把握

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

1台のスマホで、複数ロボット制御

ロボットの台数スマホを用意するのは不合理だから1台のスマホで複数のロボットを同時に制御したい。基本的に、IPアドレスで区別し、それぞれセッションを立ち上げながら制御することになる。
最も大きな問題は、以下に簡単にスマホに全てのロボット情報を取り込むかだ。次のようにした。
すでにテレパシー機能で、ローカルネットに繋がっている全てのロボット情報を、ロボット自身が相互に把握し合うプロトコルを組み込んだ(とは言っても、昨日からこれを正常に機能させるのに苦労したが)。したがって、最も都合がいいのは、1代のロボットに接続すると、そのロボットが全ての他のロボットの情報も持っていることだ。
まず、全てのロボットのスイッチをオンにする。モジュールが組み込まれる。その後、頭のセンサーをタッチすると、他のロボットの探索を開始する。センサーをタッチされた全てのロボットが、相互にIPアドレスやロボット名を含めた情報を提供し合い確保する。
スマホ(ピノキオ)から、1台のロボットにアクセスする。全てのロボット情報をピノキオに取り込む。ピノキオで、対象ロボットを切り替えながら必要な制御をする。
頭のセンサータッチは、不注意でも発生するので、無効にする機能も用意すべきだろう。

暗号化の問題

当初予定していたほんとんどのことに取り組めたと思っていたが、暗号化のことを忘れていた。実用性を考えたときに、対話スクリプトの暗号化は必要だ。あるいみ、そのために、自前モジュールを用意していたような面があるから。
opensslを使ってiBotサーバー上でencryptして、ロボット上でdecryptすることが通常考えられる。ロボットは、opwnsslのライブラリを通常持っていないから(そのためにインストールするのは面倒くさい)、少し大きくなってもモジュールにスタティックでlibをくっつけるしかないかと思う。それで正常にロボット上のdecryptができるかどうかは調べてみないとわからない。
もしそれができたとしても、完全に安全なシステムになるとは思えないが、それくらいの対応は必要だろう。

対話台本

今週中に2台目のロボットが来るはずだから、この2台のロボットの対話をテレパシーで制御するための、脚本を書いている。2本書いた。3本書いて、準備しようと思っている。

ピノキオにテレパシー制御機能を組み込む

テレパシーモジュールは、基本的にiBotの対話機能で、したがってロボットとの対話で、(1)他者ロボット探索、(2)接続初期化、(3)イベント送受信などの機能を実行できる。しかし、他者ロボット探索や初期化を対話で行うのが時間と手間がかかりすぎる場合がある。その時のために、このような初期作業を行う機能を次のバージョンのピノキオに組み込む。

テレパシーモジュール:他のロボットの初期探索

テレパシーを実現するためには、他のロボットの情報(少なくともIPアドレス)を得ていなければならない。これを対話的に与えるのはとても面倒なので、ロボット同士で、相互に情報を交換するシステムにする。
モジュールの中に、探索開始イベントハンドラを用意して、ALMemoryによってこのイベントが発生したことが伝えられたら探索を開始する(イベントの発生は対話で、ALDialogをとおして行えるので)。
探索は、前にも書いたように、ネットワークにブロードキャストパケットを送り出す。ローカルネットワークに繋がっている全てのロボットから送り出させる。それらを受信しあって、相手の存在を確認する。現状では、そのロボットのIPアドレスと、システムが保管しているロボットの名前を情報にする。自分のプロファイルをロボットクラスオブジェクトとして保存し、相手のロボット情報も同じクラスのオブジェクトとして保存する。
いずれ自分の初期位置情報も交換させたい。
確認した相手ロボットの名前を喋らせてもよい。
こうすれば、いちいち相手ロボットの情報を入力しなくて済む。
モジュールのコンパイルは済んだが、C++のnaoqiシミュレーターが、ALSystem を持っていない(不思議だ)、ので、そのロボットの名前を取得するシミュレーションができない。そこだけを適当に名前をつけて、シミュレーションするしかない。あとは、実機でシミュレーションだが、これは2台以上ロボットがないとテストできない。
ただ、対話のトピックファイルの中に、相手ロボットのIPを書き込まないとけないのか、その辺りが解決していない課題となっている。名前を書いておけば、モジュールがIPに変換するというのがいいのかもしれない。

テレパシー・モジュールのシミュレーション

複数のロボット間でシグナルをやりとりするためのテレパシーモジュールの基本的なところができたので、コンピュータでシミュレーションした。

文字も見えにくいので、シミュレーションの雰囲気を味わっていただくことしかできないかもしれない。
基本的に、多数のロボットからのシグナルを区別しながら受けるので、モジュールの中にサーバー機能が組み込んである。あまり評判は良くないが、私の大好きなコマンドであるunixのforkコマンドで、複数ロボットからの接続を同時に処理できるようにしている。クライアントとしては、他のモジュールなどからのイベントをテレパシー機能に変えて、指定された相手ロボットにシグナルを送る機能もモジュールは担っている。
先に書いたロボットクラスは、今回は、ソケット番号とIPアドレスしか保持しない、また処理しないが、今後、位置把握や他の機能を組み込んだクラスに拡張していきたい。
当面、月末に2台目のロボットが来る予定なので、それが来たらこのモジュールを使って人間同士の対話や関係、機微をシミュレーションさせたいと考えている。