車両の制御(動力学有り)
[
Front page
] [
New
|
List of pages
|
Search
|
Recent changes
|
Help
]
Start:
Up:[[Tutorial]] Previous:[[車輪移動ロボット]] ...
----
#contents
*車両のダイナミクス [#j7cc4426]
前節では,動力学計算をしない状態での車両の制御を説明しま...
**ダンベルモデル [#f84e822a]
***モデルの作成 [#q02438d0]
まずロボットの形状モデルなどが置かれたディレクトリに移動...
$ cd ~/sigverse-<version>/share/sigverse/data/shape/
$ emacs Dumbel.x3d
#highlight(cpp){{
<?xml version="1.0" encoding="UTF-8"?>
<X3D profile="Immersive" version="3.0">
<Scene>
<ProtoDeclare name='Joint' >
<ProtoInterface>
<field accessType='inputOutput' type='SFVec3f' name='ce...
<field accessType='inputOutput' type='MFNode' name='chi...
<field accessType='inputOutput' type='MFFloat' name='ll...
<field accessType='inputOutput' type='SFRotation' name=...
<field accessType='inputOutput' type='SFString' name='n...
<field accessType='inputOutput' type='SFRotation' name=...
<field accessType='inputOutput' type='SFVec3f' name='sc...
<field accessType='inputOutput' type='SFRotation' name=...
<field accessType='inputOutput' type='MFFloat' name='st...
<field accessType='inputOutput' type='SFVec3f' name='tr...
<field accessType='inputOutput' type='MFFloat' name='ul...
<field accessType='inputOutput' type='MFFloat' name='dh...
<field accessType='inputOutput' type='SFString' name='j...
<field accessType='inputOutput' type='SFFloat' name='jo...
<field accessType='inputOutput' type='SFVec3f' name='jo...
</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='s...
<connect nodeField='translation' protoField='transl...
</IS>
</Transform>
</ProtoBody>
</ProtoDeclare>
<ProtoDeclare name='Segment' >
<ProtoInterface>
<field accessType='initializeOnly' type='SFVec3f' name=...
<field accessType='initializeOnly' type='SFVec3f' name...
<field accessType='inputOutput' type='SFVec3f' name='ce...
<field accessType='inputOutput' type='MFNode' name='chi...
<field accessType='inputOutput' type='SFNode' name='coo...
<field accessType='inputOutput' type='MFNode' name='dis...
<field accessType='inputOutput' type='SFFloat' name='ma...
<field accessType='inputOutput' type='MFFloat' name='mo...
<field accessType='inputOutput' type='SFString' name='n...
<field accessType='inputOnly' type='MFNode' name='addCh...
<field accessType='inputOnly' type='MFNode' name='remov...
</ProtoInterface>
<ProtoBody>
<Group>
<IS>
<connect nodeField='children' protoField='children'...
<connect nodeField='addChildren' protoField='addChi...
<connect nodeField='removeChildren' protoField='rem...
<connect nodeField='bboxCenter' protoField='bboxCen...
<connect nodeField='bboxSize' protoField='bboxSize'...
</IS>
</Group>
</ProtoBody>
</ProtoDeclare>
<ProtoDeclare name='Humanoid' >
<ProtoInterface>
<field accessType='initializeOnly' type='SFVec3f' name=...
<field accessType='initializeOnly' type='SFVec3f' name=...
<field accessType='inputOutput' type='SFVec3f' name='ce...
<field accessType='inputOutput' type='MFNode' name='hum...
<field accessType='inputOutput' type='MFString' name='i...
<field accessType='inputOutput' type='MFNode' name='joi...
<field accessType='inputOutput' type='SFString' name='n...
<field accessType='inputOutput' type='SFRotation' name=...
<field accessType='inputOutput' type='SFVec3f' name='sc...
<field accessType='inputOutput' type='SFRotation' name=...
<field accessType='inputOutput' type='MFNode' name='seg...
<field accessType='inputOutput' type='MFNode' name='sit...
<field accessType='inputOutput' type='SFVec3f' name='tr...
<field accessType='inputOutput' type='SFString' name='v...
<field accessType='inputOutput' type='MFNode' name='vie...
</ProtoInterface>
<ProtoBody>
<Transform>
<IS>
<connect nodeField='bboxCenter' protoField='bboxCen...
<connect nodeField='bboxSize' protoField='bboxSize'...
<connect nodeField='center' protoField='center' />
<connect nodeField='rotation' protoField='rotation'...
<connect nodeField='scale' protoField='scale' />
<connect nodeField='scaleOrientation' protoField='s...
<connect nodeField='translation' protoField='transl...
</IS>
<Group>
<IS>
<connect nodeField='children' protoField='viewpoi...
</IS>
</Group>
<Group>
<IS>
<connect nodeField='children' protoField='humanoi...
</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' />
<ProtoInstance name='Joint' DEF="JOINT0" containerF...
<fieldValue name='name' value='JOINT0' />
<fieldValue name='jointType' value='free' />
<fieldValue name='jointId' value='1.0' />
<ProtoInstance name='Joint' DEF="JOINT_CENTER" c...
<fieldValue name='name' value='JOINT_CENTER' />
<fieldValue name='jointId' value='2.0' />
<fieldValue name='jointType' value='fixed' />
<ProtoInstance name='Segment' DEF="LINK_CENTER"...
<fieldValue name='name' value='LINK_CENTER' />
<fieldValue name='mass' value='1.0' />
<Transform>
<Shape>
<Appearance>
<ImageTexture url="tumiki_moku.jpg"/>
</Appearance>
<IndexedFaceSet DEF="link1" coordIndex="0...
<TextureCoordinate point="0.0 0.0, 0.0 ...
<Coordinate DEF="Coaster_c01GeoPoints" ...
</IndexedFaceSet>
</Shape>
</Transform>
</ProtoInstance>
<ProtoInstance name='Joint' DEF="JOINT_LWHEEL" c...
<fieldValue name='name' value='JOINT_LWHEEL' />
<fieldValue name='translation' value='0.0 5.0 0...
<fieldValue name='jointAxis' value='1.0 0.0 0.0...
<fieldValue name='jointId' value='2.0' />
<fieldValue name='jointType' value='rotate' />
<ProtoInstance name='Segment' DEF="LINK_LWHEEL"...
<fieldValue name='name' value='LINK_LWHEEL' />
<fieldValue name='mass' value='1.0' />
<Transform>
<Shape>
<Appearance>
<ImageTexture url="book_A.jpg"/>
</Appearance>
<IndexedFaceSet DEF="pCylinderShape1_ifs...
<TextureCoordinate point="0.0 0.0, 0....
<Coordinate DEF="pCylinderShape1_coo...
<Normal DEF="pCylinderShape1_normal"...
</IndexedFaceSet>
</Shape>
</Transform>
</ProtoInstance>
</ProtoInstance>
<ProtoInstance name='Joint' DEF="JOINT_RWHEEL" c...
<fieldValue name='name' value='JOINT_RWHEEL' />
<fieldValue name='translation' value='0.0 -5.0 ...
<fieldValue name='jointAxis' value='1.0 0.0 0.0...
<fieldValue name='jointId' value='2.0' />
<fieldValue name='jointType' value='rotate' />
<ProtoInstance name='Segment' DEF="LINK_RWHEEL"...
<fieldValue name='name' value='LINK_RWHEEL' />
<fieldValue name='mass' value='1.0' />
<Transform>
<Shape>
<Appearance>
<ImageTexture url="book_A.jpg"/>
</Appearance>
<IndexedFaceSet USE="pCylinderShape1_ifs...
</Shape>
</Transform>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</Scene>
</X3D>
}}
このサンプルは2つのシリンダを関節で接続したモデルです。
同じ形状ファイルをクライアント側のSIGViewerのインストール...
***Jointの親子関係 [#fed078fe]
作成したモデルのJointの親子関係は以下のようになっています。
Humanoid sample(モデルのルート)
+ Joint JOINT0 (ルートジョイント、3軸における位置、...
+ Joint JOINT_CENTER :Segment LINK_CENTER (固定ジョ...
+ Joint JOINT_LWHEEL :Segment LINK_LWHEEL(ヒンジ...
+ Joint JOINT_RWHEEL :Segment LINK_RWHEEL(ヒンジ...
このモデルではLINK_LWHEELがJOINT_LWHEELによって接続され、...
によって接続されています。
LINK_LWHEELとLINK_RWHEELはそれぞれシリンダ形状となってい...
***設定ファイル [#e3db8144]
エージェント設定ファイルと世界ファイルを作成します。
$ cd ../xml
$ emacs DumbelTest.xml
$ emacs DumbelWorld.xml
#highlight(cpp){{
DumbelTest.xml
<?xml version="1.0" encoding="utf8"?>
<define-class name="robot_test" inherit="Agent.xml">
<x3d>
<filename>dumbel.x3d</filename>
</x3d>
</define-class>
$ emacs DumbelWorld.xml
DumbelWorld.xml
<?xml version="1.0" encoding="utf8"?>
<world name="myworld">
<gravity x="0.0" y="-9.8" z="0.0"/>
<instanciate class="DumbelTest.xml">
<set-attr-value name="name" value="Robot1"/>
<set-attr-value name="dynamics" value="true"/>
<set-attr-value name="x" value="5.0"/>
<set-attr-value name="y" value="4.5"/>
<set-attr-value name="z" value="5.0"/>
<set-attr-value name="qw" value="0.707"/>
<set-attr-value name="qx" value="0.0"/>
<set-attr-value name="qy" value="0.0"/>
<set-attr-value name="qz" value="0.707"/>
<set-attr-value name="language" value="c++"/>
<set-attr-value name="implementation" value="./...
</instanciate>
</world>
}}
ダイナミクスをtrueにしています。
***コントローラ [#u4ff78dd]
次に車輪を回転させるコントローラを作成します。
$ emacs DumbelController.cpp
#highlight(cpp){{
#include "Controller.h"
/**
* 車両モデルのサンプル
*/
class DumbelController : public Controller {
public:
void onInit(InitEvent &evt);
double onAction(ActionEvent&);
private:
int time;
int state;
enum {
STATE_INIT = 0,
STATE_STEP1,
STATE_STEP2,
STATE_STEP3,
STATE_STEP4
};
enum {
TIME_0 = 0,
TIME_1 = 15,
TIME_2 = 30
};
};
void DumbelController::onInit(InitEvent &evt) {
SimObj *my = getObj(myname());
state = STATE_INIT;
time = 0;
}
double DumbelController::onAction(ActionEvent &evt) {
SimObj *my = getObj(myname());
time++;
switch(state) {
case STATE_INIT:
setWheelProperty(
(char*)"LINK_LWHEEL", // char *leftWheelName,
0.0, // double leftMotorConsumption,
1000.0, // double leftWheelMaxSpeed,
0.0001, // double leftWheelSpeedUnit,
0.0, // double leftSlipNoise,
0.0, // double leftEncoderResolution,
100.0, // double leftMaxForce,
(char*)"LINK_RWHEEL", // char *rightWheelName,
0.0, // double rightMotorConsumption,
1000.0, // double rightWheelMaxSpeed,
0.0001, // double rightWheelSpeedUnit,
0.0, // double rightSlipNoise,
0.0, // double rightEncoderResolution,
100.0 // double rightMaxForce
);
state = STATE_STEP1;
break;
case STATE_STEP1:
differentialWheelsSetSpeed(5.0,5.0);
state = STATE_STEP2;
break;
case STATE_STEP2:
if(time > TIME_1) {
state = STATE_STEP3;
}
break;
case STATE_STEP3:
// 逆方向に回してみる
differentialWheelsSetSpeed(-5.0,-5.0);
state = STATE_STEP4;
break;
case STATE_STEP4:
if(time > TIME_2) {
state = STATE_STEP1;
time = 0.0;
}
break;
}
return 1.0;
}
extern "C" Controller * createController() {
return new DumbelController;
}
}}
setWheelProperty()で車両の特性を設定します。各引数の意味...
第1引数 : 左側の車輪のリンクオブジェクト名
第2引数 : 左側の車輪の消費電力[W](2011/4/12時点未対応)
第3引数 : 左車輪の最大角速度[rad/s]
第4引数 : 速度の精度[rad/s]
第5引数 : シミュレーションステップごとに加えられる一様...
第6引数 : 1rad回転するごとに加えられるノイズの回数
第7引数 : 左側車輪に掛けられる最大トルク[Nm]
第8引数 : 右側の車輪のリンクオブジェクト名
第9引数 : 右側の車輪の消費電力[W](2011/4/12時点未対応)
第10引数 : 右車輪の最大角速度[rad/s]
第11引数 : 速度の精度[rad/s]
第12引数 : シミュレーションステップごとに加えられる一様...
第13引数 : 1rad回転するごとに加えられるノイズの回数
第14引数 : 右側車輪に掛けられる最大トルク[Nm]
コンパイルします。
$ ./sigmake.sh DumbelController.cpp
***実行 [#hf6ef7e6]
それでは実行してみましょう。
$ ./sigserver.sh -w DumbelWorld.xml
viewerで見てみると、定期的にダンベルが前後に動くことが確...
#highlight(end)
----
Up:[[Tutorial]] Previous:[[車輪移動ロボット]] ...
#counter
End:
Up:[[Tutorial]] Previous:[[車輪移動ロボット]] ...
----
#contents
*車両のダイナミクス [#j7cc4426]
前節では,動力学計算をしない状態での車両の制御を説明しま...
**ダンベルモデル [#f84e822a]
***モデルの作成 [#q02438d0]
まずロボットの形状モデルなどが置かれたディレクトリに移動...
$ cd ~/sigverse-<version>/share/sigverse/data/shape/
$ emacs Dumbel.x3d
#highlight(cpp){{
<?xml version="1.0" encoding="UTF-8"?>
<X3D profile="Immersive" version="3.0">
<Scene>
<ProtoDeclare name='Joint' >
<ProtoInterface>
<field accessType='inputOutput' type='SFVec3f' name='ce...
<field accessType='inputOutput' type='MFNode' name='chi...
<field accessType='inputOutput' type='MFFloat' name='ll...
<field accessType='inputOutput' type='SFRotation' name=...
<field accessType='inputOutput' type='SFString' name='n...
<field accessType='inputOutput' type='SFRotation' name=...
<field accessType='inputOutput' type='SFVec3f' name='sc...
<field accessType='inputOutput' type='SFRotation' name=...
<field accessType='inputOutput' type='MFFloat' name='st...
<field accessType='inputOutput' type='SFVec3f' name='tr...
<field accessType='inputOutput' type='MFFloat' name='ul...
<field accessType='inputOutput' type='MFFloat' name='dh...
<field accessType='inputOutput' type='SFString' name='j...
<field accessType='inputOutput' type='SFFloat' name='jo...
<field accessType='inputOutput' type='SFVec3f' name='jo...
</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='s...
<connect nodeField='translation' protoField='transl...
</IS>
</Transform>
</ProtoBody>
</ProtoDeclare>
<ProtoDeclare name='Segment' >
<ProtoInterface>
<field accessType='initializeOnly' type='SFVec3f' name=...
<field accessType='initializeOnly' type='SFVec3f' name...
<field accessType='inputOutput' type='SFVec3f' name='ce...
<field accessType='inputOutput' type='MFNode' name='chi...
<field accessType='inputOutput' type='SFNode' name='coo...
<field accessType='inputOutput' type='MFNode' name='dis...
<field accessType='inputOutput' type='SFFloat' name='ma...
<field accessType='inputOutput' type='MFFloat' name='mo...
<field accessType='inputOutput' type='SFString' name='n...
<field accessType='inputOnly' type='MFNode' name='addCh...
<field accessType='inputOnly' type='MFNode' name='remov...
</ProtoInterface>
<ProtoBody>
<Group>
<IS>
<connect nodeField='children' protoField='children'...
<connect nodeField='addChildren' protoField='addChi...
<connect nodeField='removeChildren' protoField='rem...
<connect nodeField='bboxCenter' protoField='bboxCen...
<connect nodeField='bboxSize' protoField='bboxSize'...
</IS>
</Group>
</ProtoBody>
</ProtoDeclare>
<ProtoDeclare name='Humanoid' >
<ProtoInterface>
<field accessType='initializeOnly' type='SFVec3f' name=...
<field accessType='initializeOnly' type='SFVec3f' name=...
<field accessType='inputOutput' type='SFVec3f' name='ce...
<field accessType='inputOutput' type='MFNode' name='hum...
<field accessType='inputOutput' type='MFString' name='i...
<field accessType='inputOutput' type='MFNode' name='joi...
<field accessType='inputOutput' type='SFString' name='n...
<field accessType='inputOutput' type='SFRotation' name=...
<field accessType='inputOutput' type='SFVec3f' name='sc...
<field accessType='inputOutput' type='SFRotation' name=...
<field accessType='inputOutput' type='MFNode' name='seg...
<field accessType='inputOutput' type='MFNode' name='sit...
<field accessType='inputOutput' type='SFVec3f' name='tr...
<field accessType='inputOutput' type='SFString' name='v...
<field accessType='inputOutput' type='MFNode' name='vie...
</ProtoInterface>
<ProtoBody>
<Transform>
<IS>
<connect nodeField='bboxCenter' protoField='bboxCen...
<connect nodeField='bboxSize' protoField='bboxSize'...
<connect nodeField='center' protoField='center' />
<connect nodeField='rotation' protoField='rotation'...
<connect nodeField='scale' protoField='scale' />
<connect nodeField='scaleOrientation' protoField='s...
<connect nodeField='translation' protoField='transl...
</IS>
<Group>
<IS>
<connect nodeField='children' protoField='viewpoi...
</IS>
</Group>
<Group>
<IS>
<connect nodeField='children' protoField='humanoi...
</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' />
<ProtoInstance name='Joint' DEF="JOINT0" containerF...
<fieldValue name='name' value='JOINT0' />
<fieldValue name='jointType' value='free' />
<fieldValue name='jointId' value='1.0' />
<ProtoInstance name='Joint' DEF="JOINT_CENTER" c...
<fieldValue name='name' value='JOINT_CENTER' />
<fieldValue name='jointId' value='2.0' />
<fieldValue name='jointType' value='fixed' />
<ProtoInstance name='Segment' DEF="LINK_CENTER"...
<fieldValue name='name' value='LINK_CENTER' />
<fieldValue name='mass' value='1.0' />
<Transform>
<Shape>
<Appearance>
<ImageTexture url="tumiki_moku.jpg"/>
</Appearance>
<IndexedFaceSet DEF="link1" coordIndex="0...
<TextureCoordinate point="0.0 0.0, 0.0 ...
<Coordinate DEF="Coaster_c01GeoPoints" ...
</IndexedFaceSet>
</Shape>
</Transform>
</ProtoInstance>
<ProtoInstance name='Joint' DEF="JOINT_LWHEEL" c...
<fieldValue name='name' value='JOINT_LWHEEL' />
<fieldValue name='translation' value='0.0 5.0 0...
<fieldValue name='jointAxis' value='1.0 0.0 0.0...
<fieldValue name='jointId' value='2.0' />
<fieldValue name='jointType' value='rotate' />
<ProtoInstance name='Segment' DEF="LINK_LWHEEL"...
<fieldValue name='name' value='LINK_LWHEEL' />
<fieldValue name='mass' value='1.0' />
<Transform>
<Shape>
<Appearance>
<ImageTexture url="book_A.jpg"/>
</Appearance>
<IndexedFaceSet DEF="pCylinderShape1_ifs...
<TextureCoordinate point="0.0 0.0, 0....
<Coordinate DEF="pCylinderShape1_coo...
<Normal DEF="pCylinderShape1_normal"...
</IndexedFaceSet>
</Shape>
</Transform>
</ProtoInstance>
</ProtoInstance>
<ProtoInstance name='Joint' DEF="JOINT_RWHEEL" c...
<fieldValue name='name' value='JOINT_RWHEEL' />
<fieldValue name='translation' value='0.0 -5.0 ...
<fieldValue name='jointAxis' value='1.0 0.0 0.0...
<fieldValue name='jointId' value='2.0' />
<fieldValue name='jointType' value='rotate' />
<ProtoInstance name='Segment' DEF="LINK_RWHEEL"...
<fieldValue name='name' value='LINK_RWHEEL' />
<fieldValue name='mass' value='1.0' />
<Transform>
<Shape>
<Appearance>
<ImageTexture url="book_A.jpg"/>
</Appearance>
<IndexedFaceSet USE="pCylinderShape1_ifs...
</Shape>
</Transform>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</ProtoInstance>
</Scene>
</X3D>
}}
このサンプルは2つのシリンダを関節で接続したモデルです。
同じ形状ファイルをクライアント側のSIGViewerのインストール...
***Jointの親子関係 [#fed078fe]
作成したモデルのJointの親子関係は以下のようになっています。
Humanoid sample(モデルのルート)
+ Joint JOINT0 (ルートジョイント、3軸における位置、...
+ Joint JOINT_CENTER :Segment LINK_CENTER (固定ジョ...
+ Joint JOINT_LWHEEL :Segment LINK_LWHEEL(ヒンジ...
+ Joint JOINT_RWHEEL :Segment LINK_RWHEEL(ヒンジ...
このモデルではLINK_LWHEELがJOINT_LWHEELによって接続され、...
によって接続されています。
LINK_LWHEELとLINK_RWHEELはそれぞれシリンダ形状となってい...
***設定ファイル [#e3db8144]
エージェント設定ファイルと世界ファイルを作成します。
$ cd ../xml
$ emacs DumbelTest.xml
$ emacs DumbelWorld.xml
#highlight(cpp){{
DumbelTest.xml
<?xml version="1.0" encoding="utf8"?>
<define-class name="robot_test" inherit="Agent.xml">
<x3d>
<filename>dumbel.x3d</filename>
</x3d>
</define-class>
$ emacs DumbelWorld.xml
DumbelWorld.xml
<?xml version="1.0" encoding="utf8"?>
<world name="myworld">
<gravity x="0.0" y="-9.8" z="0.0"/>
<instanciate class="DumbelTest.xml">
<set-attr-value name="name" value="Robot1"/>
<set-attr-value name="dynamics" value="true"/>
<set-attr-value name="x" value="5.0"/>
<set-attr-value name="y" value="4.5"/>
<set-attr-value name="z" value="5.0"/>
<set-attr-value name="qw" value="0.707"/>
<set-attr-value name="qx" value="0.0"/>
<set-attr-value name="qy" value="0.0"/>
<set-attr-value name="qz" value="0.707"/>
<set-attr-value name="language" value="c++"/>
<set-attr-value name="implementation" value="./...
</instanciate>
</world>
}}
ダイナミクスをtrueにしています。
***コントローラ [#u4ff78dd]
次に車輪を回転させるコントローラを作成します。
$ emacs DumbelController.cpp
#highlight(cpp){{
#include "Controller.h"
/**
* 車両モデルのサンプル
*/
class DumbelController : public Controller {
public:
void onInit(InitEvent &evt);
double onAction(ActionEvent&);
private:
int time;
int state;
enum {
STATE_INIT = 0,
STATE_STEP1,
STATE_STEP2,
STATE_STEP3,
STATE_STEP4
};
enum {
TIME_0 = 0,
TIME_1 = 15,
TIME_2 = 30
};
};
void DumbelController::onInit(InitEvent &evt) {
SimObj *my = getObj(myname());
state = STATE_INIT;
time = 0;
}
double DumbelController::onAction(ActionEvent &evt) {
SimObj *my = getObj(myname());
time++;
switch(state) {
case STATE_INIT:
setWheelProperty(
(char*)"LINK_LWHEEL", // char *leftWheelName,
0.0, // double leftMotorConsumption,
1000.0, // double leftWheelMaxSpeed,
0.0001, // double leftWheelSpeedUnit,
0.0, // double leftSlipNoise,
0.0, // double leftEncoderResolution,
100.0, // double leftMaxForce,
(char*)"LINK_RWHEEL", // char *rightWheelName,
0.0, // double rightMotorConsumption,
1000.0, // double rightWheelMaxSpeed,
0.0001, // double rightWheelSpeedUnit,
0.0, // double rightSlipNoise,
0.0, // double rightEncoderResolution,
100.0 // double rightMaxForce
);
state = STATE_STEP1;
break;
case STATE_STEP1:
differentialWheelsSetSpeed(5.0,5.0);
state = STATE_STEP2;
break;
case STATE_STEP2:
if(time > TIME_1) {
state = STATE_STEP3;
}
break;
case STATE_STEP3:
// 逆方向に回してみる
differentialWheelsSetSpeed(-5.0,-5.0);
state = STATE_STEP4;
break;
case STATE_STEP4:
if(time > TIME_2) {
state = STATE_STEP1;
time = 0.0;
}
break;
}
return 1.0;
}
extern "C" Controller * createController() {
return new DumbelController;
}
}}
setWheelProperty()で車両の特性を設定します。各引数の意味...
第1引数 : 左側の車輪のリンクオブジェクト名
第2引数 : 左側の車輪の消費電力[W](2011/4/12時点未対応)
第3引数 : 左車輪の最大角速度[rad/s]
第4引数 : 速度の精度[rad/s]
第5引数 : シミュレーションステップごとに加えられる一様...
第6引数 : 1rad回転するごとに加えられるノイズの回数
第7引数 : 左側車輪に掛けられる最大トルク[Nm]
第8引数 : 右側の車輪のリンクオブジェクト名
第9引数 : 右側の車輪の消費電力[W](2011/4/12時点未対応)
第10引数 : 右車輪の最大角速度[rad/s]
第11引数 : 速度の精度[rad/s]
第12引数 : シミュレーションステップごとに加えられる一様...
第13引数 : 1rad回転するごとに加えられるノイズの回数
第14引数 : 右側車輪に掛けられる最大トルク[Nm]
コンパイルします。
$ ./sigmake.sh DumbelController.cpp
***実行 [#hf6ef7e6]
それでは実行してみましょう。
$ ./sigserver.sh -w DumbelWorld.xml
viewerで見てみると、定期的にダンベルが前後に動くことが確...
#highlight(end)
----
Up:[[Tutorial]] Previous:[[車輪移動ロボット]] ...
#counter
Page: