今回の課題はルートA→BまたはルートB→Aをうまくライントレースすることである。今回の課題はただライントレースをするだけでなく交差点での動作が重要である。今回、私はルートB→Aを担当します。今回はロボットは基本的にテキストに乗っているベースの型でやることになっているので割愛します。今回は交差点をどう認識し、ラインをトレースするとき線のどちら側をトレースするかを重視して組んだ。できるだけ早くゴールできるようにする工夫もした。†この部分では主に三つの事を定義している。一つは黒と白を見分けるための色の閾値とスピードである。二つ目はライントレースを行うための動作である。三つ目は交差点での動作である。下の三つの定義がそれにあたる。†このsub関数で交差点での動作を決定している。下のMain関数で交差点の数を数える部分があり、そこで交差点に来るたびにsub関数を実行し、最後にcounterという変数に1を加えることで再びsub関数に入った時次の動作を行うことができるようになっている。交差点での動作は上で定義してあるとおりである。今までに通った交差点の数が0、1、5、6のどれかであるときかつ濃い線の上にいるときにこれを実行する。この時はラインの右側にいるので左方向へ進む。counter1に1を加える。これによって濃い線の上にいる時間をカウントいている。このcounter1が一定以上の値になった時に交差点であると認識している。今までに通った交差点の数が二つであるときかつ濃い黒線の上であるときにこれを実行する。ここではcounter2という変数を別に用意してcounter2の値が一定以下の時にcounter1の値を初期化している。逆の場合はcounter1に1を加える。二つ関数を用意している理由はcounter1の値が250以上の時に交差点と認識するようになっているが三つ目の交差点前ではそれではうまくいかなかったためである。今までに通った交差点の数が3の時かつ黒い線の上であるときにこの動作を行う。ここでもcouter1にこの動作を行うたびに1を加える。通った交差点の数が上記以外すなわち4の時かつ黒い線の上のときにこの動作を行う。これも同様にcounter1に1を加える。†ここでは上で数え続けたcounter1が250を超えたときの動作である。250を超えた場合は交差点であると判断して動作を行う。具体的には上で記したsub関数を実行する。最初はcounterの値は0であるから上のSub関数では右折を行うようになっている。counterに1を加える。これが今までに通った交差点の数に該当する。counter1の値を初期化することでまたライントレースに戻る。ラインの右側か左側かでライントレースでの動きが逆になるためそれぞれの交差点を通過後の動作が用意されている。†BLACKよりは明るいがWHITEより暗い場所は境界線付近であると判断する。境界線付近では前進をすることによって少しでもタイムを縮められるように工夫をしている。†ここは白い部分での動作なので線を見失ってから線を探す動作を行うところである。上の黒線上での動作同様にラインの右側か左側かで動作が異なるのでそれぞれの交差点を通過した後で動作が異なるようになっている。†このプログラムでは基本的に黒い線の上にいるときにcounter1に1を加える動作を繰り返し、一定以上になったら交差点であると判断して右折、左折、直進のどれかを行いcounterに1を加える。counterは今までに通った交差点の数を記録する変数である。今回のプログラムでの工夫点は交差点の数を数えてその数に応じてサブルーチンの挙動を変えたことである。二回目の交差点を回った後は誤作動が起きないように別の関数でカウントすることをした。交差点を越えた時にできるだけカーブの外側をライントレースするように移動をしカーブを曲がる時に片方のタイヤだけ回すか両方を回すかまた、白と黒の時の回転方向を変えることも行った。今回の課題での最後までの成功率はあまり高くなかった。タイムも大体3分ぐらいであった。成功率が低い要因の一つに紙を折り曲げてしまったことがあると思う。次の機会があったら紙を丸めるなどの工夫をしたい。今回の課題では本当は5段階でラインを認識して滑らかに動くようにしかたかったが紙を折り曲げてしまったことと線の濃さが不均一であったため不可能であった。次の機会があればそこを改善しプログラムもより改善して早くゴールできるようにしたい。このミッションの後半で電池が減ってきてうまく動かなくなり交換をしたら逆に動きすぎてまた調整し直すことになりとても苦労した。次の課題は時間ではなくモーターの回転などを利用したプログラムしていきたいと思う。回転数で制御すれば移動距離が変わらないためである。