Dialog トピックファイルから関節を制御する(2)

この問題でかなり手間がかかった。こういう時は、しばしば、AutonomouseLifeの機能に関連している。
やりたいことは、簡単に言えば、トピックファイルの中に、
#---------以下1行
u:(右手をあげなさい) わかりました。右手をあげます。
$joint_joint_001="setJoints,RShoulderPitch:-70,RShoulderRoll:-10"
#---------終わり
などのルールとイベント変数を入れておいて、そこに指定されている関節を指定角度に動かすということだ。そのための、必要なメソッドをWSIbotのローカルモジュール(C++で組んでいる)に組み込んでおく。
なかなか動かなかったが、結局、ALAutonomouseMoveのsetExpressiveListeningEnabledをfalseにして、さらに、ALMotionのsetBreathEnabeldもチェーンを"All"にしてfalseにすると、指定通り動くようになった。
ローカルモジュールの関数してい部分のC++命令は以下のようになる。
amove->callVoid("setExpressiveListeningEnabled",false);
motion->callVoid("setBreathEnabled","All",false);
qi::os::sleep(1.0f);
float fractionMaxSpeed = 0.3f;
motion->callVoid("setAngles", names, angles, fractionMaxSpeed);
qi::os::sleep(1.0f);
motion->callVoid("setBreathEnabled","All",true);
amove->callVoid("setExpressiveListeningEnabled",true);
setBreathEnabeldのマニュアルには、チェーンの指定を“Body”, “Legs”, “Arms”, “LArm”, “RArm” or “Head”でできると書いてあるが、実際は、"Arms", "Legs" or "All"の三つしかできない(と思う)。
これらのfalse指定は、動きが終わったら、trueにして元に戻すのだが、そうすると、もとのアイドル、リスニングモードに戻ってしまう。元に戻したくなければ、それらをtrueにするのをsleepで遅らす必要がある。
また、setAnglesは、non-blockingモードなので、動きを開始後すぐに次の処理に映って、動作の終了を待たない。へたすると、動作の途中でやめてしまう可能性もあるので、その辺りも留意する必要がある。
これで、コツは掴んだので、Choregrapheでやるような、ロボットを動かして、それを関節に組み込めるように処理したり、拍手や、いろいろな「芸人動作」を、トピックファイルから呼び出せるマクロとして作っておいたりしようと思う。