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"というメッセージを送信するとエージェントは掴んでいる物体を離します。 コンパイル †コンパイルします。 $ emacs Makefile オブジェクトファイルgrasp.soを指定 #オブジェクトファイルの指定 OBJS = grasp.so $ make 世界ファイル作成 †次に世界ファイルを作成します。視覚に関する操作で使った世界ファイルとほぼ同じものを使います。 $ cd .. $ emacs xml/grasp.xml grasp.xml 実行 †それでは実行してみましょう。 $ ./sigserver.sh -p 9001 -w xml/grasp.xml SIGViewerでシミュレーションサーバに接続してシミュレーションを開始します。 "move" "rotation" "関節名=角度"等のメッセージを送信するとエージェントは移動したり関節を曲げたりすることができます。これらを組み合わせて右手で何かエンティティに触れてみてください。 エージェントは物体を掴みます。 ※衝突判定は物理演算用の単純形状で行っているため、見た目は衝突しているのになかなかgraspできない場合があります。 そして一度掴んだら移動したり関節を曲げたりしても手を離さないことを確認してください。 次に掴んだエンティティを移動したい場所に運びます。 最後に離したい場所でメッセージ"release"を送信して手を離します。 エージェントが移動したり、手を動かしたりしても掴んだクマのぬいぐるみはついてこなくなります。 Up:Tutorial? Previous:エージェントの衝突 Next:BVHファイルの読み込み |