Up:Tutorial? Previous:動力学シミュレーションのサンプル Next:エージェント間のメッセージのやりとり? エージェントの動きに関する操作 †※このチュートリアルはv2.1.0以降対応しています。 人間またはロボットの形をしたエージェントの関節の操作方法を説明します。 関節の操作 †人間が手を上げるサンプルコードを紹介します。 コントローラの作成 †MyWorldディレクトリの中に新しくAgentController.cppを作成します。 $ emacs AgentController.cpp AgentController.cpp このサンプルはシミュレーション開始と同時に my->setJointAngleでエージェントの左腕が上に45°に上がるというものです。 コンパイル †コンパイルします。 $ ./sigmake.sh AgentController.cpp 世界ファイル作成 †次に世界ファイルを作成します。 $ emacs AgentWorld.xml AgentWorld.xml エージェントとしてMan-nii.xmlを読み込むように設定し、動力学演算をfalseにしました。動力学演算をtrueにするとエージェントの関節角度などを直接指定することができないので注意が必要です。 SIGVerse起動 †それではSIGVerseを起動してみましょう。 $ sigserver.sh -w ./AgentWorld.xml SIGViewerを起動して見てみると人間のエージェントが手を広げてスタンバイしています。 シミュレーションを開始するとエージェントの左腕が45°上がります。 今回setJointAngleという関数を用いて"LARM_JOINT2" を45°にする設定を行いました。"LARM_JOINT2"は左肩のz軸での回転として定義された関節の名前です。同様に"LARM_JOINT0","LARM_JOINT1"はそれぞれ左肩のx軸、y軸の回転として定義されています。(エージェント座標系。)これらの関節名はsigverse-<version>/share/sigverse/data/shape/にあるx3dファイル(nii_man.x3d)で定義されています。サンプルモデルのジョイント名と回転軸はJoint定義一覧?を参照ください。 世界ファイルは人間の設定ファイルMan-nii.xmlを読み込みMan-nii.xmlファイルは人間型エージェントの形状を記述したnii_man.x3dを読み込んでいます。 コマンドによるエージェントの操作 †前回は定期的に呼び出されるonActionで手を上げるサンプルコードを紹介しました。次はSIGViewerからのメッセージを送信することによりエージェントがお辞儀をするようなサンプルコードを紹介します。 新しくコントローラを作成します。 $ emacs AgentController2.cpp AgentController2.cpp メッセージ受信時に関数onRecvMsgが呼び出されます。メッセージが"Hello"だったときにお辞儀をします。 $ ./sigmake.sh AgentController2.cpp 世界ファイル †次に世界ファイルAgentWorld.xmlでコントローラを読み込んでいる個所をAgentContoroller2.soに修正します。 ↓ 実行 †それでは実行してみましょう。 $ sigserver.sh -w AgentWorld.xml SIGViewerで接続して、 "Connect"ボタンをクリックしてシミュレーションを開始すると、まずonActionが呼び出されて右手と左手を下に下げます。 メッセージ送信 †まずSIGViewerの右下にあるMessageボタンをクリックします。 するとSendMessageトレイが現れます。TargetEntityでメッセージを送信するターゲット"man_000"を選択します。次にMessage:のところで"Hello"と入力します。 入力が完了したら、"Send"ボタンを押します。 お辞儀をしました。 クオータニオンによる関節の回転 †関節の回転はクオータニオンによって設定することもできます。 関節回転箇所を以下のように修正します。 AgentController.cpp ↓ setJointQuaternionという関数を使って関節のクオータニオンを設定します。引数で関節名の次にクオータニオンのw,x,y,z成分を指定します。 クオータニオンを指定した場合はあらかじめ設定されている関節の回転軸に関係なく回転します。 正常に関節が回転するか確認してみてください。 Old version †Up:Tutorial? Previous:動力学シミュレーションのサンプル Next:エージェント間のメッセージのやりとり? English version? |