ロボット・ダイナミクス(単純モデル) v120330 v1.4.8
[
Front page
] [
New
|
List of pages
|
Search
|
Recent changes
|
Help
]
Start:
Up:[[Tutorial]] Previous:[[BVHファイルの読み込み]]...
#contents
*ロボット・ダイナミクス [#j7cc4426]
ここでは関節を持ったオブジェクトの物理シミュレーションを...
**単純モデル [#f84e822a]
***モデルの作成 [#q02438d0]
SIGVerseのロボットモデルはOpenHRP形式で記述されています。...
まずロボットの形状モデルなどが置かれたディレクトリに移動...
$ cd ~/sigverse-<version>/share/sigverse/data/shape/
$ emacs robot_test.x3d
robot_test.x3d
#highlight(xml){{
<?xml version="1.0" encoding="UTF-8"?>
<X3D profile="Immersive" version="3.0">
<Scene>
<!--************PROTO宣言部***********-->
<ProtoDeclare name='Joint' >
<ProtoInterface>
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='MFFloat' na...
<field accessType='inputOutput' type='SFRotation'...
<field accessType='inputOutput' type='SFString' n...
<field accessType='inputOutput' type='SFRotation'...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='SFRotation'...
<field accessType='inputOutput' type='MFFloat' na...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='MFFloat' na...
<field accessType='inputOutput' type='MFFloat' na...
<field accessType='inputOutput' type='SFString' n...
<field accessType='inputOutput' type='SFFloat' na...
<field accessType='inputOutput' type='SFVec3f' na...
</ProtoInterface>
<ProtoBody>
<Transform>
<IS>
<connect nodeField='children' protoField='chi...
<connect nodeField='center' protoField='cente...
<connect nodeField='rotation' protoField='rot...
<connect nodeField='scale' protoField='scale'...
<connect nodeField='scaleOrientation' protoFi...
<connect nodeField='translation' protoField='...
</IS>
</Transform>
</ProtoBody>
</ProtoDeclare>
<ProtoDeclare name='Segment' >
<ProtoInterface>
<field accessType='initializeOnly' type='SFVec3f'...
<field accessType='initializeOnly' type='SFVec3f'...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='SFNode' nam...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='SFFloat' na...
<field accessType='inputOutput' type='MFFloat' na...
<field accessType='inputOutput' type='SFString' n...
<field accessType='inputOnly' type='MFNode' name=...
<field accessType='inputOnly' type='MFNode' name=...
</ProtoInterface>
<ProtoBody>
<Group>
<IS>
<connect nodeField='children' protoField='ch...
<connect nodeField='addChildren' protoField=...
<connect nodeField='removeChildren' protoFie...
<connect nodeField='bboxCenter' protoField='...
<connect nodeField='bboxSize' protoField='bb...
</IS>
</Group>
</ProtoBody>
</ProtoDeclare>
<ProtoDeclare name='Humanoid' >
<ProtoInterface>
<field accessType='initializeOnly' type='SFVec3f'...
<field accessType='initializeOnly' type='SFVec3f'...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='MFString' n...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='SFString' n...
<field accessType='inputOutput' type='SFRotation'...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='SFRotation'...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='SFString' n...
<field accessType='inputOutput' type='MFNode' nam...
</ProtoInterface>
<ProtoBody>
<Transform>
<IS>
<connect nodeField='bboxCenter' protoField='b...
<connect nodeField='bboxSize' protoField='bbo...
<connect nodeField='center' protoField='cente...
<connect nodeField='rotation' protoField='rot...
<connect nodeField='scale' protoField='scale'...
<connect nodeField='scaleOrientation' protoFi...
<connect nodeField='translation' protoField='...
</IS>
<Group>
<IS>
<connect nodeField='children' protoField='v...
</IS>
</Group>
<Group>
<IS>
<connect nodeField='children' protoField='h...
</IS>
</Group>
</Transform>
</ProtoBody>
</ProtoDeclare>
<!--************実モデル定義部************-->
<ProtoInstance name='Humanoid' DEF="HRP1" containe...
<fieldValue name='info' value='"Test Joint"' />
<fieldValue name='name' value='sample' />
<fieldValue name='version' value='1.1' />
<!--ROOTジョイント この関節が回転すると体全体が回転 ...
<ProtoInstance name='Joint' DEF="JOINT0" containerF...
<fieldValue name='name' value='JOINT0' />
<!--関節の種類free 自由度6(位置と姿勢) -->
<fieldValue name='jointType' value='free' />
<fieldValue name='jointId' value='1.0' />
<!--JOINT1(JOINT0の子ジョイント)-->
<ProtoInstance name='Joint' DEF="JOINT1" contain...
<fieldValue name='name' value='JOINT1' />
<fieldValue name='jointId' value='2.0' />
<!--固定された関節-->
<fieldValue name='jointType' value='fixed' />
<!--LINK0(JOINT1に付随したリンク)-->
<ProtoInstance name='Segment' DEF="LINK1" c...
<fieldValue name='name' value='LINK1' />
<fieldValue name='mass' value='1.0' />
<Transform>
<Shape>
<!--テクスチャ-->
<Appearance>
<ImageTexture url="tumiki_moku.jpg"/>
</Appearance>
<!--LINK0の形状(JOINT1に付随)-->
<IndexedFaceSet DEF="link1" coordIndex="0...
<TextureCoordinate point="0.0 0.0, 0.0 ...
<Coordinate DEF="Coaster_c01GeoPoints" ...
</IndexedFaceSet>
</Shape>
</Transform>
</ProtoInstance>
<!--JOINT2(JOINT1の子ジョイント)-->
<ProtoInstance name='Joint' DEF="JOINT2" conta...
<fieldValue name='name' value='JOINT2' />
<!--JOINT2のJOINT1からの位置-->
<fieldValue name='translation' value='0.0 5.0...
<!--ヒンジジョイント -->
<fieldValue name='jointType' value='rotate' />
<!--回転軸 -->
<fieldValue name='jointAxis' value='1.0 0.0 0...
<fieldValue name='jointId' value='3.0' />
<!--JOINT2に付随したリンク-->
<ProtoInstance name='Segment' DEF="LINK2" c...
<fieldValue name='name' value='LINK2' />
<!--LINK2の位置(JOINT2からの位置)-->
<fieldValue name='centerOfMass' value='0.0 ...
<fieldValue name='mass' value='1.0' />
<Transform>
<Shape>
<Appearance>
<ImageTexture url="tumiki_moku.jpg"/>
</Appearance>
<IndexedFaceSet USE="link1"/>
</Shape>
</Transform>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</Scene>
</X3D>
}}
OpenHRP形式のロボットはプロト宣言部と実モデル定義部からな...
このサンプルは2つの棒を関節で接続したモデルです。
同じ形状ファイルをクライアント側のSIGViewerのインストール...
※形状ファイルにコメント部分があるとクライアント側で正常に...
***Jointの親子関係 [#fed078fe]
作成したモデルのJointの親子関係は以下のようになっています。
Humanoid sample(モデルのルート)
+ Joint JOINT0 (ルートジョイント、3軸における位置、...
+ Joint JOINT1 :Segment LINK1 (固定ジョイント、自由...
+ Joint JOINT2 :Segment LINK2(ヒンジジョイント、...
Jointの回転や移動に伴い、そのJointに付随するSegmentや子ジ...
このモデルではLINK1とLINK2がJOINT2によって接続されていま...
#ref(bou_2.jpg)
***設定ファイル [#e3db8144]
まずエージェント設定ファイルを作成します。
$ cd ../xml
$ emacs robot_test.xml
robot_test.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<define-class name="robot_test" inherit="Agent.xml">
<x3d>
<!--先ほど作成したモデルの読み込み-->
<filename>robot_test.x3d</filename>
</x3d>
</define-class>
}}
次に世界ファイルを作成します。
$ emacs DynamicsWorld.xml
DynamicsWorld.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<world name="myworld11">
<gravity x="0.0" y="-9.8" z="0.0"/>
<instanciate class="robot_test.xml">
<set-attr-value name="name" value="robot_test"/>
<!--dynamics true-->
<set-attr-value name="dynamics" value="true"/>
<set-attr-value name="x" value="5.0"/>
<set-attr-value name="y" value="5.0"/>
<set-attr-value name="z" value="5.0"/>
<set-attr-value name="language" value="c++"/>
</instanciate>
</world>
}}
ダイナミクスをtrueに設定しました。
***実行 [#l4c076b6]
まずはコントローラなしで実行してみましょう。
$ cd ~/sigverse-<version>/bin
$ ./sigserver.sh -p 9001 -w DynamicsWorld.xml
viewerで接続し、シミュレーションを開始してみると初めは棒...
#ref(bou_3.jpg)
***コントローラ [#u4ff78dd]
次に関節にトルクを加えるコントローラを作成します。
$ cd NewWorld
$ emacs DynamicsController.cpp
DynamicsController.cpp
#highlight(cpp){{
DynamicsController.cpp
#include "Controller.h"
class MoveController : public Controller {
public:
double onAction(ActionEvent&);
};
double MoveController::onAction(ActionEvent &evt) {
SimObj *my = getObj(myname());
//JOINT2にトルクを加えます。
my->addJointTorque("JOINT2",500.0);
return 1.0;
}
extern "C" Controller * createController() {
return new MoveController;
}
}}
addJointTorqueでヒンジジョイントにトルクを加えます。最初...
このコントローラでは500[Nm]のトルクを"JOINT2"に1秒おきに...
Makefileを修正してコンパイルします。
$ emacs Makefile
オブジェクトファイルDynamicsController.soを指定
#オブジェクトファイルの指定
OBJS = DynamicsController.so
$ make
***世界ファイル修正 [#ua9e7301]
次に作成したコントローラを世界ファイルで指定します。
$ cd ..
$ emacs xml/DynamicsWorld.xml
以下の一行を加えます。
<set-attr-value name="implementation" value="./N...
DynamicsWorld.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<world name="myworld">
<gravity x="0.0" y="-9.8" z="0.0"/>
<instanciate class="robot_test.xml">
<set-attr-value name="name" value="robot_test"/>
<!--dynamics true-->
<set-attr-value name="dynamics" value="true"/>
<set-attr-value name="x" value="5.0"/>
<set-attr-value name="y" value="5.0"/>
<set-attr-value name="z" value="5.0"/>
<set-attr-value name="language" value="c++"/>
<set-attr-value name="implementation" value="./N...
</instanciate>
</world>
}}
***実行 [#hf6ef7e6]
それでは実行してみましょう。
$ ./sigserver.sh -p 9001 -w DynamicsWorld.xml
viewerで見てみると先ほどは重力の影響でゆっくり関節が曲が...
#ref(bou_5.jpg)
***関節の角速度の設定 [#oa8d06b1]
先ほどはコントローラで関節にトルクを加えました。次は関節...
$ cd NewWorld
$ emacs DynamicsController.cpp
先ほどトルクを加えた部分を以下のように修正します。
DynamicsController.cpp
#highlight(cpp:firstline[13]){{
my->addJointTorque("JOINT2",500.0);
}}
↓
#highlight(cpp:firstline[13]){{
my->setJointVelocity("JOINT2", 1.57, 300.0);
}}
setJointVelocityで関節の角速度を設定します。最初の引数は...
最大トルクに大きい値を指定すると指定した角速度に早く到達...
それではコンパイルして実行してみましょう。
$ make
$ cd ..
$ ./sigserver.sh -p 9001 -w DynamicsWorld.xml
#ref(bou_4.jpg)
棒が地面に倒れても関節は一定の速度で回転し続けようとしま...
#highlight(end)
Up:[[Tutorial]] Previous:[[BVHファイルの読み込み]]...
End:
Up:[[Tutorial]] Previous:[[BVHファイルの読み込み]]...
#contents
*ロボット・ダイナミクス [#j7cc4426]
ここでは関節を持ったオブジェクトの物理シミュレーションを...
**単純モデル [#f84e822a]
***モデルの作成 [#q02438d0]
SIGVerseのロボットモデルはOpenHRP形式で記述されています。...
まずロボットの形状モデルなどが置かれたディレクトリに移動...
$ cd ~/sigverse-<version>/share/sigverse/data/shape/
$ emacs robot_test.x3d
robot_test.x3d
#highlight(xml){{
<?xml version="1.0" encoding="UTF-8"?>
<X3D profile="Immersive" version="3.0">
<Scene>
<!--************PROTO宣言部***********-->
<ProtoDeclare name='Joint' >
<ProtoInterface>
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='MFFloat' na...
<field accessType='inputOutput' type='SFRotation'...
<field accessType='inputOutput' type='SFString' n...
<field accessType='inputOutput' type='SFRotation'...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='SFRotation'...
<field accessType='inputOutput' type='MFFloat' na...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='MFFloat' na...
<field accessType='inputOutput' type='MFFloat' na...
<field accessType='inputOutput' type='SFString' n...
<field accessType='inputOutput' type='SFFloat' na...
<field accessType='inputOutput' type='SFVec3f' na...
</ProtoInterface>
<ProtoBody>
<Transform>
<IS>
<connect nodeField='children' protoField='chi...
<connect nodeField='center' protoField='cente...
<connect nodeField='rotation' protoField='rot...
<connect nodeField='scale' protoField='scale'...
<connect nodeField='scaleOrientation' protoFi...
<connect nodeField='translation' protoField='...
</IS>
</Transform>
</ProtoBody>
</ProtoDeclare>
<ProtoDeclare name='Segment' >
<ProtoInterface>
<field accessType='initializeOnly' type='SFVec3f'...
<field accessType='initializeOnly' type='SFVec3f'...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='SFNode' nam...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='SFFloat' na...
<field accessType='inputOutput' type='MFFloat' na...
<field accessType='inputOutput' type='SFString' n...
<field accessType='inputOnly' type='MFNode' name=...
<field accessType='inputOnly' type='MFNode' name=...
</ProtoInterface>
<ProtoBody>
<Group>
<IS>
<connect nodeField='children' protoField='ch...
<connect nodeField='addChildren' protoField=...
<connect nodeField='removeChildren' protoFie...
<connect nodeField='bboxCenter' protoField='...
<connect nodeField='bboxSize' protoField='bb...
</IS>
</Group>
</ProtoBody>
</ProtoDeclare>
<ProtoDeclare name='Humanoid' >
<ProtoInterface>
<field accessType='initializeOnly' type='SFVec3f'...
<field accessType='initializeOnly' type='SFVec3f'...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='MFString' n...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='SFString' n...
<field accessType='inputOutput' type='SFRotation'...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='SFRotation'...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='MFNode' nam...
<field accessType='inputOutput' type='SFVec3f' na...
<field accessType='inputOutput' type='SFString' n...
<field accessType='inputOutput' type='MFNode' nam...
</ProtoInterface>
<ProtoBody>
<Transform>
<IS>
<connect nodeField='bboxCenter' protoField='b...
<connect nodeField='bboxSize' protoField='bbo...
<connect nodeField='center' protoField='cente...
<connect nodeField='rotation' protoField='rot...
<connect nodeField='scale' protoField='scale'...
<connect nodeField='scaleOrientation' protoFi...
<connect nodeField='translation' protoField='...
</IS>
<Group>
<IS>
<connect nodeField='children' protoField='v...
</IS>
</Group>
<Group>
<IS>
<connect nodeField='children' protoField='h...
</IS>
</Group>
</Transform>
</ProtoBody>
</ProtoDeclare>
<!--************実モデル定義部************-->
<ProtoInstance name='Humanoid' DEF="HRP1" containe...
<fieldValue name='info' value='"Test Joint"' />
<fieldValue name='name' value='sample' />
<fieldValue name='version' value='1.1' />
<!--ROOTジョイント この関節が回転すると体全体が回転 ...
<ProtoInstance name='Joint' DEF="JOINT0" containerF...
<fieldValue name='name' value='JOINT0' />
<!--関節の種類free 自由度6(位置と姿勢) -->
<fieldValue name='jointType' value='free' />
<fieldValue name='jointId' value='1.0' />
<!--JOINT1(JOINT0の子ジョイント)-->
<ProtoInstance name='Joint' DEF="JOINT1" contain...
<fieldValue name='name' value='JOINT1' />
<fieldValue name='jointId' value='2.0' />
<!--固定された関節-->
<fieldValue name='jointType' value='fixed' />
<!--LINK0(JOINT1に付随したリンク)-->
<ProtoInstance name='Segment' DEF="LINK1" c...
<fieldValue name='name' value='LINK1' />
<fieldValue name='mass' value='1.0' />
<Transform>
<Shape>
<!--テクスチャ-->
<Appearance>
<ImageTexture url="tumiki_moku.jpg"/>
</Appearance>
<!--LINK0の形状(JOINT1に付随)-->
<IndexedFaceSet DEF="link1" coordIndex="0...
<TextureCoordinate point="0.0 0.0, 0.0 ...
<Coordinate DEF="Coaster_c01GeoPoints" ...
</IndexedFaceSet>
</Shape>
</Transform>
</ProtoInstance>
<!--JOINT2(JOINT1の子ジョイント)-->
<ProtoInstance name='Joint' DEF="JOINT2" conta...
<fieldValue name='name' value='JOINT2' />
<!--JOINT2のJOINT1からの位置-->
<fieldValue name='translation' value='0.0 5.0...
<!--ヒンジジョイント -->
<fieldValue name='jointType' value='rotate' />
<!--回転軸 -->
<fieldValue name='jointAxis' value='1.0 0.0 0...
<fieldValue name='jointId' value='3.0' />
<!--JOINT2に付随したリンク-->
<ProtoInstance name='Segment' DEF="LINK2" c...
<fieldValue name='name' value='LINK2' />
<!--LINK2の位置(JOINT2からの位置)-->
<fieldValue name='centerOfMass' value='0.0 ...
<fieldValue name='mass' value='1.0' />
<Transform>
<Shape>
<Appearance>
<ImageTexture url="tumiki_moku.jpg"/>
</Appearance>
<IndexedFaceSet USE="link1"/>
</Shape>
</Transform>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</Scene>
</X3D>
}}
OpenHRP形式のロボットはプロト宣言部と実モデル定義部からな...
このサンプルは2つの棒を関節で接続したモデルです。
同じ形状ファイルをクライアント側のSIGViewerのインストール...
※形状ファイルにコメント部分があるとクライアント側で正常に...
***Jointの親子関係 [#fed078fe]
作成したモデルのJointの親子関係は以下のようになっています。
Humanoid sample(モデルのルート)
+ Joint JOINT0 (ルートジョイント、3軸における位置、...
+ Joint JOINT1 :Segment LINK1 (固定ジョイント、自由...
+ Joint JOINT2 :Segment LINK2(ヒンジジョイント、...
Jointの回転や移動に伴い、そのJointに付随するSegmentや子ジ...
このモデルではLINK1とLINK2がJOINT2によって接続されていま...
#ref(bou_2.jpg)
***設定ファイル [#e3db8144]
まずエージェント設定ファイルを作成します。
$ cd ../xml
$ emacs robot_test.xml
robot_test.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<define-class name="robot_test" inherit="Agent.xml">
<x3d>
<!--先ほど作成したモデルの読み込み-->
<filename>robot_test.x3d</filename>
</x3d>
</define-class>
}}
次に世界ファイルを作成します。
$ emacs DynamicsWorld.xml
DynamicsWorld.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<world name="myworld11">
<gravity x="0.0" y="-9.8" z="0.0"/>
<instanciate class="robot_test.xml">
<set-attr-value name="name" value="robot_test"/>
<!--dynamics true-->
<set-attr-value name="dynamics" value="true"/>
<set-attr-value name="x" value="5.0"/>
<set-attr-value name="y" value="5.0"/>
<set-attr-value name="z" value="5.0"/>
<set-attr-value name="language" value="c++"/>
</instanciate>
</world>
}}
ダイナミクスをtrueに設定しました。
***実行 [#l4c076b6]
まずはコントローラなしで実行してみましょう。
$ cd ~/sigverse-<version>/bin
$ ./sigserver.sh -p 9001 -w DynamicsWorld.xml
viewerで接続し、シミュレーションを開始してみると初めは棒...
#ref(bou_3.jpg)
***コントローラ [#u4ff78dd]
次に関節にトルクを加えるコントローラを作成します。
$ cd NewWorld
$ emacs DynamicsController.cpp
DynamicsController.cpp
#highlight(cpp){{
DynamicsController.cpp
#include "Controller.h"
class MoveController : public Controller {
public:
double onAction(ActionEvent&);
};
double MoveController::onAction(ActionEvent &evt) {
SimObj *my = getObj(myname());
//JOINT2にトルクを加えます。
my->addJointTorque("JOINT2",500.0);
return 1.0;
}
extern "C" Controller * createController() {
return new MoveController;
}
}}
addJointTorqueでヒンジジョイントにトルクを加えます。最初...
このコントローラでは500[Nm]のトルクを"JOINT2"に1秒おきに...
Makefileを修正してコンパイルします。
$ emacs Makefile
オブジェクトファイルDynamicsController.soを指定
#オブジェクトファイルの指定
OBJS = DynamicsController.so
$ make
***世界ファイル修正 [#ua9e7301]
次に作成したコントローラを世界ファイルで指定します。
$ cd ..
$ emacs xml/DynamicsWorld.xml
以下の一行を加えます。
<set-attr-value name="implementation" value="./N...
DynamicsWorld.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<world name="myworld">
<gravity x="0.0" y="-9.8" z="0.0"/>
<instanciate class="robot_test.xml">
<set-attr-value name="name" value="robot_test"/>
<!--dynamics true-->
<set-attr-value name="dynamics" value="true"/>
<set-attr-value name="x" value="5.0"/>
<set-attr-value name="y" value="5.0"/>
<set-attr-value name="z" value="5.0"/>
<set-attr-value name="language" value="c++"/>
<set-attr-value name="implementation" value="./N...
</instanciate>
</world>
}}
***実行 [#hf6ef7e6]
それでは実行してみましょう。
$ ./sigserver.sh -p 9001 -w DynamicsWorld.xml
viewerで見てみると先ほどは重力の影響でゆっくり関節が曲が...
#ref(bou_5.jpg)
***関節の角速度の設定 [#oa8d06b1]
先ほどはコントローラで関節にトルクを加えました。次は関節...
$ cd NewWorld
$ emacs DynamicsController.cpp
先ほどトルクを加えた部分を以下のように修正します。
DynamicsController.cpp
#highlight(cpp:firstline[13]){{
my->addJointTorque("JOINT2",500.0);
}}
↓
#highlight(cpp:firstline[13]){{
my->setJointVelocity("JOINT2", 1.57, 300.0);
}}
setJointVelocityで関節の角速度を設定します。最初の引数は...
最大トルクに大きい値を指定すると指定した角速度に早く到達...
それではコンパイルして実行してみましょう。
$ make
$ cd ..
$ ./sigserver.sh -p 9001 -w DynamicsWorld.xml
#ref(bou_4.jpg)
棒が地面に倒れても関節は一定の速度で回転し続けようとしま...
#highlight(end)
Up:[[Tutorial]] Previous:[[BVHファイルの読み込み]]...
Page: