[[2014b/Member]] #contents *課題内容 [#v7150b51] 今回の課題はライントレースと交差点の横断をするものであり、下の指示のとおりにロボットが動作するものとする。 +一回目に交差点にさしかかった時は左折 +二回目の交差点は右折 +三回目は左折 +四回目は直進 +五回目は直進 → ゴール #ref(./robo.png,50%) #ref(./robo.png,75%) *ロボット [#z5ac7a0a] ロボットは通常走行する元のロボットに光センサを取り付けたものである。マインドストームの説明書に載っているものをベースとしたが、光センサーの値の変化をなくすために地面に近くなるようにした。 *プログラム [#b2078e15] 今回のプログラミングは黒い線のコースに沿って走行し、交差点に進入した際にはカウンタ機能を用いて交差点を判断させるようにした。交差点を急なカーブと考え、繰り返し向きを修正し一定の回数連続して黒になった場合はそれを交差点とみなすことにし、横断するようにする。カウンタ機能はその際の黒になる回数を数える時に用いる。また、タイマ機能も用いておおよその交差点通過時刻を予測し、交差点の判断を精度よくできるようにした。 定義は以下のとおり #define THRESHOLD 45 #define HiSPEED 50 #define LoSPEED 40 #define go_forward OnFwd(OUT_BC,HiSPEED); #define turn_left1 OnFwd(OUT_B,HiSPEED); OnFwd(OUT_C,-LoSPEED); //左旋回 #define turn_right1 OnFwd(OUT_C,HiSPEED); OnFwd(OUT_B,-LoSPEED); //右旋回 #define turn_left OnFwd(OUT_B,HiSPEED); //左折 #define turn_right OnFwd(OUT_C,HiSPEED); //右折 #define STEP 1 //1回の判断で動作させる時間 #define nMAX 300 //通常のカーブとして許容できる繰り返しの最大値 #define short_break Off(OUT_BC);turn_right;Wait(nMAX*STEP);Wait(500); //小休憩 #define CROSS_TIME 200 //交差点通過にかかる時間 #define cross_line OnFwd(OUT_BC,HiSPEED);Wait(CROSS_TIME); //交差点を渡る センサの設定 task main() { SetSensorLight(S3); long t0=CurrentTick(); int nOnline=0; コースの判断を行う while(true){ if(CurrentTick()-t0<nMAX){ if(SENSOR_3<THRESHOLD-10){turn_left1;} else{if(SENSOR_3<THRESHOLD-5){turn_left;} else if(SENSOR_3<THRESHOLD+5){go_forward;} else if(SENSOR_3<THRESHOLD+10){turn_right;} else {turn_right1;} t0=CurrentTick(); } } 交差点を渡る else{ short_break; cross_line; nOnline++;t0=CurrentTick(); } } } *反省と考察 [#kb7a6b13] -最初の交差点は左折できたが、二回目の右折する交差点がうまくいかなかった。二回目の交差点を判断するプログラムのしきい値と右折などの指示が適切でなかったと気づいたので次回に生かしたいと思った。 -急なカーブを曲がる際にカウンタ機能で判断するはずだが、ここでコースを大きく外れてしまうことがあった。タイマ機能を用いるときにtMAXの値が適切でなかったか、旋回する時のプログラムがもっと詰めれたかと思う。だが、コースを外れても線を探し出し再び戻ることもできたのでよかった。 -しきい値を五段階に分けてその際の動きを指示することはできたが、右折や交差点の直進などその場に応じたプログラムができなかった。場所に応じたプログラムは場所ごとに細かく書けば正確にロボットが動作できると分かったのでこれも勉強したい。 -全体的に勉強不足な面が目立ち失敗も目立ったので、それぞれのプログラムは何を意味しているかを考え適切に使えるようになりたい。