Up:Tutorial? Previous:ロボット・ダイナミクス(ヒューマノイド) Next: 距離センサ? 車輪プロパティの設定 †コントローラ †車輪のプロパティを設定して回転させるコントローラを作成します。 $ 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 実行 †世界ファイルで作成したコントローラを指定します。 それでは実行してみましょう。 $ ./sigserver.sh -p 9001 -w WheelWorld.xml viewerで見てみると、定期的に車両が前後に動くことが確認できます。 Up:Tutorial? Previous:ロボット・ダイナミクス(ヒューマノイド) Next: 距離センサ? |