2013a/Member

ロボットの紹介

robo.jpg

特徴はアームが大きいことです.コンピュータ部分がデフォルトのものより上に位置しています.

コース攻略法

時計回りについてのみ書きます.
始めの十字路は左側をトレースし,あえて交差点の識別をしていません.
これは,時計回りのコースへの導入をするためです.
次に缶の一歩手前で停止し,つかんでから右側のトレースへと入ります.
交差点をいくつか通り,道なりに進みます.
最後の交差点を通過後,一定時間がたってから180°回転して缶を置き,スタート地点に戻ります.
このときもまた,交差点の識別を行っていません.

プログラムの説明

#define CENTER 45 //光センサーの値の基準値
#define CCC 14000 //最後の交差点から,缶を置くために旋回する地点まで進むのにかかる時間
#define SPEED_H 52 //高速走行時のスピード
#define SPEED_L 32 //低速走行時のスピード
#define turn_R Off(OUT_B); OnFwd(OUT_C,SPEED_L);
#define turn_L Off(OUT_C); OnFwd(OUT_B,SPEED_L);
#define turn_SR OnRev(OUT_B,SPEED_L); OnFwd(OUT_C,SPEED_L);
#define turn_SL OnRev(OUT_C,SPEED_L); OnFwd(OUT_B,SPEED_L);
#define go_F OnFwd(OUT_BC,SPEED_H);
#define STEP 1
#define nMAX 330
#define short_break Off(OUT_BC);Wait(400);
#define CROSS_TIME 400
#define cross_line OnFwd(OUT_B,SPEED_L);OnFwd(OUT_C,SPEED_L);Wait(CROSS_TIME);short_break;
#define cross OnFwd(OUT_C,SPEED_L);OnFwd(OUT_B,SPEED_L);Wait(CROSS_TIME+200);short_break;
#define go_b OnFwd(OUT_B,-50);OnFwd(OUT_C,-50);

以上が変数,マクロの定義.

sub trace_R()
{
	int n;
	while(true) {
		while(n < nMAX) {
			if(SENSOR_1 < CENTER-12) {
				turn_SR;
				n++;
			} else {
				if(SENSOR_1 < CENTER-6) {
					turn_R;
				} else if(SENSOR_1 < CENTER+6) {
					go_F;
				} else if(SENSOR_1 < CENTER+12) {
					turn_L;
				} else {
					turn_SL;
				}
				n=0;
			}
			Wait(STEP);
		}
		short_break;
		turn_SL;Wait(nMAX*STEP);
		cross;
		n=0;
		break;
	}
}

ラインの右側をトレースするサブルーチン.交差点に差し掛かるとループが終わる.

sub trace_L()
{
	int n;
	while(true) {
		while(n < nMAX) {
			if(SENSOR_1 < CENTER-12) {
				turn_SL;
				n++;
			} else {
				if(SENSOR_1 < CENTER-6) {
					turn_L;
				} else if(SENSOR_1 < CENTER+6) {
					go_F;
				} else if(SENSOR_1 < CENTER+12) {
					turn_R;
				} else {
					turn_SR;
				}
				n=0;
			}
			Wait(STEP);
		}
		short_break;
		turn_SR;Wait(nMAX*STEP);
		cross;
		n=0;
		break;
	}
}

ラインの左側をトレースするサブルーチン.交差点に差し掛かるとループが終わる.

task main() 
{
	SetSensorLight(S1);
	SetSensorTouch(S3);
	int n=0,count = 0;
	long t = 0;
	
	if(t >= 0){
		t = CurrentTick();
		while(true){
			if(SENSOR_1 < CENTER-9){
				if(SENSOR_1 < CENTER-19){
					turn_L;
				}else{
					turn_SL;
				}
			}else if(SENSOR_1 < CENTER+2){
				go_F;
			}else{
				if(SENSOR_1 < CENTER){
					turn_SR;
				}else{
					turn_R;
				}
			}
			Wait(STEP);
			if(CurrentTick() - t > 7000){
				break;
			}
		}
	}

交差点の識別を行わないトレース.

	
	short_break;
	OnFwd(OUT_A,-30);
	turn_SR;
	Wait(520);
	Off(OUT_BC);

休憩ののち,缶をつかんで回転.回転するのは左側から右側のトレースにスムーズに移行するため.

	
	trace_R();
		
	trace_L();
	
	trace_L();
	
	trace_L();

ラインの右側,左側トレースを切り替える.これは交差点をうまく識別できるようにするため.

	
	t=CurrentTick();
	
	while(true) {
		while(CurrentTick()-t <= CCC) {
			if(SENSOR_1 < CENTER-12) {
				turn_SL;
			} else {
				if(SENSOR_1 < CENTER-6) {
					turn_L;
				} else if(SENSOR_1 < CENTER+6) {
					go_F;
				} else if(SENSOR_1 < CENTER+12) {
					turn_R;
				} else {
					turn_SR;
				}
			}
		}
		break;
	}
	
	turn_SR;
	Wait(2700);
	OnFwd(OUT_A,30);
	Wait(300);
	Off(OUT_A);
	go_b;
	Wait(600);
	turn_SR;
	Wait(1100);
	Off(OUT_BC);

最後の交差点から時間を計り,一定時間経過後に180°回転してアームをゆるめ,缶を置く.

	while(true) {
		while(n < nMAX) {
			if(SENSOR_1 < CENTER-12) {
				turn_SL;
			} else {
				if(SENSOR_1 < CENTER-6) {
					turn_L;
				} else if(SENSOR_1 < CENTER+6) {
					go_F;
				} else if(SENSOR_1 < CENTER+12) {
					turn_R;
				} else {
					turn_SR;
				}
				n=0;
			}
			Wait(STEP);
		}
	}
	
}

再び交差点の識別を行わないトレース.これによって最初の地点に戻ることを可能にしている.

まとめ

ロボットはモーター一つでつかむ機構を考えるのに時間がかかりました.
また,プログラミングでは,交差点の認識が出来なかったり,急カーブを交差点と誤認識してしまったりして,トレースに苦労しました.
さらに,時間を計って缶を置くときに,実験するたびに大幅に置く場所が変わって調節が大変でした.
これは電池の残量の変化や光の加減,トレースの仕方に問題があった(あまりなめらかでなかった)ためではないかと思われます.
しかし,結果的にはほぼうまくいったので成功したということで締めくくりたいと思います.
今後のロボコンに於いても今回の反省点を活かしてロボット製作・プログラミングに取り組みたいです.

添付ファイル: filerobo.jpg 214件 [詳細] fileprogram2.nxc 124件 [詳細] fileprogram.nxc 111件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-08-17 (土) 03:21:16