Up:[[Tutorial]] Previous:[[ロボット・ダイナミクス(ヒューマノイド)]] Next: [[距離センサ]]
#contents
*車輪プロパティの設定 [#q22e2fea]
***コントローラ [#u4ff78dd]
車輪のプロパティを設定して回転させるコントローラを作成します。
$ cd NewWorld
$ emacs WheelController2.cpp
wheelController2.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(
"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,
"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]
Makefileを修正してコンパイルします。
$ emacs Makefile
オブジェクトファイルWheelController2.soを指定
#オブジェクトファイルの指定
OBJS = WheelController2.so
$ make
***実行 [#hf6ef7e6]
世界ファイルで作成したコントローラを指定します。
それでは実行してみましょう。
$ ./sigserver.sh -p 9001 -w WheelWorld.xml
viewerで見てみると、定期的に車両が前後に動くことが確認できます。
Up:[[Tutorial]] Previous:[[ロボット・ダイナミクス(ヒューマノイド)]] Next: [[距離センサ]]