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

2008-11-16

ステアリングの慣性の違いをどう検出するか 15:04 ステアリングの慣性の違いをどう検出するか - れごぼく@メガネボーイズ2008 を含むブックマーク はてなブックマーク - ステアリングの慣性の違いをどう検出するか - れごぼく@メガネボーイズ2008 ステアリングの慣性の違いをどう検出するか - れごぼく@メガネボーイズ2008 のブックマークコメント

ステアリング補正をするには現在のステアリングの慣性の向きを把握しないといけない

fj氏、曰く。

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

黒の1個前と連続検出回数を記録しておけばいいんじゃない?

fj氏、曰く。

ふむふむ。

 平均的な黒の期間を計算しておいて、直近の黒の期間が、その半分よりも長かったら「↑」で、短かったら「↓」かなぁ。
「負けないもん。」: 平均的な黒の期間はもうオンコードでもいいかと思う。

つまりは、平均で黒の連続回数が5回の場合

  • 「○●●●●●●●●●●●●○」となってれば黒が過多、つまり右に慣性がかかっている状態と考える。
  • 「○●●○」となっていれば、白が過多?と考えて、左側に慣性がかかっている状態と考える。

OK。その路線で攻めてみよう。

まず変数を用意してみた

	// 現在の黒の連続回数
	unsigned short m_blackCtCur;

	// 1つ前の黒の連続回数
	unsigned short m_blackCtPrev;

マーカー検知前走行のときに、黒の検出連続回数を記録しておく

マーカー検知前の走行のときに記録しておきます。

ノイズまじってたらどうすんだ?という話もありますけど、Application側ではノイズが除去されたきれいな世界を想定してやります。

ノイズの除去的なのは、Mechanismで対処すべきでしょう。

// マーカー検知前の走行
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;
		
		// 黒の検出回数を記録しておく
		this->m_blackCtPrev = this->m_blackCtCur;
		this->m_blackCtCur = 0;
	} 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;
		this->m_blackCtCur++;
	} 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);
}

マーカー検知前走行のイベント遷移処理

慣性の方向を気にするのは、補正走行に入る直前。

このときに決めた方向に補正を行うことになる。


void ActiveMarkerDetectionLogic::stateTransBeforeMarkerDetect(SRunningSituationData *pData) {
	// 灰色を検知したら、ステアリング補正走行に移行する
	if ( MARKER == pData->ColorDistinctionResult ) {
		m_steeringDirForAdjust = NO_TURN;
		this->m_state = STATE_STERRING_ADJUST;
		this->m_prevStateEndTime = pData->RunningLapsedTime;
		

		// 黒の検出回数を記録しておく
		this->m_blackCtPrev = this->m_blackCtCur;
		this->m_blackCtCur = 0;

		// 遷移する前にステアリング補正の向きを決めておく
		
		// 直前の色が白なら右に
		if ( WHITE == this->m_lastColor ) {
			m_steeringDirForAdjust = RIGHT_TURN;
		}
		
		// 直前が黒で、黒検出過多な場合は、左に
		if ( ( BLACK == this->m_lastColor ) && ( AVG_BLACK_DETECT_COUNT <= this->m_blackCtPrev )) {
			m_steeringDirForAdjust = LEFT_TURN;
		}
	}
}

マーカー検知後のステアリング補正走行

void ActiveMarkerDetectionLogic::runSteeringAdjust(SRunningSituationData *pData) {
	
	// ステアリング補正がもう不要な場合はブレーキをかける
	if ( ( STEERING_ADJUST_COUNT <= this->m_steeringAdjustCount ) ||
		 ( NO_TURN == m_steeringDirForAdjust ) ) {
		 	this->m_pSteeringUnit->fix ( 5 );
	} else {
		this->m_steeringAdjustCount++;
		this->m_pSteeringUnit->turn(m_steeringDirForAdjust, MARKER_DETECTION_ON_MARKER_STEERING_SPEED);
	}

}