iBotNaoがほぼ完成!!スマホとロボットで全てができる!!

iBotNaoは、ロボットの内臓ウェッブサーバー上に、ibotシステムを動かして、ibotシステムがもともと持っていたロボット制御システムを全て外部のウェッブクライアントから可能にするシステムだ。
したがって、すべて、スマホで管理できる。パソコンは不要だ。iBotのc++で作成した組み込みライブラリのほとんどの機能がスマホから使えるようになった。
最後まで手がかかった、ローカルからロボットへのテキスト、サウンドファイルの転送が、htmlのcgiでできるようになったので、完成と言える出来栄えになった。
外で、ロボットのパフォーマンスを見せるときも、ノートパソコンは要らないのだ。スマホにテザリングの機能があればwifiルータもいらない。ただ、wifiは、何かとトラブルがらみなのであったほうがいい。
iBotNaoでできることの概略を書いておく。
(1)スクリプトの作成、編集、転送など。スクリプトとは、ibotコマンドを書き込める対話用のtopicスクリプト、ロボットの行動や発声を一連のコマンドとして管理できるスクリプト、また、その中で制御可能なサウンドファイル(mp3,wav)も転送管理できる。
(2)対話の制御。ibotの最大の特徴は、全て対話でロボットを制御(行動も対話も)できることだ。どのトピックファイルを使って対話を開始するか、対話の開始と停止、ロボットへ対話への強制入力なども可能である。
(3)ステータス管理。ロボットの停止、休息、覚醒、強制発話、ビップ音制御、ASR認識値制御、音声レベル制御、ロボットの全体的状態表示など。
(4)動作と発話の直接制御。前進後退などの前後左右ななめなどの動き、回転、などを画面のタッチでコントロールできる。同時に発話も、リストに沿って適宜送り出すこともできる。自動制御のコントロール。
(5)複数のロボット同士のコミュニケーション機能である、テレパシー機能の制御。
これまでは、ロボットをライブの舞台にあげるときに、ロボット自身がちゃんと動くかだけではなく、ノートパソコンが不調になったら、ibotのシステム起動ができず、どうしようもなかったのだが、これで、スマホさえ持っていれば、パソコンが壊れても大丈夫だ。不安が減少した。

NAOのnginxでC++のcgiを動かす手続き

NAOの内蔵ウェッブサーバーのnginxでC++で作成した実行ファイルをCGIとして動かす手続きが理解できたので、メモがわりに書いておく。
(1)ヴァーチャルなNAOであるopen-naoにlibfcgiの一連のツールをインストールする。(open-naoについては、aldebaranのサイトにインストールに仕方があるので省略)私は、libfcgi-master.zipをとってきて、
./configure
make
sudo make install
で、インストールしたが、他にもfastcgi++-2.1.tar.bz2なんかでもできそうだがやっていない。
(2)spawn-fcgi-1.6.4.tar.gzを取ってきて、
./configure
make
する。私は、ubuntuの32ビット版の方でやってしまったが、open-naoの方でもできると思う。インストールしなくてもよい。
srcフォルダにspawn-fcgiができているので、そのまま、open-naoに持ってきた。open-naoで作ったら当然、そのままでいい。
このspawnは、c++で作成した実行ファイルを、nginxからのリクエストに応じて、実行させるための媒体のようなものだ。
(3)open-nao上で実行ファイルを作成する。(32ビット版だからといって、ubuntuで作ると、libcのバージョン違いで失敗してしまった)
この辺りのことは、
http://chriswu.me/blog/writing-hello-world-in-fcgi-with-c-plus-plus/
に決定的に依存している。このページがなかったら、nginxでfastcgiを動かすイメージが、全く湧かなかったと思う。とても優れたページだ。
そこにサンプルがあるから、open-nao上で、nanoエディタで作成してコンパイルすると良い。なにしろ、open-naoには、開発環境が一通り揃っているし、ロボットと同じ実行環境が約束されている。なお、open-naoとPCとのファイルの転送は、psftpを使う必要がある。
(4)つぎに、naoのnginxの設定ファイルをいじる。設定ファイルは、/etc/nginxの中の、nginx.confに書かれている。(万が一のため、オリジナルのnginx.confをnginx.conf.orgなどにコピーしておく)
設定ファイルのなかに、次の行を加える。
location ~ \.cgi$ {
fastcgi_pass 127.0.0.1:8000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
この意味は、cgiという拡張子がついたファイルへのアクセスは、ローカルの8000版ポートで待機している実行ファイルを起動させることにする、というものだ。
(5)ロボット内でnginxを再起動する。
/etc/init.d/nginx restart
でよい。エラーがなければ問題ない。
(6)次に、(1)で作成したライブラリの/usr/local/lib以下にある、libfcgiで始まるファイルを全部zipなどでアーカイブして、nao本体に送り込む。そして、/usr/local/lib以下に同じように解凍する。その際、シンボリックリンクが壊れているので、もとの、open-naoの/usr/local/lib以下でのシンボリックをそのまま再現する。
(7)c++で作成したcgiの実行ファイル、例えば、foobar.cgiを
spawn-fcgi -p 8000 -n foobar.cgi
と立ち上げる。
(8)ロボットの外から、アクセスすれば、foobar.cgiが実行される。たとえば、上記のサイトにあるように、curlを使えば、

> curl -d "Chris" http://localhost/foobar
<html>
  <head>
    <title>Hello, world!</title>
  </head>
  <body>
    <h1>Hello Chris from /foobar !</h1>
  </body>
</html>

という感じで出力される。

ロボット植え込みiBotは、ほぼできた

途中、ロボットのウェッブサーバーをapache2にしようかという迷いがあったが、結局、originalのnginxを使った。これからは、本番は、スマホだけで全て処理できる。
こちらに何か支障があれば、今まで通りノートブックのサーバー上のiBotでもコントロールできるので、セキュリティが高まった。
ロボット植え込みiBotの弱点は、パソコンからのファイル転送をftpなどに頼らなければならないところだ。これも、nginx用のfcgiを使えるようになればなんとかなるので、しばらくそれに取り組みたい。
それが終わったら、 クラウドの人工知能機能を利用する段取りに入りたい。

apache2のcgiから、naoqiのロボット制御モジュールを呼び出す

ALTextToSpeechを呼び出して「こんにちわ、サリーです」とロボットに言わせる単純な、cgiをC++で作った。NAO(名前がサリー)に組み込んだ、apache2のcgiとして、外部のpcからアクセスすると、ちゃんとロボットは喋った。
qimessaging.jsの代わりに、qimessaging.cgiをC++で作れることはほぼ間違いがない。ALbrokerを使えば、汎用性の高いcgiにすることができるはずだ。
急いで作ろう。

qimessaging.jsの代わりになるcgi実行ファイル

埋め込みサイトで、apache2も正常に機能し、先に作成したファイルアップロード受け口用のC++で書いたcgiファイルも正常に実行されることが確認できたが、肝心のqimessaging.jsがうまく機能しない。呼び出し中に、ソケットIDがらみのエラーが出る。そのとのサーバーからの呼び出しでは問題なく機能していたのだが。
色々やれば、解決できるのかもしれないが、ふと、そこまでqimessaging.jsに位存在なければならないの??という疑問がふつふつと湧いてきた。ロボットのローカルでサーバーが動いている、C++で書いたcgiの実行ファイルも正常に動く。ロボット内部のライブラリ(システムのも、こちらで作成したもの)も問題ない。だったら、C++で書いたcgiの実行ファイルから、直接、ライブラリのメソッドを呼び出せばいいのではないか??
ふと、それをpythonで書こうかと思ったが、いやいや、それは面倒だ。直接C++で書けば良い。brokerを使えば、コンパクトで汎用性のあるものが作れるのではないかという気がしてきた。

ロボットnaoにapache2ウェッブサーバーをインストール

前に書いた理由で、新たにnaoにapache2をインストールすることにした。手順をメモがわりに書いておく。
(1)apache2の最新版をダウンロードする。ここでは、apache2-2.4.25を使った。
(2)opennaoバーチャルロボットにpsftpなどで転送し、解凍する
(3)解凍したフォルダで、./configure --prefix=ロボット上のインストールしたいフォルダの指定する。私は、rootじゃなく、naoで実行したいので、/home/nao 以下のフォルダを指定した。
(4)普通にmakeとmake installを実行する。エラーは出ない。
(5)インストールしたフォルダごとアーカイブし、naoの実機に転送する。
(6)httpd.confを編集する。私の場合は、portを80から8080に変更。変更しないと、通常のrobotページとバッティングするので。cgiを動かす設定、ドメイン名がコメントアウトされているのをそのまま外す。関係のないドメイン名になっているが、コメントアウトするとスタート時に警告が出るを避けるだけの目的。
(7)ただ、これだけでは、apachectl startとやるとライブラリがらみのエラーが出て、実行できない。そこで以下の操作をやる。
opennaoの/usr/libディレクトリから、次の二つのファイルを取ってくる。
libaprutil-1.so.0
libapr-1.so.0
これをapache2のあるフォルダ以下libフォルダを作成してその下に入れておく。今そのフォルダを、
/home/nao/hoge/lib
だったとしよう。/etc/ld.so.conf.d/にnanoを使って、apache.confファイルを作り、そこに、上記フォルダのパスを書いて保存する。
ロボットのrootになって、ldconfigを実行する。その後、
ldconfig -p | grep libapr
をrootで実行すると、
libaprutil-1.so.0 (libc6) => /home/nao/ibot/www/lib/libaprutil-1.so.0
libapr-1.so.0 (libc6) => /home/nao/ibot/www/lib/libapr-1.so.0
となり、これでOKである。
あとは、ポートを8080にしている限り、rootにならなくても、naoユーザーのままで、apachectl
./bin/apachectl start
を起動すれば、サーバーが立ち上がり、ロボットのipとポートを指定すると、
と、無事立ち上がった。

ロボットにapache2を入れようと

naoには、nginxというウェッブサーバーが入っている。それはそれでいい。しかし、c++で作った実行ファイルをcgiにしたいのだが、nginxにはcgiを直接動かす機能がないので、fastcgiなどを追加しなきゃいけないらしい。それもまた入っているようなのだが、pythonしか動かないような設定になっているように見える。nginxやfastcgiに不慣れなので、不確かなのだが。
これ以上、いじると、元のロボットページなどに影響が出るかもしれないので、別にウェッブサーバーを動かそうと思う。ポートを、80じゃなくて、8080あたりにしておけば、nginxとバッティングしないだろう。
apache2は長年使い慣れている。ちょっと重たいが、まあ、それほどディスクを食うわけではない。
ただ、前にも書いたように、ロボットには、g++などの開発ツールは入っていないので、opennaoというvirtual-naoを使う必要がある。ここで開発すれば、まあ、naoに持ち込めると踏んでいる。そこで、opennaoでapache2をコンパイルするところまではやった。
あとは、ロボットに持ち込んで、動かすだけだが、今日はこれ以上それをやっている余裕はないので、やめておく。明日は時間が取れると思う。

埋め込み用ibotサイト

ロボットをコントロールするためのWEBシステムibotをロボット自身のサーバー上で動かすための改変をしていたが、それは終えた。いざ、通常のロボットサイトの下にibotというフォルダを作りそこに入れようとしたら、そもそも、ロボットのLinuxでphpが動いていないことに気づいた。
phpでサーバーサイドの処理を行うhtml5システムなので、困った。phpを入れようとすると、gccやらgmakeなどをインストールしなければならず、それが限りなく重たい。そこで、naoqiの指摘ライブラリの中で、ファイルを操作などを行うようにしようと思った。つまり、javascriptからqimessaging.jsでC++で作成したnaoqiのライブラリを呼び出して、サーバー内のファイル操作をやらせるのだ。ただ、パソコンからのファイルのアップロードの受け取り処理をphpにやらせていたのだが、それをライブラリでやる方法が今ひとつわからない。

iBotをロボットに埋め込む

naoには、ウェッブサーバーが常に稼働しているので、そのサーバーの元でibotを動かし、PCやスマホからそのibotにアクセスすればロボットをこれまでのようにコントロールできるようにする。
そうすればサーバーとしてのPCも不要になり、システム操作が単純化する。PCからもアクセスできるが、基本、スマホからのアクセスを前提とすれば良い。そのためにiBotを最初から作り直そうと思っている。