下図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成する。A地点に入る(ゴール)交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止する。課題1で使ったロボットを活用。組み立て説明書に書いてあるものにカラーセンサーとボールを拾うためのシャベルのようなものを付けた。課題の目的がライントレースをすることなので、まずライントレースを使ってゴールまでたどり着くことを第一目標にした。†どうやって線をたどるかだが基本的に下図のようにプログラムする。黒い線をたどる時を考える。青はロボット、赤が動く軌跡とする。カラーセンサーを下を向くようにロボットに取り付け、明るさ(白がどれだけ多いか)を計測することで黒線の上にいるのか、いないのかを判断する。黒線の上、つまり黒が多いとき左に曲がり、黒線の上にいないときは右に曲がることを連続して行えば黒線の左側を走ることができる。黒線の右側を走りたいときは下図のように曲がる方向を逆にすればいい。先に言うと今回「交差点」は判断してません。「黒がすごい多い場所」と認識させました。そのため交差点でなくとも黒ければロボットは「交差点」と認識してしまうでしょう。今回のルート以外はまずゴールまでたどり着けません。今回作ったプログラムの基本はライントレース、それと何回黒い部分を通ったかでできています。その「何回目の黒い部分」かで交差点を判断しています。0黒い線を何回越えたかを数える変数。黒い線を数えることで交差点やT字路を認識させ、その回数によって今使っているプログラムから別のプログラムへ移行させた。i,k,pは個人的に場所で分けた方がわかりやすい気がしたので分けたが役割が同じなので一つにしても構わない。分けない方がわかりやすかったかもしれない。今回一回しか使わない動作を関数として作ったりしたため後から読むとすごくわかりにくくなっています。sleep(0.3)左に曲がる、ライントレース用。sleep(2)右に曲がる、ライントレース用。sleep(3)最後の動作、正直何のための動作なのか私にもわからない。move_forward()else:今回のプログラムは常に現在のカラーセンサーの値をstateにおき変え続け、stateの値によって動作を決定する。予想と動作が場合、修正がしやすいようにその時のカラーセンサーの値が確認できるようにprint(state)でしている。while関数を使いライントレースを行う。上に書いたライントレースの方法に加えて白が多すぎるとき後ろに戻るようにしている。しないと急なカーブがうまく曲がれなかった。MからKまではただライントレースしていればいいのだがそのままだとKからJに行ってしまう。stateが15以下の時、つまり線KLの上を通る時まっすぐ進むようにしている。何度試した結果からMからLまでstateは86までしかいかないことが分かった。Lに着くと前に進み、後ろに戻るという動作を何回か繰り返した後stateが87を超えることが分かった。state>86となったときiを+1し、ボールを拾い、180度回転するようにした。このプログラムはiが0の間だけ続くのでiを+1したことで次のプログラムに行くようにしている。ちなみにここでちゃんとボールを拾えたのは2回だけだった。†Lで回転する前はロボットは下図のようになっている。赤線がロボットを表しとがっている方が前です。カラーセンサーは前についているのでこのまま180度回転するとカラーセンサーが線の右側にいくのでここから線の右側を走ります。move_forward()else:今回はKで曲がるため15以下でiを+1し、少し前に進み、右に曲がるようにする。iを+1する理由は前のプログラムと同じ。前に進み右に曲がるのはこの後線の左側を走るため。ここで運がよかったのか、たまたまカラーセンサーがJの上に来るためKからJのプログラムが不要に。move_forward()else:意図せずJの上に来なかったときようの保険になったプログラム。Jで一度止まるためsleep(1)を入れている。move_forward2()は次のJからGまでの項目で説明する。move_forward()else:まずJで止まったところからの動きを説明する。赤線がロボット、とがっている方が前。上図の番号の順に進む。move_left2()move_forward2()のプログラムで図の�までいく。move_back()によって�まで戻り線の左側を走る。JからHまでのプログラムは黒線はまっすぐ通るようにし、黒線を2回通ったら終わるようにしている。move_forward()else:Gに着くとmove_left3()によって下図の赤丸の位置に移動させる。move_forward()else:上図の赤丸の位置からライントレースの動きで線まで戻り、線の右側を走る。Dの交差点に着くとsleep関数で一度止まり一気に進むことで交差点を超える。move_forward()最後もこれまでと同様にAの黒線を認識したら一度sleep関数で止まり、シャベルを下げ、最後に謎の動きをする。†2回完璧にミッションをクリアしたので私としては満足のいく結果だった。ライントレースと言っていいのか微妙な点がかなりあったのとゴールすることを優先したためボールを拾うのがあまりうまくいかなかった。最後に読みやすいようにプログラム全文を載せておきます。