#contents
* ロボットの説明 [#pd3f2927]
モーターA,Bに左右のタイヤをつけ、モーターCにアームを取り付けた。ボールはカタパルト方式で射出する。最初に360°回転し、空き缶の位置を記録する。次に記録した方向に向き、空き缶との距離が15cmになるまで前進する。
#ref(./2015a-mission2.png,50%)
#ref(./open.jpg,25%)
#ref(./close.jpg,25%)
* プログラムの説明 [#k5bc81ce]
プログラムは~
1)空き缶の位置(角度)の測定~
2)空き缶の位置を向く~
3)空き缶に向かって前進~
4)ボールの射出~
の順で動く。~
**定数や関数の定義 [#z221a145]
 #define turn_left OnFwd(OUT_A,25);OnRev(OUT_B,25);
 #define turn_right OnFwd(OUT_B,25);OnRev(OUT_A,25);
 #define go_forward OnFwd(OUT_AB,25);
 #define TURN_TIME_10=147; //10°回転するのにかかる時間
TURN_TIME_10の決定は、ロボットを回転させ180°回転するのに要する時間を計10回測定し、それのっ平均を18で割った値である。
**空き缶の位置(角度)の測定 [#a7c1ec1d]
 int scan_angle(int a){ //0<=a<=36で指定 a*10°の範囲をスキャンする
 	PlaySound(SOUND_CLICK);
 	Wait(500);
 	int min_temp=0; //仮の最小値
 	int min=100; //最小値
 	int angle=0; //最小値を記録した角度[°]
 	int i=0; //i*10[°]ごと記録する
 	int turn_time=TURN_TIME_10;
 	repeat(a){
 		min_temp=SensorUS(S4);
 		if(min>=min_temp){ //最小値比較
 			min=min_temp; //最小値更新
 			angle=i*10; //最小値
 			PlaySound(SOUND_LOW_BEEP);
 			Wait(500);
 		}
 		turn_right;
 		Wait(turn_time);
 		i++;
 	}
 	return angle;
 }
**サブルーチン [#p0dcd450]
ボールをキャッチする動作
 task catch(){ //ボールキャッチ
 	OnFwd(OUT_A,SPEED);
 	Wait(1000);
 	Off(OUT_A);
 }
ボールをゴールにシュートする動作
A→Bの場合~
 task shoot(){
 	turn_right;
 	Wait(1000);
 	go_forward;
 	Wait(300);
 	Off(OUT_B);
 	Off(OUT_C);
 	OnRev(OUT_A,SPEED);
 	Wait(1000);
 	Off(OUT_A);
 }
A→Cの場合~
 task shoot(){
 	turn_left;
 	Wait(800);
 	go_forward;
 	Wait(300);
 	OnRev(OUT_A,SPEED);
 	Wait(1000);
 	Off(OUT_A);
 }

**メインタスク [#off12e44]
変数の初期化
 task main(){
 	SetSensorLight(S3);
 	int n=0; //黒の上にいる時間を計測するための変数
 	int flg1=0; //交差点通過前=0 交差点通過後=1
 	int flg2=0; //ゴール判定用のフラグ
 	int flg3=0; //ボールキャッチ前=0 ボールキャッチ後=1
 	long t0=CurrentTick();
~
ループさせるメインタスク。ゴール判定用のフラグが立つまで繰り返す。
 	while(flg2==0){
 		if(CurrentTick()-t0>7500 && flg3==0){ //ボールキャッチ
 			start catch;
 			flg3=1;
 		}else if(SENSOR_3 < BLACK){ //白の上なら
 			turn_left;
 			n++;
 			if(n>1200 && CurrentTick()-t0>9000 && flg1==0){ //黒の上に1秒以上 & スタートから9.5秒以上経過しているなら
 				Off(OUT_BC);
 				n=0; //リセット
 				flg1=1; //フラグをたてる
A→Bの場合
                                 turn_left2;
				Wait(700);

A→Cの場合
 				go_forward;
以下共通 				Wait(1000);~
 			}else if(n>1400 && flg1==1){
 				flg2=1; //ゴール判定用のフラグをたてる
 			}
 
 	        }else if(SENSOR_3 < WHITE){ //グレーなら
 			go_forward;
 		}else{ //それ以外(白)なら
 			turn_right;
 		}
 		Wait(STEP);
 	}
ゴール判定後にシュートさせるサブルーチンを呼び出す。
 	start shoot;
 }



* 問題点 [#lcb18621]
-サブルーチンの呼び出しや交差点の処理などを、スタート時からの経過時間に頼って判定しているので、限定されたコースしか走行できない。また電池の消耗により、同じ経過時間でも進む速度に差が発生するので、そのつど定数の書き換えをしなければならない。
-場所の認識数が3パターンだけなのでなめらかに移動できない。
-センサーと車軸が離れている為、センサーが交差点やT字路を認識してもタイヤはまだその地点よりかなり後方にいるので、処理にラグが発生する。
#ref(./mondai.jpg,80%)
* 改善案 [#u3080db2]
-色の識別数を増やし、行動の種類を増やす。
-車軸とセンサーの距離を小さくする



トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS