- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
[[Tutorial]]
*ロボット・ダイナミクス [#j7cc4426]
ここでは関節を持ったオブジェクトのダイナミクスシミュレーションを行うサンプルを紹介します。
**モデルの作成 [#f84e822a]
SIGVerseのロボットモデルはOpenHRP形式で記述されています。ここでは簡単なモデルを作成してみます。
まずロボットの形状モデルなどが置かれたディレクトリに移動し、以下のファイルを作成します。
$ cd ~/sigverse-<version>/share/data/shape/
$ emacs robot_test.x3d
<?xml version="1.0" encoding="UTF-8"?>
<X3D profile="Immersive" version="3.0">
<Scene>
<!--************PROTO宣言部***********-->
<ProtoDeclare name='Joint' >
<ProtoInterface>
<field accessType='inputOutput' type='SFVec3f' name='center' value='0.0 0.0 0.0' />
<field accessType='inputOutput' type='MFNode' name='children' />
<field accessType='inputOutput' type='MFFloat' name='llimit' />
<field accessType='inputOutput' type='SFRotation' name='limitOrientation' value='0.0 0.0 1.0 0.0' />
<field accessType='inputOutput' type='SFString' name='name' value='' />
<field accessType='inputOutput' type='SFRotation' name='rotation' value='0.0 0.0 1.0 0.0' />
<field accessType='inputOutput' type='SFVec3f' name='scale' value='1.0 1.0 1.0' />
<field accessType='inputOutput' type='SFRotation' name='scaleOrientation' value='0.0 0.0 1.0 0.0' />
<field accessType='inputOutput' type='MFFloat' name='stiffness' value='0.0 ,0.0 ,0.0' />
<field accessType='inputOutput' type='SFVec3f' name='translation' value='0.0 0.0 0.0' />
<field accessType='inputOutput' type='MFFloat' name='ulimit' />
<field accessType='inputOutput' type='MFFloat' name='dh' value='0.0 ,0.0 ,0.0 ,0.0' />
<field accessType='inputOutput' type='SFString' name='jointType' value='' />
<field accessType='inputOutput' type='SFFloat' name='jointId' value='-1.0' />
<field accessType='inputOutput' type='SFVec3f' name='jointAxis' value='1.0 0.0 0.0' />
</ProtoInterface>
<ProtoBody>
<Transform>
<IS>
<connect nodeField='children' protoField='children' />
<connect nodeField='center' protoField='center' />
<connect nodeField='rotation' protoField='rotation' />
<connect nodeField='scale' protoField='scale' />
<connect nodeField='scaleOrientation' protoField='scaleOrientation' />
<connect nodeField='translation' protoField='translation' />
</IS>
</Transform>
</ProtoBody>
</ProtoDeclare>
<ProtoDeclare name='Segment' >
<ProtoInterface>
<field accessType='initializeOnly' type='SFVec3f' name='bboxCenter' value='0.0 0.0 0.0' />
<field accessType='initializeOnly' type='SFVec3f' name='bboxSize' value='-1.0 -1.0 -1.0' />
<field accessType='inputOutput' type='SFVec3f' name='centerOfMass' value='0.0 0.0 0.0' />
<field accessType='inputOutput' type='MFNode' name='children' />
<field accessType='inputOutput' type='SFNode' name='coord' />
<field accessType='inputOutput' type='MFNode' name='displacers' />
<field accessType='inputOutput' type='SFFloat' name='mass' value='0.0' />
<field accessType='inputOutput' type='MFFloat' name='momentsOfInertia' value='0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,0.0' />
<field accessType='inputOutput' type='SFString' name='name' value='' />
<field accessType='inputOnly' type='MFNode' name='addChildren' />
<field accessType='inputOnly' type='MFNode' name='removeChildren' />
</ProtoInterface>
<ProtoBody>
<Group>
<IS>
<connect nodeField='children' protoField='children' />
<connect nodeField='addChildren' protoField='addChildren' />
<connect nodeField='removeChildren' protoField='removeChildren' />
<connect nodeField='bboxCenter' protoField='bboxCenter' />
<connect nodeField='bboxSize' protoField='bboxSize' />
</IS>
</Group>
</ProtoBody>
</ProtoDeclare>
<ProtoDeclare name='Humanoid' >
<ProtoInterface>
<field accessType='initializeOnly' type='SFVec3f' name='bboxCenter' value='0.0 0.0 0.0' />
<field accessType='initializeOnly' type='SFVec3f' name='bboxSize' value='-1.0 -1.0 -1.0' />
<field accessType='inputOutput' type='SFVec3f' name='center' value='0.0 0.0 0.0' />
<field accessType='inputOutput' type='MFNode' name='humanoidBody' />
<field accessType='inputOutput' type='MFString' name='info' />
<field accessType='inputOutput' type='MFNode' name='joints' />
<field accessType='inputOutput' type='SFString' name='name' value='' />
<field accessType='inputOutput' type='SFRotation' name='rotation' value='0.0 0.0 1.0 0.0' />
<field accessType='inputOutput' type='SFVec3f' name='scale' value='1.0 1.0 1.0' />
<field accessType='inputOutput' type='SFRotation' name='scaleOrientation' value='0.0 0.0 1.0 0.0' />
<field accessType='inputOutput' type='MFNode' name='segments' />
<field accessType='inputOutput' type='MFNode' name='sites' />
<field accessType='inputOutput' type='SFVec3f' name='translation' value='0.0 0.0 0.0' />
<field accessType='inputOutput' type='SFString' name='version' value='1.0' />
<field accessType='inputOutput' type='MFNode' name='viewpoints' />
</ProtoInterface>
<ProtoBody>
<Transform>
<IS>
<connect nodeField='bboxCenter' protoField='bboxCenter' />
<connect nodeField='bboxSize' protoField='bboxSize' />
<connect nodeField='center' protoField='center' />
<connect nodeField='rotation' protoField='rotation' />
<connect nodeField='scale' protoField='scale' />
<connect nodeField='scaleOrientation' protoField='scaleOrientation' />
<connect nodeField='translation' protoField='translation' />
</IS>
<Group>
<IS>
<connect nodeField='children' protoField='viewpoints' />
</IS>
</Group>
<Group>
<IS>
<connect nodeField='children' protoField='humanoidBody' />
</IS>
</Group>
</Transform>
</ProtoBody>
</ProtoDeclare>
<!--************実モデル定義部************-->
<ProtoInstance name='Humanoid' DEF="HRP1" containerField='children'>
<fieldValue name='info' value='"Test Joint"' />
<fieldValue name='name' value='sample' />
<fieldValue name='version' value='1.1' />
<!--ROOTジョイント この関節が回転すると体全体が回転 -->
<ProtoInstance name='Joint' DEF="JOINT0" containerField='humanoidBody'>
<fieldValue name='name' value='JOINT0' />
<!--関節の種類free 自由度6(位置と姿勢) -->
<fieldValue name='jointType' value='free' />
<fieldValue name='jointId' value='1.0' />
<!--モーメント-->
<fieldValue name='momentsOfInertia' value='1.0 ,0.0 ,0.0 ,0.0 ,1.0 ,0.0 ,0.0 ,0.0 ,1.0' />
<!--JOINT1(JOINT0の子ジョイント)-->
<ProtoInstance name='Joint' DEF="JOINT1" containerField='children'>
<fieldValue name='name' value='JOINT1' />
<!--固定された関節-->
<fieldValue name='jointType' value='fixed' />
<fieldValue name='jointId' value='1.1' />
<fieldValue name='momentsOfInertia' value='1.0 ,0.0 ,0.0 ,0.0 ,1.0 ,0.0 ,0.0 ,0.0 ,1.0' />
<!--LINK0(JOINT1に付随したリンク)-->
<ProtoInstance name='Segment' DEF="LINK0" containerField='children'>
<fieldValue name='name' value='LINK0' />
<!--質量の中心-->
<fieldValue name='centerOfMass' value='0.0 1.0 0.0' />
<fieldValue name='bboxSize' value='5.0 5.0 5.0' />
<!--質量-->
<fieldValue name='mass' value='27.0' />
<fieldValue name='jointId' value='2.0' />
<fieldValue name='momentsOfInertia' value='1.0 ,0.0 ,0.0 ,0.0 ,1.0 ,0.0 ,0.0 ,0.0 ,1.0' />
<Transform>
<!--LINK0の形状(JOINT1に付随)-->
<Shape>
<Appearance>
<ImageTexture url="tumiki_moku.jpg"/>
</Appearance>
<IndexedFaceSet DEF="link1" coordIndex="0 3 2 1 -1 4 5 6 7 -1 4 0 1 5 -1 5 1 2 6 -1 6 2 3 7 -1 7 3 0 4 -1" texCoordIndex="0 1 2 3 -1 0 1 2 3 -1 0 1 2 3 -1 0 1 2 3 -1 0 1 2 3 -1 0 1 2 3 -1" solid="false">
<TextureCoordinate point="0.0 0.0, 0.0 1.0, 1.0 1.0, 1.0 0.0," />
<Coordinate DEF="Coaster_c01GeoPoints" point="-1.0 0.0 -1.0, 1.0 0.0 -1.0, 1.0 0.0 1.0, -1.0 0.0 1.0, -1.0 10.0 -1.0, 1.0 10.0 -1.0, 1.0 10.0 1.0, -1.0 10.0 1.0," />
</IndexedFaceSet>
</Shape>
</Transform>
</ProtoInstance>
<!--JOINT2(JOINT1の子ジョイント)-->
<ProtoInstance name='Joint' DEF="JOINT2" containerField='children'>
<fieldValue name='name' value='JOINT2' />
<!--JOINT2のJOINT1からの位置-->
<fieldValue name='translation' value='0.0 10.5 0.1' />
<!--回転軸(1.0,0.0,0.0)を中心に回転 -->
<fieldValue name='jointType' value='rotate' />
<fieldValue name='jointAxis' value='1.0 0.0 0.0' />
<fieldValue name='jointId' value='2.0' />
<!--JOINT2に付随したリンク-->
<ProtoInstance name='Segment' DEF="LINK1" containerField='children'>
<fieldValue name='name' value='LINK1' />
<fieldValue name='centerOfMass' value='0.0 1.0 0.0' />
<fieldValue name='mass' value='27.0' />
<fieldValue name='jointId' value='3.0' />
<fieldValue name='momentsOfInertia' value='1.0 ,0.0 ,0.0 ,0.0 ,1.0 ,0.0 ,0.0 ,0.0 ,1.0' />
<Transform >
<Shape>
<Appearance>
<ImageTexture url="tumiki_moku.jpg"/>
</Appearance>
<IndexedFaceSet USE="link1"/>
</Shape>
</Transform>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</Scene>
</X3D>
OpenHRP形式のロボットはプロト宣言部と実モデル定義部からなります。実モデル定義部でロボットを組み立てます。OpenHRP形式のモデルの作成方法は詳しくは[[OpenHRP3 モデル作成法>http://www.openrtp.jp/openhrp3/3.0.2/jp/create_model.html]]を参照ください。
**Jointの親子関係 [#fed078fe]
Jointの親子関係は以下のようになっています。