Up:Tutorial? Previous:エージェントの衝突 Next:BVHファイルの読み込み
ここではロボット型エージェントが物体を持つ動作をするサンプルを紹介します。
物体を持って移動するコントローラを作成します。
$ cd sigverse-<version>/bin/NewWorld $ emacs grasp.cpp
grasp.cpp
これはエージェントがエンティティに触れる(衝突)するとその触れたエンティティをつかむというサンプルです。
エージェントに"move"のメッセージを送信すると前に進み、"rotation"を送信すると体の向きを変えます。 また、"「関節名」 「角度」"というメッセージを送信するとエージェントは関節を指定した角度に曲げます。
例) 腰の関節をx軸(エージェント座標)を中心に45°曲げる場合は"WAIST_JOINT1 45"と送信します。JOINT名の定義はこちらを参照ください。
このサンプルではGraspという関数を新しく作成しました。この関数の1番目の引数に物体をつかむパーツの名前(右手の場合はRARM_LINK7、左手の場合はLARM_LINK7)、2番目の引数に掴む対象となるエンティティの名前を指定します。一度掴むとgraspフラグがtrueとなり、エージェントが移動しても手から離れません。
エージェントに"release"というメッセージを送信するとエージェントは掴んでいる物体を離します。
Makefileの変数OBJSにgrasp.soを追加してコンパイルします。
次に世界ファイルを作成します。視覚に関する操作で使った世界ファイルとほぼ同じものを使います。
$ cd .. $ emacs xml/grasp.xml
grasp.xml
それでは実行してみましょう。
$ ./sigserver.sh -p 9001 -w xml/grasp.xml
SIGViewerでシミュレーションサーバに接続してシミュレーションを開始します。 "move" "rotation" "関節名 角度"等のメッセージを送信するとエージェントは移動したり関節を曲げたりすることができます。これらを組み合わせて右手で何かエンティティに触れてみてください。 エージェントは物体を掴みます。
※衝突判定は物理演算用の単純形状で行っているため、見た目は衝突しているのになかなかgraspできない場合があります。
#ref(): File not found: "grasp_1.PNG" at page "物体を持つ動作_v2.1.0"
(※注意)SIGViewerで使われているGUIが日本語キーボードに対応していないため、アンダースコアを入力できないことがあります。その場合はwindowsのキーボードの設定を英語に設定しておくと入力できるようになります。
#ref(): File not found: "key_1.PNG" at page "物体を持つ動作_v2.1.0"
そして一度掴んだら移動したり関節を曲げたりしても手を離さないことを確認してください。
#ref(): File not found: "grasp_2.PNG" at page "物体を持つ動作_v2.1.0"
最後に離したい場所でメッセージ"release"を送信して手を離します。
#ref(): File not found: "grasp_3.PNG" at page "物体を持つ動作_v2.1.0"
エージェントが移動したり、手を動かしたりしても掴んだオブジェクトは付いてこなくなります。
Up:Tutorial? Previous:エージェントの衝突 Next:BVHファイルの読み込み