[[車両のダイナミクス(ダンベルモデル)]]

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: [[距離センサ]]   



Front page   New List of pages Search Recent changes   Help   RSS of recent changes