れごぼく@メガネボーイズ2008 RSSフィード

2008-11-15

どうやってステアリング操作を保持しておくか? 21:16 どうやってステアリング操作を保持しておくか? - れごぼく@メガネボーイズ2008 を含むブックマーク はてなブックマーク - どうやってステアリング操作を保持しておくか? - れごぼく@メガネボーイズ2008 どうやってステアリング操作を保持しておくか? - れごぼく@メガネボーイズ2008 のブックマークコメント

char変数でも用意しておくか

マーカー検知走行をやってたときの最後のステアリング操作、色判定結果を記録しておけばいいので、char変数に記録しておく。

	// マーカー検知走行での最後のステアリング操作
	unsigned char m_lastSteering;

	// マーカー検知走行での最後の色識別結果
	unsigned char  m_lastColor;

マーカー検知前走行でステアリング操作と色判定結果を記録しておく

void ActiveMarkerDetectionLogic::runBeforeMarkerDetect(SRunningSituationData *pData) {
	// 駆動ユニットと操舵ユニットを制御する
	// ステアリング補正の際に、マーカー検知前走行最後のステアリング操作と色判定結果が
	// 必要になるため、記録しておく。
	if (pData->ColorDistinctionResult == WHITE) {
		this->m_pSteeringUnit->turn(LEFT_TURN, MARKER_DETECTION_NORMAL_STEERING_SPEED);
		this->m_lastSteering = LEFT_TURN;
		this->m_lastColor = WHITE;
	} else if (pData->ColorDistinctionResult == BLACK) {
		this->m_pSteeringUnit->turn(RIGHT_TURN, MARKER_DETECTION_NORMAL_STEERING_SPEED);
		this->m_lastSteering = RIGHT_TURN;
		this->m_lastColor = BLACK;
	} else {
		this->m_pSteeringUnit->turn(LEFT_TURN, MARKER_DETECTION_ON_MARKER_STEERING_SPEED);
		this->m_lastSteering = LEFT_TURN;
		this->m_lastColor = MARKER;
	}
	this->m_pDriveUnit->forward(MARKER_DETECTION_NORMAL_DRIVE_SPEED);
}

しかし、問題なのはステアリングの慣性の違いをどう把握するかだ

http://meganeboy.g.hatena.ne.jp/fuji_ttt/20081019

の②と③の違い。

ショートカットでも、苦戦中らしい。

なんちゃってステートマシンの実装をしてみた 18:59 なんちゃってステートマシンの実装をしてみた - れごぼく@メガネボーイズ2008 を含むブックマーク はてなブックマーク - なんちゃってステートマシンの実装をしてみた - れごぼく@メガネボーイズ2008 なんちゃってステートマシンの実装をしてみた - れごぼく@メガネボーイズ2008 のブックマークコメント

http://meganeboy.g.hatena.ne.jp/skelton_boy/20081109/1226221537

に書いたように、簡単なswitch文で実装します。

本来はステートマシンってこんな実装しないんだけど、マー言いかという感じで。

各状態ごとに走行ロジックと状態遷移を行う関数を用意する

アウトエッジ移行走行ってのが、外側へ行く走行のことね。

外部から参照されないものなのでprivate。

private:

	/***** マーカー検知前走行 *****/
	// 走行ロジック
	void runBeforeMarkerDetect(SRunningSituationData *pData);
	// 状態遷移の確認
	void stateTransBeforeMarkerDetect(SRunningSituationData *pData);

	/***** ステアリング補正走行 *****/
	// 走行ロジック
	void runSteeringAdjust(SRunningSituationData *pData);
	// 状態遷移
	void stateTransSteeringAdjust(SRunningSituationData *pData);

	/***** アウトエッジ移行走行 *****/
	// 走行ロジック
	void runrunHeadingOutEdge(SRunningSituationData *pData);
	// イベント遷移処理
	void eventTransrunHeadingOutEdge(SRunningSituationData *pData);

	/***** ステアリング安定化走行 *****/
	// 走行ロジック
	void runSteeringStabilizing(SRunningSituationData *pData);
	// 状態遷移処理
	void eventTransSteeringStabilizing (SRunningSituationData *pData);

走行状態を表すenumを用意した

こういうのは列挙型ですよね。

// 走行状態
enum StateActiveMarkerDetection {
	/* なし */
	STATE_NON,
	/* マーカー検知前走行 */
	STATE_BEFORE_MARKER_DETECT,
	/* ステアリング補正走行 */
	STATE_STERRING_ADJUST,
	/* アウトエッジ移行走行 */
	STATE_HEADING_OUT_EDGE,
	/* ステアリング安定化走行 */
	STATE_STERRING_STABILIZING,
};

こんな感じで状態ごとの処理をさせてみる

	// 状態ごとの処理
	switch ( m_state ) {
	case STATE_BEFORE_MARKER_DETECT:
	//[状態]マーカー検知前 () ----------------
		// マーカー検知前の走行
		runBeforeMarkerDetect( pData );
		// 状態遷移を確認する
		stateTransBeforeMarkerDetect ( pData );
		break;

	case STATE_STERRING_ADJUST:
	//[状態]マーカー検知直後(外側にステアリングを切る)----------------
		// ステアリングを補正する
		runSteeringAdjust ( pData );
		// 次の状態に遷移するか確認する
		stateTransSteeringAdjust ( pData );
		break;

	case STATE_HEADING_OUT_EDGE:
	//[状態]アウトエッジ移行)------------------------
		// 走行ロジック
		runrunHeadingOutEdge( *pData );
		// イベント遷移処理
		eventTransrunHeadingOutEdge( *pData );

	case STATE_STERRING_STABILIZING:
	//[状態]マーカー検知後しばらく(安定化走行)------------------------
		// ステアリング走行を安定化する
		runSteeringStabilizing(pData);
		// 次の状態に遷移するか確認する
		stateTransSteeringStabilizing(pData);
		break;
	default:
	//[状態]終了------------------------------------------------------
		m_state = STATE_BEFORE_MARKER_DETECT;
		runningLogicEndFlag = true;
	}

マーカー検知前走行の状態遷移

// マーカー検知前走行のイベント遷移処理
void ActiveMarkerDetectionLogic::stateTransBeforeMarkerDetect(SRunningSituationData *pData) {
	// 灰色を検知したら、ステアリング補正走行に移行する
	if ( MARKER == Data->ColorDistinctionResult ) {
		this->m_state = STATE_STERRING_ADJUST;
		this->m_prevStateEndTime = pData->RunningLapsedTime;
	}
}

ステアリング補正時のイベント遷移処理

void ActiveMarkerDetectionLogic::stateTransSteeringAdjust(SRunningSituationData *pData) {
	// 白か黒を読んだら、マーカー検知前走行に戻る
	if ( ( WHITE == pData->ColorDistinctionResult )  ||
		 ( BLACK == pData->ColorDistinctionResult ) ) {
		 	m_state = STATE_BEFORE_MARKER_DETECT;
		 	return;
	}
	
	// マーカーを見つけた場合は、アウトエッジ移行走行に移行する
	if ( true == pData->ponMarker ) {
		m_state = STATE_HEADING_OUT_EDGE;
	}
}

アウトエッジ移行走行 状態遷移処理

void ActiveMarkerDetectionLogic::eventTransHeadingOutEdge(SRunningSituationData *pData) {
	// アウトエッジ移行の時間が過ぎたら、次の状態に移る
	if ( ( pData->RunningLapsedTime - this->m_prevStateEndTime ) >= MARKER_DETECTION_HEAD_OUTEDGE_TIME ) {
		this->m_state++;
		this->m_prevStateEndTime = pData->RunningLapsedTime;
	}
}

積極的マーカー検知走行のステートマシン図をのっけてみた 20:08 積極的マーカー検知走行のステートマシン図をのっけてみた - れごぼく@メガネボーイズ2008 を含むブックマーク はてなブックマーク - 積極的マーカー検知走行のステートマシン図をのっけてみた - れごぼく@メガネボーイズ2008 積極的マーカー検知走行のステートマシン図をのっけてみた - れごぼく@メガネボーイズ2008 のブックマークコメント

ステートマシン図もどき

f:id:skelton_boy:20081115173411p:image

(1) 検知前走行

  • これは、まだマーカーを見つける前の走行。普通のライントレース。

(2) ステアリング補正走行

  • 走行状況を参照して、灰色を見つけたら、ステアリングタイヤがまっすぐになるように補正する
    • この段階は、マーカーを検知しやすいようにステアリングを補正しているので、マーカーを検知した段階ではない。
  • 図中の表のような場合分けをしているのは、直近の色判定結果が何か?ステアリング操作が何かで、マーカーに入った時のステアリング操作の慣性が違うため。

(3)ひとまず外に切るぜ走行

  • マーカーを見つけたら、アウトエッジに戻す
    • たぶん、普通のライントレースに戻ろうとしている

(4)ステアリング安定化走行

  • ここまでくると、普通のラインとレースと同じ?

ゲスト



トラックバック - http://meganeboy.g.hatena.ne.jp/skelton_boy/20081115