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起動

それではSIGVerseを起動してみましょう。

$ ./sigserver.sh -w AgentWorld.xml -p 9001

SIGViewerを起動して見てみると人間のエージェントが手を広げてスタンバイしていると思います。 シミュレーションを開始するとエージェントの左腕が45°上がります。

man_1.PNG

今回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

AgentController2.cpp

onActionで手を下げ、メッセージを受信したときに呼び出される関数onRecvMessageを追加しました。メッセージが"Hello"だったときにお辞儀をします。

Makefileに作成したコントローラを追加してコンパイルします。

$ make

世界ファイル

次に世界ファイルAgentWorld.xmlでコントローラを読み込んでいる個所をAgentContoroller2.soに修正します。

       ↓

実行

それでは実行してみましょう。

$ cd ..
$ ./sigserver.sh -w AgentWorld.xml -p 9001

SIGViewerで接続して、 "Connect"ボタンをクリックしてシミュレーションを開始すると、まずonActionが呼び出されて右手と左手を下に下げます。

man_2.PNG

メッセージ送信

まずSIGViewerの右下にあるMessageボタンをクリックします。 するとSendMessageトレイが現れます。TargetEntityでメッセージを送信するターゲット"man_000"を選択します。次にMessage:のところで"Hello"と入力します。

man_3.PNG

入力が完了したら、"Send"ボタンを押します。

man_4.PNG

お辞儀をしました。

クオータニオンによる関節の回転

関節の回転はクオータニオンによって設定することもできます。

関節回転箇所を以下のように修正します。

AgentController.cpp

   ↓

setJointQuaternionという関数を使って関節のクオータニオンを設定します。引数で関節名の次にクオータニオンのw,x,y,z成分を指定します。

クオータニオンを指定した場合はあらかじめ設定されている関節の回転軸に関係なく回転します。 正常に関節が回転するか確認してみてください。

Old version

Up:Tutorial?     Previous:動力学シミュレーションのサンプル     Next:エージェント間のメッセージのやりとり?

English version?


Attach file: fileman_4.PNG 2959 download [Information] fileman_3.PNG 2866 download [Information] fileman_2.PNG 2941 download [Information] fileman_1.PNG 2908 download [Information]

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2012-10-31 (Wed) 18:35:44 (4185d)