†ロボティクス入門ゼミ2つ目の課題は、ロボットにセンサーをつけ、黒い線の、与えられたコースに沿って走るロボットを作ることでした。コースは3種類あり、3人グループなので、1人1つコースを選んでプログラミングをすることになります。僕は1つ目のコースの、A地点からB地点へのコースを担当しました。コースについて説明します。→Q直進→Q直進→R左折→B地点というコースです。今回の課題は「決められたコースを走るロボットを作る」だと思い、「交差点間の距離や通過にかかる時間を利用して走るロボット」を作ってしまいました。本来であれば、「交差点とカーブを判別して走るロボット」を作らなければならなかったらしいです。情報が伝わっておらず、直すわけにもいかないので、このままレポートを書きます。†これが今回制作したロボットです。センサーが地面に近く、より正確に黒線を読み取れるものを目指しました。ロボット本体と、センサーの部分を別にするとこのようになります。†プログラムについて説明する前に、今回の課題の難しい点と、それをどう解決したかについて説明します。今回の課題で最も難しい点は、交差点をどのように攻略するかという点です。交差点では、交差点を認識したことの証として音を鳴らし、1秒間停止しなければなりません。その後、交差点を右折、左折、直進のどれかを行います。交差点を通過し、また走り始めるためには、センサーの位置が黒線上になければなりません。ロボットが毎回同じ動きをしてくれないことは前回の課題でよくわかっており、機体を旋回させて正確にセンサーを線上に移動させる自信は0だったので、ここである工夫をしました。THRESHOLD);Off(OUT_AC);その工夫というのは、このfind_lineと定義されたものです。turn_right1については後程説明しますが、要するに右旋回です。find_lineとは、黒線が見つかるまで旋回し、センサーが線上に来たら止まるという優れものです。これをどのように使うかというと、まず、ロボットが交差点でこのように止まります。ここでは例として直進をさせたいと思います。cross_right2;find_line;cross_right2についてはまた後程説明しますが、要するに右旋回です。このようにすると、このようになります。cross_right2でセンサーが線外に出るまで旋回し、、find_lineで線上まで旋回します。これによって今回の課題に取り組む上での、ロボットの動きによる失敗が大幅に減ったと思います。交差点を判断する基準として、カウンタを使いました。カウンタをnと定義した時、nの値を決めておきます。センサーが線上にあるときの回数を数え、その回数がnを超えたときに交差点に差し掛かったと判断するようにしました。カウンタの決め方は、出発地点から交差点までの間に何度センサーが線上にあると判断するかを、カウンタの値を変えながら何度も試し、交差点から交差点の間1つ1つ調べて決めました。†カウンタの値は交差点から交差点までのコースによって大きく変わりました。左カーブがあると大きく、右カーブ、直進があると小さくなりました。線の左側をロボットにトレースさせていたので、左カーブでは光センサーが線の内側に入り、線上にセンサーがあると判断する回数が増え、右カーブ、直進だと逆に線上だと判断する回数が減るために、このようになったと考えます。†これに関しては、プログラム製作中に特に変化は感じなかったので、あくまで考察になります。光センサーというものは赤い光を対象に照射し、反射してきた光で対象の白黒を判断するものです。ロボットの電池残量が減るとともに、赤い光は弱くなり、センサーの精度は低くなると考えられます。具体的には、白は光を反射、黒は光を吸収する色なので、電池残量が減るとセンサーの値は全体的に黒の値に近づくと思います。THRESHOLD);Off(OUT_AC);まずはdefineです。紹介したfind_lineなどを定義しました。cross_right2はfind_lineの説明に用いたもので、交差点を直進するときに使い、cross_right1は2より時間が長いため、交差点を右折するときに使います。今回の課題に取り組むうえで、コースを5つに分け、5つのサブルーチンを作りました。CROSS4()、「R左折→B地点」をCROSS5()としました。「A地点→P直進」のCROSS1()について説明します。//S1は光センサーである。//続けて黒になった回(カウンタ)をnとする。//そして、カウンタを増やす。//直進するために1度線の外へ。//カウンタをリセット}他のサブルーチンは交差点を右折、左折、直進のどれをするかを決める、最後の部分が違うだけなので、一応載せて説明はしますが、読んでも読まなくてもどっちでもいいです。//大きく右旋回j=0;}カウンタを表すアルファベットをjにしました。}Float(OUT_AC);PlaySound(SOUND_UP);Wait(400);cross_right2;find_line;k=0;}今度はkにしました。}Float(OUT_AC);PlaySound(SOUND_UP);Wait(400);n=0;}なぜかここでまたnです。アルファベットを変えていたかというと、カウンタをリセットするときに、同じアルファベットだとリセットされないのではないかと思ったことがきっかけです。結果としては同じ文字でも問題がないことが分かったため、nが再登場しました。}Float(OUT_AC);PlaySound(SOUND_FAST_UP);Wait(400);go_forward;Wait(800);n=0;}5つのサブルーチンの最後です。それらを組み合わせたものが次のものです。Float(OUT_AC);}これで、A地点からB地点までロボットを走らせることができます。今回作ったプログラムでロボットを走らせた結果、A地点からB地点までを51,70秒で走り終えました。他の班はどうか知りませんが、なかなか良いタイムではないかと思います。今回の課題は前回の課題よりはやりやすいように感じました。最初はカウンタの使い方がわからず、苦戦しましたが、カウンタを使えるようになり、工夫をして、カウンタの値を調節することで、順調に課題を達成することができました。やり残したことといえば、タイムをもう少し縮められるようにすることくらいなので、とてもよくできたと思います。