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