今回の課題は図のようなコースを下の2つの経路のうちどちらかを選択しその経路を辿っていくというものであった。自分はE地点直進コースを選択した。
◦Aスタート
◦E直進
◦F(SOUND_UP)
◦Q一時停止(SOUND_DOWN)&左折
◦R直進(SOUND_UP)
◦S左折(SOUND_UP)
◦G(SOUND_UP)
◦H(SOUND_UP)
◦T一時停止(SOUND_DOWN)&直進
◦T一時停止(SOUND_DOWN)&直進
◦R一時停止(SOUND_DOWN)&左折
◦S直進(SOUND_UP)
◦P左折(SOUND_UP)
◦E一時停止(SOUND_DOWN)&左折
◦A停止(SOUND_DOWN)
E地点右折コース
◦E右折(SOUND_UP)
◦P一時停止(SOUND_DOWN)&左折
◦Q(SOUND_UP)&直進
◦R(SOUND_UP)&左折
◦T一時停止(SOUND_DOWN)&直進
◦T一時停止(SOUND_DOWN)&直進
◦H(SOUND_UP)
◦G(SOUND_UP)
◦S一時停止(SOUND_DOWN)&左折
◦P直進(SOUND_UP)
◦Q左折(SOUND_UP)
◦F(SOUND_UP)
◦E直進
◦A停止(SOUND_DOWN)
ロボット自体は説明書に載っている基本的な形の車体とした。また、右車輪をCへ、左車輪をBへと接続し、光センサーは1番へと接続した。
急なカーブを曲がることが出来るように光センサーをできるだけ車体に近づけた。
光センサーがとても黒い(39以下)と判断した場合、右車輪を後退し、左車輪を前進させ、左旋回する。同様に、少し黒い(45以下)と判断した場合、左折し、ちょうどよいくらいの灰色(52以下)だと判断した場合、直進し、少し白い(55以下)だと判断した場合、右折し、とても白い(55より大きい)と判断した場合右旋回する。これらの動作を繰り返すことにより線の左側をライントレース(run)する。(課題の図を見ればわかる通り、E地点直進コースは基本的に線の左端のみライントレースしていけば課題はクリアできる。)交差点はタイマーリセット(t0=CurrentTick)してから設定した時間(tmax=180)以上左折または左旋回を行った場合交差点だとみなすこととした。この180は色々と計測を繰り返した結果ちょうどよい(ちょうど90°くらい曲がる)と判断したものです。しかしこれではG地点からH地点にかけての半径4の急カーブも左折または左旋回を連続して続けるため交差点だとみなしてしまうので、そこは一度交差点だとみなしてからもう一度直線に戻るまで左折しもう一度ライントレースすることで解決した。(急カーブを曲がれるように光センサーを出来るだけ車体に近づけたがほとんど意味が無かった。)
#define tmax 180 #define goS OnFwd(OUT_BC,100);//直進 #define turnL OnFwd(OUT_C,100);//左折 #define turnR OnFwd(OUT_B,100);//右折 #define spinL OnFwd(OUT_C,200);OnFwd(OUT_B,-200);//左旋回 #define spinR OnFwd(OUT_B,200);OnFwd(OUT_C,-200);//右旋回 #define run while(CurrentTick()-t0<tmax){\ if(SENSOR_1<=39){\ spinR;\ t0 = CurrentTick();\ }else if(SENSOR_1<=45){\ turnR;\ t0 = CurrentTick();\ }else if(SENSOR_1<=52){\ goS;\ t0 = CurrentTick();\ }else if(SENSOR_1<=55){\ turnL;\ }else{\ spinL;\ }\ }\ Off(OUT_BC); #define traverse Wait(1000);turnL;Wait(200);PlaySound(SOUND_DOWN);t0 = CurrentTick();//交差点 #define ignore turnR;Wait(200);PlaySound(SOUND_UP);Off(OUT_BC);t0 = CurrentTick();//T字路等を無視して直進 #define corner turnL;Wait(200);PlaySound(SOUND_UP);Off(OUT_BC);t0 = CurrentTick();//角 #define tightturn spinL;Wait(350);Off(OUT_BC);turnL;Wait(300);//急カーブ #define goal turnR;Wait(200);Off(OUT_BC);//ゴール
task main() { SetSensorLight(S1);//光センサーを定義 long t0 = CurrentTick();//時間を定義 run; corner;//F地点 run; traverse;//Q地点 run; ignore;//R地点 run; corner;//S地点 run; corner;//G地点 run; tightturn; run; corner;//H地点 run; traverse;//T地点 run; traverse;//T地点 run; traverse;//R地点 run; ignore;//S地点 run; corner;//P地点 run; corner;//E地点 run; goal;//A地点 }
前回と比べて自分で考えなければいけないことが多くなり、どのようにすればうまくいくかなどなかなか自分で考えることが出来ず、とても苦労した。具体的に言えば、T字路をどのようにして無視して直進すべきか、急カーブのところで、どうしても左折が続きタイマーリセットがされずに停止してしまうのをいかにすべきかということに悩まされた。次回はもっと柔軟な思考を出来るようにし、もっと早く完成させたい。また、たまにうまくいかないときがあるから、そういうところも分析できるようにしたい。