2019a/Member 目次
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ.
黒線の幅は20mmでなるべく均等な濃さにすること。 ゴールには、長さ15または16のブロックおく.
A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする).
A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール)
交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること.
ロボットのサイズやアームについて工夫した.
タイヤ間をモーター分だけにして小回りが利くようにした.
モーターで開閉でき向きを変えればシュートを打てるアームを作った.(正面)
モーターで開閉でき向きを変えればシュートを打てるアームを作った.(上)
RUN_TIMEや旋回について以下のように定義した.
#define RUN_TIME1 800 #define RUN_TIME2 500 #define RUN_TIME_GHIJ 480 #define RUN_TIME_LM 1500 #define turn_right OnFwd(OUT_A);OnRev(OUT_C); #define turn_left OnFwd(OUT_C);OnRev(OUT_A);
交差点を判断するために黒を検知する時間をとった.まずラインとレースに支障が出ず,その後の直進や曲がるときに大きな動きにならない時間を測った.その時間より長くセンサーが黒を感知すると一秒停止するようにした.
D地点までのプログラム
sub line_trace1() //Dの交差点で止まるまでライントレースし続けるプログラム { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=RUN_TIME1){ if(40<SENSOR_2){ OnFwd(OUT_A);Off(OUT_C);ClearTimer(0); }else if(35<SENSOR_2<40){ Off(OUT_A);OnFwd(OUT_C); }else{ OnRev(OUT_A);OnFwd(OUT_C); } } Off(OUT_AC);Wait(100); }
DからGまでのラインとレースのプログラム
sub line_trace2() //DからG(交差点)までライントレースするプログラム { SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=RUN_TIME2){ if(40<SENSOR_2){ OnFwd(OUT_A);Off(OUT_C);ClearTimer(0); }else if(35<SENSOR_2<40){ Off(OUT_A);OnFwd(OUT_C); }else{ OnRev(OUT_A);OnFwd(OUT_C); } } Off(OUT_AC);Wait(100); }
GHI間のラインとレースするプログラム
sub line_trace_GHIJ() //GHIJ間のライントレース(内側) {SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=RUN_TIME_GHIJ){ if(40<SENSOR_2){ OnFwd(OUT_A);Off(OUT_C); }else if(35<SENSOR_2<40){ Off(OUT_A);OnFwd(OUT_C); }else{ OnRev(OUT_A);OnFwd(OUT_C); } } Off(OUT_AC);Wait(100); }
LM間のラインとレースするプログラム
sub line_trace_LM() //LM間のライントレース {SetSensor(SENSOR_2,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=RUN_TIME_LM){ if(40<SENSOR_2){ OnFwd(OUT_A);Off(OUT_C); }else if(35<SENSOR_2<40){ Off(OUT_A);OnFwd(OUT_C); }else{ OnRev(OUT_A);OnFwd(OUT_C); } } }
task main(){ OnFwd(OUT_AC);Wait(100);//Aからライン上(外側)まで動かす line_trace1();//D地点の交差点までライントレース turn_right;Wait(45);OnFwd(OUT_AC);Wait(15); //停止後、右に旋回して位置調整し、少し前に進んで次のライントレースに備える line_trace2();//DEFGのライントレース turn_right;Wait(45);OnFwd(OUT_AC);Wait(25);//内側をライントレースするために位置調整 line_trace_GHIJ();// turn_right;Wait(100);OnFwd(OUT_AC);Wait(15); //J点で右に90度旋回し、まっすぐ進んで黒線を超える line_trace2();//交差点用ライントレース OnFwd(OUT_AC);Wait(15);//外側を通りたいので、少しまっすぐ動く turn_left;Wait(70);OnFwd(OUT_AC);Wait(100); //左に旋回しKLのセント車体を平行に、その 後L地点まで移動 OnFwd(OUT_B);Wait(15);//バンパーを閉じ、たまをキャッチ turn_right;Wait(200);//180度旋回 line_trace_LM();// turn_right(15);Off(OUT_AC);//車体を真っ直ぐにし、停止 OnRev(OUT_B);Wait(15);//バンパーを開く OnRev(OUT_AC);Wait(300);//車体を後ろに下げる OnFwd(OUT_B);Wait(15);//バンパーを閉じる OnFwd(OUT_AC);Wait(300);//直進してたまをシュートする }
今回の課題では交差点の判断をうまくしてくれなかったり,直角や急カーブをうまく曲がり切れなかったりして難しかった.最後は成功したがなぜ失敗するか考えるのが難しかった.ロボットやプログラムの改良をもっとスムーズにできるようにしたい.