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

2008-11-15

なんちゃってステートマシンの実装をしてみた 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;
	}
}