Up:Tutorial?    Previous:BVHファイルの読み込み?     Next: ロボット・ダイナミクス(ヒューマノイド)  

ロボット・ダイナミクス

ここでは関節を持ったオブジェクトの物理シミュレーションを行うサンプルを紹介します。(バージョン110418以降で正常に動作)

単純モデル

モデルの作成

SIGVerseのロボットモデルはOpenHRP形式で記述されています。ここでは簡単なモデルを作成してみます。

まずロボットの形状モデルなどが置かれたディレクトリに移動し、以下のファイルを作成します。

$ cd ~/sigverse-<version>/share/sigverse/data/shape/
$ emacs robot_test.x3d

robot_test.x3d

OpenHRP形式のロボットはプロト宣言部と実モデル定義部からなります。実モデル定義部でロボットを組み立てます。OpenHRP形式のモデルの作成方法は詳しくはOpenHRP3 モデル作成法を参照ください。

このサンプルは2つの棒を関節で接続したモデルです。

同じ形状ファイルをクライアント側のSIGViewerのインストール先に置きます。

※形状ファイルにコメント部分があるとクライアント側で正常に読み込まれない場合があるので、クライアント側ではコメントを削除するようにしてください。

Jointの親子関係

作成したモデルのJointの親子関係は以下のようになっています。

   Humanoid sample(モデルのルート)
    + Joint JOINT0 (ルートジョイント、3軸における位置、回転の6つの自由度をもつ)
     + Joint JOINT1 :Segment LINK1 (固定ジョイント、自由度0)
       + Joint JOINT2 :Segment LINK2(ヒンジジョイント、自由度1)

Jointの回転や移動に伴い、そのJointに付随するSegmentや子ジョイントが回転および移動を行います。 このモデルではLINK1とLINK2がJOINT2によって接続されています。

bou_2.jpg

設定ファイル

まずエージェント設定ファイルを作成します。

$ cd ../xml
$ emacs robot_test.xml

robot_test.xml

次に世界ファイルを作成します。

$ emacs DynamicsWorld.xml

DynamicsWorld.xml

ダイナミクスをtrueに設定しました。

実行

まずはコントローラなしで実行してみましょう。

$ cd ~/sigverse-<version>/bin
$ ./sigserver.sh -p 9001 -w DynamicsWorld.xml

viewerで接続し、シミュレーションを開始してみると初めは棒がまっすぐ立っていますが、しばらくすると重力の影響で関節が曲がって倒れます。

bou_3.jpg

コントローラ

次に関節にトルクを加えるコントローラを作成します。

$ cd NewWorld
$ emacs DynamicsController.cpp

DynamicsController.cpp

addJointTorqueでヒンジジョイントにトルクを加えます。最初の引数で関節名、2番目の引数で加えるトルク[Nm]を指定します。 このコントローラでは500[Nm]のトルクを"JOINT2"に1秒おきに加えます。

Makefileを修正してコンパイルします。

$ emacs Makefile

オブジェクトファイルDynamicsController.soを指定

#オブジェクトファイルの指定
OBJS     = DynamicsController.so
$ make

世界ファイル修正

次に作成したコントローラを世界ファイルで指定します。

$ cd ..
$ emacs xml/DynamicsWorld.xml

以下の一行を加えます。

        <set-attr-value name="implementation" value="./NewWorld/DynamicsController.so"/>

DynamicsWorld.xml

実行

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

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

viewerで見てみると先ほどは重力の影響でゆっくり関節が曲がっていましたが、今回はトルクを加えたため、シミュレーション開始と同時に関節が勢いよく曲がります。トルクは定期的にくわえられていくため、しばらくすると棒の動きの激しさが増します。

bou_5.jpg

関節の角速度の設定

先ほどはコントローラで関節にトルクを加えました。次は関節の角速度を設定します。

$ cd NewWorld
$ emacs DynamicsController.cpp

先ほどトルクを加えた部分を以下のように修正します。

DynamicsController.cpp

    ↓

setJointVelocityで関節の角速度を設定します。最初の引数は関節名、2番目の引数は角速度[rad/s]、3番目の引数は指定した角速度に到達するまでに加える最大トルク[Nm]を指定します。

最大トルクに大きい値を指定すると指定した角速度に早く到達します。

それではコンパイルして実行してみましょう。

$ make
$ cd ..
$ ./sigserver.sh -p 9001 -w DynamicsWorld.xml
bou_4.jpg

棒が地面に倒れても関節は一定の速度で回転し続けようとします。

Up:Tutorial?    Previous:BVHファイルの読み込み?     Next: ロボット・ダイナミクス(ヒューマノイド)  


Attach file: filebou_5.jpg 1198 download [Information] filebou_4.jpg 1238 download [Information] filebou_3.jpg 1215 download [Information] filebou_2.jpg 1382 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-03-22 (Thu) 15:13:35 (4411d)