Up:Tutorial? Previous:動力学シミュレーションのサンプル Next:エージェント間のメッセージのやりとり
人間またはロボットの形をしたエージェントの関節の操作方法を説明します。
人間が手を上げるサンプルコードを紹介します。
NewWorldディレクトリに新しくAgentController.cppを作成します。
$ cd ~/sigverse-<version>/bin/NewWorld $ emacs AgentController.cpp
AgentController.cpp
のサンプルはシミュレーション開始と同時に my->setJointAngleでエージェントの左腕が上に45°に上がるというものです。
次にMakefileに作成したコントローラを追加します。
$ emacs Makefile
変更前
#オブジェクトファイルの指定 OBJS = MoveController.so
変更後
#オブジェクトファイルの指定 OBJS = MoveController.so AgentController.so
Makefile
#SIGVerseソースの場所指定 SIG_SRC = ../../include/sigverse #オブジェクトファイルの指定 OBJS = MoveController.so AgentController.so all: $(OBJS) #コンパイルを行います。 ./%.so: ./%.cpp g++ -DCONTROLLER -DNDEBUG -DUSE_ODE -DdDOUBLE -I$(SIG_SRC) -I$(SIG_SRC)/comm/controller -fPIC -shared -o $@ $<
コンパイルします。
$ make
次に世界ファイルを作成します。
$ cd ~/sigverse-<version>/bin $ ln -s ../share/sigverse/data/xml/ xml
xmlファイルがあるディレクトリまで遠いのでリンクを貼りました。
$ emacs xml/AgentWorld.xml
AgentWorld.xml
エージェントとしてMan-nii.xmlを読み込むように設定し、動力学演算をfalseにしました。動力学演算をtrueにするとエージェントの関節角度などを直接指定することができないので注意が必要です。
それではSIGVerseを起動してみましょう。
$ ./sigserver.sh -w AgentWorld.xml -p 9001
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からのメッセージを送信することによりエージェントがお辞儀をするようなサンプルコードを紹介します。
新しくコントローラを作成します。
$ cd NewWorld $ emacs AgentController2.cpp
AgetnController2.cpp
onActionで手を下げ、メッセージを受信したときに呼び出される関数onRecvMessageを追加しました。メッセージが"Hello"だったときにお辞儀をします。
Makefileに作成したコントローラを追加してコンパイルします。
$ make
次に世界ファイルAgentWorld.xmlでコントローラを読み込んでいる個所をAgentContoroller2.soに修正します。
↓
それでは実行してみましょう。
$ cd .. $ ./sigserver.sh -w AgentWorld.xml -p 9001
SIGViewerで接続して、 "Connect"ボタンをクリックしてシミュレーションを開始すると、まずonActionが呼び出されて右手と左手を下に下げます。
まずSIGViewerの右下にあるMessageボタンをクリックします。 するとSendMessageトレイが現れます。TargetEntityでメッセージを送信するターゲット"man_000"を選択します。次にMessage:のところで"Hello"と入力します。
入力が完了したら、"Send"ボタンを押します。
お辞儀をしました。
関節の回転はクオータニオンによって設定することもできます。
関節回転箇所を以下のように修正します。
AgentController.cpp
↓
setJointQuaternionという関数を使って関節のクオータニオンを設定します。引数で関節名の次にクオータニオンのw,x,y,z成分を指定します。
クオータニオンを指定した場合はあらかじめ設定されている関節の回転軸に関係なく回転します。 正常に関節が回転するか確認してみてください。
Up:Tutorial? Previous:動力学シミュレーションのサンプル Next:エージェント間のメッセージのやりとり
English version?