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


Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2011-10-26 (Wed) 14:40:43 (4565d)