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

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

ピノキオ1台で複数のロボット制御

2台目のロボットが来たので、2台のロボットでテレパシー機能を使った対話など、いろいろやろうと思って大学に来たら、スマホを1台しか持ってこなかった。本当は、Nexus7も持ってきて、それぞれコントロールしようと思ったのだが・・・。
しかし、そもそも、ロボットの台数だけ携帯端末を用意するというのは確かに不合理だと気付いた。
1台で複数のロボットを切り替えながら制御できるのが良い。まず、複数のロボットのIPアドレスや名前などを情報をしてlocalStrageに溜め込んで、接続を切り替える機能をピノキオに加えることにした(公開は、次のバージョン)。
最初の接続の時は、ロボットのIDとパスワードを聞かれて面倒かもしれないが、その後は、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台目のロボットが来る予定なので、それが来たらこのモジュールを使って人間同士の対話や関係、機微をシミュレーションさせたいと考えている。

テレパシーとロボットクラス

テレパシモジュールを組んでいたら、ロボットクラスの必要性を感じるようになった。複数のロボットがテレパシーでやりあう上で、相手(複数)ロボットの情報を確保しておくクラスがあると便利なのだ。最初は、ネットワークソケット番号とIPアドレスが最低組まれていればいいという程度だったが、考えると、名前、さらには、相対位置なんかもつかんでおいたり、対話の段階(これは予定済み)、動作状況を相互に持っていると便利だ。
だから、複数のロボットが常に相互にやり取りしている状態を想定する。ロボットは1つのローカルネットにつなぐことが原則だが、ブロードキャスト機能を使って、どんなロボットがそこにつながっているかを自力で把握することはできるだろう。初期における位置と方向は、人間が与えなければならないと思う。
ただ、アルデバランロボットは、動作後の位置と方向について、予測と結果を出すようになっている。それもかなりの細かい単位で位置情報を出してくる。不正確だとぶつかるかもしれないが、そこは衝突防止機能や基礎検知機能が付いているので調整し合うこともできる。
いずれにしても、テレパシーとロボットクラスをつなげたモジュールを作成することにしよう。

テレパシーモジュールの機能

テレパシー機能は、ALmemoryのイベント機能と、ネットワークを結びつけるのが最も単純で、プリミティブな機能として実現することができる。

テレパシー機能
テレパシー機能

図で説明しよう。左のロボットから右のロボットに伝える場合である。
いま、作成予定のモジュールをWSTelepathyとしよう。受け持つ機能部分は、四角の枠で囲まれている。 続きを読む テレパシーモジュールの機能