#contents
* ロボットの説明 [#h4441f0b]
黒い線の進行方向向かって左側の境界を走行する。ボールはアームではさみこみゴールまで運ぶ。最初のT字路を右折、次の交差点を直進し、A→Cの最短ルートを走行する。
#ref(./デカルト座標.jpg,50%)
#ref(./全体図.jpg,80%)
* プログラムの説明 [#g0ea3610]
赤外線センサーを用い、入射した赤外線の反射強度を取得することにより、ロボットが黒い線のどの辺を走行しているか判断する。
ロボットはコース上を、
1)線の外側
2)線の境界上
3)線の上
の三種類として認識する。進行方向向かって左側の境界上を移動させるので、ロボットの場所によりそれぞれ
1)右にシフト
2)直進
3)左にシフト
ロボットはコース上を、~
1)線の外側~
2)線の境界上~
3)線の上~
の三種類として認識する。進行方向向かって左側の境界上を移動させるので、ロボットの場所によりそれぞれ~
1)右にシフト~
2)直進~
3)左にシフト~
しながら進んでいく。基本的にはwhileループで1[ms]ごとにセンサーの値を取得し、上記の動作を繰り返す。T字路、交差点、ゴール地点では上記の動作とは別の専用のタスクを割り込ませる。
センサーの値は0から100の整数値で与えられる。数値が大きいほど反射強度が高い。
以下にプログラムの詳細を記述する。

**処理や定数の定義 [#q5474a5e]
 #define BLACK 36
 #define WHITE 48
 #define SPEED 25
 #define go_forward OnRev(OUT_BC,SPEED);
 #define turn_left OnRev(OUT_B,SPEED);Off(OUT_C);
 #define turn_right Off(OUT_B);OnRev(OUT_C,SPEED);
 #define STEP 1 //センサーのデータの取得頻度を1[ms]に設定

**サブルーチン [#g2d529d5]
ボールをキャッチする動作
 task catch(){ //ボールキャッチ
 	OnFwd(OUT_A,SPEED);
 	Wait(1000);
 	Off(OUT_A);
 }
ボールをゴールにシュートする動作
 task shoot(){ //シュート
 	turn_left;
 	Wait(800);
 	go_forward;
 	Wait(300);
 	OnRev(OUT_A,SPEED);
 	Wait(1000);
 	Off(OUT_A);
 }

**メインタスク [#d95593b8]
変数の初期化
 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; //フラグをたてる
 				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;
 }



* 問題点 [#ae718112]
-メインコンピューターの電池残量による動作の違い
-ペンの上げ下げの際に、余計な線が残る
-サブルーチンの呼び出しや交差点の処理などを、スタート時からの経過時間に頼って判定しているので、限定されたコースしか走行できない。
-場所の認識数が3パターンだけなのでなめらかに移動できない。
-センサーと車軸が離れている為、センサーが交差点やT字路を認識してもタイヤはまだその地点よりかなり後方にいるので、処理にラグが発生する。
#ref(./mondai.jpg,80%)
* 改善案 [#sa31ea59]
ペンの上げ下げについては、円運動ではなくxy平面に垂直な運動に変更すればよい。
電池残量による動作の違いは、サーボモータの制御を動作時間による指定から、動作角度の指定にすることにより少しは改善したが、やはり電池残量によって動作角度が違ってしまいプログラムに修正が必要であった。
-色の識別数を増やし、行動の種類を増やす。
-車軸とセンサーの距離を小さくする


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