Up:Tutorial? Previous:BVHファイルの読み込み Next: ロボット・ダイナミクス(ヒューマノイド) ロボット・ダイナミクス †※このチュートリアルはSIGVerse v2.1.0以降で動作します。 ここでは関節を持ったオブジェクトの物理シミュレーションを行うサンプルを紹介します。 単純モデル †モデルの作成 †SIGVerseのロボットモデルはOpenHRP形式で記述されています。ここでは簡単なモデルを作成してみます。 まずSIGVerse作業ディレクトリに移動し、以下のファイルを作成します。 $ cd ~/MyWorld $ emacs robot_test.x3d robot_test.x3d OpenHRP形式のロボットはプロト宣言部と実モデル定義部からなります。実モデル定義部でロボットを組み立てます。OpenHRP形式のモデルの作成方法は詳しくはOpenHRP3 モデル作成法を参照ください。 このサンプルは2つの棒を関節で接続したモデルです。 Jointの親子関係 †作成したモデルのJointの親子関係は以下のようになっています。 Humanoid sample(モデルのルート) + Joint JOINT0 (ルートジョイント、3軸における位置、回転の6つの自由度をもつ) + Joint JOINT1 :Segment LINK1 (固定ジョイント、自由度0) + Joint JOINT2 :Segment LINK2(ヒンジジョイント、自由度1) Jointの回転や移動に伴い、そのJointに付随するSegmentや子ジョイントが回転および移動を行います。 このモデルではLINK1とLINK2がJOINT2によって接続されています。 設定ファイル †まずエージェント設定ファイルを作成します。 $ emacs robot_test.xml robot_test.xml 次に世界ファイルを作成します。 $ emacs DynamicsWorld.xml DynamicsWorld.xml ダイナミクスをtrueに設定しました。 実行 †まずはコントローラなしで実行してみましょう。 $ sigserver.sh -w ./DynamicsWorld.xml ビューワーで接続して見ると棒が見えます。 次に右下のトレイにあるEntity Dataをクリックして棒をクリックします。 関節やパーツの位置情報を確認することができます。 赤色のドットで示されているのがエンティティの位置になります。 エンティティの位置はルートジョイントの位置となります。 青色が関節の位置、緑色がパーツ(Segment)の位置となります。 シミュレーションを開始してみると初めは棒がまっすぐ立っていますが、しばらくすると重力の影響で関節が曲がって倒れます。 コントローラ †次に関節にトルクを加えるコントローラを作成します。 $ emacs DynamicsController.cpp DynamicsController.cpp addJointTorqueでヒンジジョイントにトルクを加えます。最初の引数で関節名、2番目の引数で加えるトルク[N・cm]を指定します。 このコントローラでは500[Nm]のトルクを"JOINT2"に1秒おきに加えます(0.01秒間)。 コンパイルします。 $ ./sigmake.sh DynamicsController.cpp 世界ファイル修正 †次に作成したコントローラを世界ファイルで指定します。 $ emacs DynamicsWorld.xml 以下の一行を加えます。 <set-attr-value name="implementation" value="./DynamicsController.so"/> DynamicsWorld.xml 実行 †それでは実行してみましょう。 $ sigserver.sh -w ./DynamicsWorld.xml viewerで見てみると先ほどは重力の影響でゆっくり関節が曲がっていましたが、今回はトルクを加えたため、シミュレーション開始と同時に関節が勢いよく曲がります。地面でのたうちまわります。 関節の角速度の設定 †先ほどはコントローラで関節にトルクを加えました。次は関節の角速度を設定します。 $ emacs DynamicsController.cpp 先ほどトルクを加えた部分を以下のように修正します。 DynamicsController.cpp ↓ setJointVelocityで関節の角速度を設定します。最初の引数は関節名、2番目の引数は角速度[rad/s]、3番目の引数は指定した角速度に到達するまでに加える最大トルク[N・cm]を指定します。 最大トルクに大きい値を指定すると指定した角速度に早く到達します。 それではコンパイルして実行してみましょう。 $ ./sigmake.sh DynamicsController.cpp $ sigserver.sh -w ./DynamicsWorld.xml 棒が地面に倒れても関節は一定の速度で回転し続けようとします。 Old Version †Up:Tutorial? Previous:BVHファイルの読み込み Next: ロボット・ダイナミクス(ヒューマノイド)
Counter: 3122,
today: 1,
yesterday: 1
|