ロボットを倒さない

テレパシーモジュール(ロボットに組み込むローカルライブラリ)に関わって、対話をめぐるシグナルのやりとりは、すでにビデオにアップしているように、問題無く機能する。ただ、対話と動作を組み込んだテレパシーのやりとりに問題が発生した。動作を開始しようとすると突然倒れるのだ。この問題を回避するために、十日以上時間を使ったことになる。
テレパシーモジュールがらみの問題だと思った。この間の経験から、メモリエラーが発生すると、すぐに倒れる。例えば、配列の枠以上のところにアクセスすると、セグメントエラーで、ロボットが麻痺して倒れることはよくあった。
そのために、モジュールの怪しい箇所を徹底的に調べた。結果的に、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にとって倒れないプログラム作りは決定的に重要なのだ。