今回、私は一つ目のルートを進ませる。一つ目のルートは交差点を二回まっすぐ進み、一回左折する動作をするので、ルートの左側の境界線に沿ってトレースさせた方が良いと考えた。
黒の部分を進んでいく時間をタイマーで計って白に進むと戻る方向に曲がるようにして、黒の部分を進む時間が一定時間超えると交差点だと認識するようにした。交差点を認識したら黒の部分認識している間行きたい方向に動くようにした。
最初に組み立てたロボットは付属の説明書に載っているようなスタンダードなものにした。
何度も動作とプログラミングを繰り返しても出来たかった。もともと組み立てたロボットのセンサーの位置がロボット本体の前のほうにくっついているためセンサーとロボットとの間に反応する差が生じるためプログラミングを何度も書き直しても成功するのは難しいと考えた。
最も改善した点はロボット本体を組み替えたことである。センサーの部分をできるだけロボット本体の真ん中に位置できるように組み立てるように意識して作った。
次に改善したのは交差点を認識した後のプログラムである。前のプログラムでは黒の部分認識している間動かしてが間違ってその後認識して違う方向でトレースさせてしまうので認識したら一定時間行きたい方向に進むように方向転換するようにした。
以下が最終的に出来たプログラムである。
#define Black 44 //これ以下は黒と認識 #define White 51 //これ以上は白と認識 #define turn_time 8 #define turn_right OnFwd(OUT_A); OnRev(OUT_C); Wait(turn_time); //右へ旋回 #define turn_rightt OnFwd(OUT_A); Off(OUT_C); Wait(turn_time);//右折 #define turn_left OnFwd(OUT_C); OnRev(OUT_A); Wait(turn_time); //左へ旋回 #define turn_leftt OnFwd(OUT_C); Off(OUT_A); Wait(turn_time);//左折 #define go_forward(t) OnFwd(OUT_AC); Wait(t); Off(OUT_AC);//直進 #define STEP 1
基本的な動きを左右の旋回と曲がること、そして直進の計5つを上で定義している。
sub trace_line() { ClearTimer(0); //0番目のタイマをリセット while (FastTimer(0) < 42) { if (SENSOR_2 <= Black) { //黒なら turn_left; //左へ旋回 } else if (SENSOR_2 < Black +3) { //黒よりの灰色なら turn_leftt; //左折 } else if (SENSOR_2 > White -3) { //白よりの灰色なら turn_rightt; //右折 ClearTimer(0); } else if (SENSOR_2 >= White) { //白なら turn_right; //右へ旋回 ClearTimer(0); } else { //それ以外なら OnFwd(OUT_AC); //直進 ClearTimer(0); } Wait(STEP); } Off(OUT_AC); PlaySound(SOUND_UP); //交差点で音が鳴る Wait(100); }
線の境界線上に沿って進ませて、交差点に来たら音が鳴って止まるようにするプログラムが上記である。黒、白、黒寄りの灰色、白寄りの灰色の4つに分けてそれぞれの動作をさせることによって動きの正確性をあげた。 交差点の判断方法を具体的に言うと、ロボットの左側に黒のライン、右側に白が来るようにしてライントレースをするようにした。 また、黒または黒に近いグレーの判断が0.42秒続いたら交差点と判断した。黒または黒に近い灰色という判断が交差点では続くため、このようにした。白と白に近い灰色と判断したら、ClearTimer(0)によってFastimer(0)の値を0にすることでこの判断を出来るようにした。
sub cross_straight() //左に傾いたのを戻して交差点をまっすぐ { OnFwd(OUT_A); Off(OUT_C); Wait(30); Wait(STEP); } sub cross_left() //左に傾いたのを少し右に動かしてトレースさせて左折 { while (SENSOR_2 >= White ) { turn_right; Wait(STEP); } }
上記が交差点で止まったときに使ったサブルーチンである。
task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); go_forward(200); trace_line(); cross_straight(); //P点での交差点をまっすぐ trace_line(); cross_straight(); //Q点での交差点をまっすぐ trace_line(); cross_straight(); //Q点での交差点をまっすぐ trace_line(); cross_left(); // R点での交差点を左折 trace_line(); turn_right OnFwd(OUT_A); OnRev(OUT_C); Wait(15); //Bに入ったところを交差点と認識するので認識したら左に傾いたのを少し右にずらすことでまっすぐにする go_forward(60); //Bの四角の中にまっすぐ進む }
大きな改善をした後はロボットに動作をさせるのとプログラミングを少し修正させるのを繰り返した結果、3回やって2回ぐらいの確率で成功するに至った。失敗するのは始めに動かし始める場所や角度によってトレースしたあとの場所が少し変わって間違って交差点を認識してしまうときがあった。改善するためにはもっと細かく進むラインの色を見分けてそれぞれに進み方と進む時間を変える必要があると考える。
前回の課題でうまくいくことができなかったため今回は前回以上に時間をかけて自分なりに頑張ったつもりである。その成果もあり100%の確率とはいかないまでも何度か成功できるに至ったのは嬉しかった。今回の嬉しさを忘れずに次の課題も頑張りたいと思う。