詳しい課題の内容は こちらから
課題2のポイントとしては、
1)ラインをたどる
2)ラインが交差する地点
3)ぶつかった時の対応
4)スピードの追求
の4点です。
1)三輪にした。
理由…4輪駆動と比較して小回りが可能。なぜなら、4輪駆動は旋回するときに前後のタイヤがそれぞれの回転軌道で回ろうとするので、お互いに動きの邪魔をして、結果として無理矢理回転しようとしているので、ストレスがかかっているので、3輪駆動にすることで、無駄な力がかからずスムーズな旋回ができる。
2)タイヤの幅を狭くした。
理由…タイヤの幅の間隔が狭い方が、小回りすることが可能だから。
3)前輪にキャスターを使った。
理由…空転するキャスターは後輪駆動の動きを邪魔しないので光センサーが感知した動きを的確に伝えることができる。
4)光センサーを前輪のすぐ後方に設置した。
理由…光センサーが感知したラインをトレースするのに前輪のすぐ後ろにあった方が良いと考えた。
5)光センサーを地面にできるだけ近くした。
理由…その方がセンサーの感度が良さそうだと考えたから。
6)タッチセンサーを2つ使用した。
理由…タッチセンサーを2つ使用した方が、広い範囲の衝突に対応できるから。
1)急なカーブが曲がりきれない
理由…光センサーとタイヤの距離が広かったため、センサーが感知したラインの情報とタイヤがある位置のラインに形状の差が出たので、直線や緩いカーブの時は問題ないが、急なカーブのときには的確な動きがとれなくなり、結果として光センサーがラインを見失いカーブが曲がり切れなかった。
2)ロボット同士が衝突しても無視して走り続ける
理由…タッチセンサーの位置が高いもしくは低いために相手のロボットとの衝突を感知できないため
1)前輪駆動にした。
理由…光センサーとの距離が狭まりラインを的確におえるようになった。
2)キャスターを後ろに持ってきた。
理由…キャスターがついてくるだけなのでスムーズにカーブを回れるようになった。
3)バンパーに高さの幅を持たせた。
理由…衝突の幅が増え衝突が上手く行えるようになった。
→さらなる問題点
ロボットが走行中に突然回転するようになった
理由…バンパーが重すぎて走行の振動でタッチセンサーに触れてしまったため、タッチセンサーが反応した時の動作を行った
改善…バンパーを必要最低限の構造にして軽量化した
↑ロボットの完成形
光センサーは明るさを0〜100の値として感知します。そこで、プログラムでは
until (SENSOR_1 < 40) ; // センサの値が40未満になるまで次の命令を実行しない
というように書くのだが、これは
現在感知している明るさ<40
ということである。すなわち、この40という値を任意に設定することで光センサーの反応を変えることができる。
40という値は白と黒の区別をするために必要で「閾値」と呼ばれる。
下図は光センサーの値の取り方を図示したものである。
ロボットは下図の3種類の動作を連続的に行うことで、黒いラインをたどって進む。
2つの光センサーがラインを挟む設置方法は、
1)1つの光センサーに比べ動作が少なくて済むのではないか
2)ラインの幅が狭くて済むのではないか
と考え採用した。
プログラムは下図のような流れで制作している
#define THRESHOLD 40 //閾値:黒と白を判断するための値、 暫定的に40と設定しておいたが、 特に問題なかったのでそのまま使用 task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー端子1に接続されたセンサーが 光センサーであると宣言してやる必要がある SetSensor(SENSOR_2, SENSOR_TOUCH); //センサー端子2に接続されたセンサーは タッチセンサーであると宣言 SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー端子3に接続されたセンサーが 光センサーであると宣言 while(true){ //trueがwhileの中に入っているため 常に条件が成り立っている すなわち無限ループになっている while (SENSOR_2==0){ //センサー2が反応していないとき すなわち、タッチセンサーに何も触れて いないとき、以下の動作を繰り返す if((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) //もし、左右の光センサーが閾値より 大きい値を示している、 すなわち白い部分にいるならば… { OnFwd(OUT_A+OUT_C); //左右のタイヤを正回転させる } if(SENSOR_3 < THRESHOLD) //もし、センサー3が閾値より小さい値を 示しているならば、すなわち 右の光センサーが黒いラインに触たら { OnFwd(OUT_A); //左のタイヤを正回転 OnRev(OUT_C); 右のタイヤを逆回転させる } すなわちロボットは時計回りをし、 右センサーが黒いラインから離れるように動く if(SENSOR_1 < THRESHOLD) //もし、センサー1が閾値より小さい値を 示しているならば、すなわち 左の光センサーが黒いラインに触れたら { OnFwd(OUT_C); //右のタイヤを正回転 OnRev(OUT_A); 左のタイヤを逆回転させる } すなわちロボットは反時計回りをし、 左センサーが黒いラインから離れるように動く if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) //もし、センサー1・3が閾値より 小さい値を示しているならば、 すなわち両方のセンサーが黒いラインに触れたら { Off(OUT_A+OUT_C) ; //左右のタイヤの回転を止める Wait(50); //5秒間停止している OnFwd(OUT_A+OUT_C) ; //両方のタイヤを正回転させる Wait(70); 7秒間直進する } すなわち、交差するラインの影響が なく進むことができる } while(SENSOR_2==1) { //センサー2が反応しているとき すなわち、タッチセンサーに何か触れたとき Rev(OUT_A+OUT_C); //両方のタイヤを逆回転させる Wait(30); 3秒間戻る OnFwd(OUT_C);OnRev(OUT_A); //右タイヤを正回転、左タイヤを逆回転させる すなわち、反時計回りを行う Wait(255); //25.5秒回転する すなわち、1回転する Off(OUT_A+OUT_C); //両方のタイヤの回転を止める } } }
閾値とは何か理解するまで悩んだ。ifの使い方は理解できたが、このようなプログラムの場合elseの使い方はどのようにすればよいのか、検証する時間がなく残念だった。衝突した時の対応として1回転を選択し、単純に時間で1回転するようなプログラムにしてしまったが、本来ならば、黒いラインを何度通り過ぎたかという柔軟なプログラムにしたかったが、こちらも時間的にできなかったので、次回の課題以降の課題で挑戦していきたい。ライントレースするロボットのプログラムというと、もっと複雑なものを想像していたが、プログラムの構成自体は単純なものの組み合わせであったことに驚いた。
下図の様なコースを製作した。
簡単なコースはつまらないというコンセプトの下で書かれたもので、このような複雑な形になっており、見た目通り難易度の高いコースになっている。このコースを走行するにあたり難しい箇所は
1)交差点が三か所ある
2)右上のカーブは非常に急
3)停止線の手前にカーブがある
4)先行しているロボットがカーブを曲がってくると、追従しているロボットと正面衝突する(下項目参照)
ロボットの制作に手間取っていたこと、プログラムの詰めが甘かったことがあり、最初の課題発表会には間に合わなかったので非常に残念だった。しかし次の週にもう一度発表の機会が与えられたので、今度こそはという気で臨んだ。
グループのもう一台のロボットが先行してそれをこちらのロボットが追従していった。3回ほどこちらのロボットが先行しているロボットに接触したが、適切に衝突した時の対応をしたので、問題なく進んで行った。
しかし、コースの途中にある急なカーブにおいて、カーブを曲がり終えた先行するロボットが折り返しくる一方、追従するこちらのロボットはそのカーブに侵入しようとしたので、対向車線が接近している箇所で、すれ違うことができずに、正面衝突した。2台のロボットはそれぞれ衝突した時の対応をした。このまま2台は同じ場所で衝突を続けると思われたが、先行するロボットの対応は単純に後退してから前進を続けるというもので、こちらのロボットは1回転するという対応なので、対応の時間に差が生じたために2回ほど衝突した後、先行していたロボットが衝突から逃れ衝突の無限ループを解消することに成功した。これを松本先生が見ていらっしゃり「このグループは秀逸だな」と言っていただけたことが、大変うれしく感じました。
最も苦労した点は、やはり上手くラインをトレースできるかという点であった。そのためにプログラミングに技巧を凝らし、ロボットの製作にも苦労を費やした。3輪の前輪駆動にしたことで小回りがきき、カーブもスムーズに進むことができるようになった。次に苦労した点は、ロボット同士の衝突するところである。最初は、ロボット同士のバンパーの高さがあわずに正面衝突した時に上手くいかなかった。でも、バンパーに高さを持たせることで幾分ましとなった。ロボットが他のロボットの側面に衝突する場合にも同様の理由でスムーズに行うことができるようになった。コースを少し複雑にしてしまったために衝突の可能性が高くなってしまったのが難点んだが、本番では練習の時よりも上手くできたと思う。反省点は、プログラミングやロボットの製作に時間がかかり過ぎてしまったことだろう。次の課題は効率良く質の高いものを製作したい。