黒い線に沿って動くロボットを作成せよ。ただし、
(製作者:クノピー、ネタ切れ、たまちゃん)
光センサーを使うことでライントレースをさせると同時に、タッチセンサーを使うことで他のロボットに接触したときに停止するための機構を考える。
光センサーは対象の明暗を認識する。そこで、2つの光センサーをつかってロボットにコースを認識させる方法を考える。
・方法1:ロボットに「黒」を認識させる。(光量が一定以下になる)
→両方のセンサーが反応したら直進。片方だけが反応したら、反応した側へ曲がる。
・方法2:ロボットに「白」を認識させる。(光量が一定以上になる)
→両方のセンサーが反応したら直進。片方だけが反応したら、反応したのと逆側へ曲がる。
これらのどちらか方法によってコースに沿ってロボットを動かすことができる。
→交差点に向かうすぐ手前にカーブがあると、通過後に再びコースに戻ることが難しくなってしまう。
今回の課題では、他のロボに接触したら停止して、先にいたロボが通過するのを待ってから再びトレースを開始しなくてはならないので、前方での接触のみを感知するバンパーを取り付けることにした。しかし、相手の角度やタイミングによっては前方のみの接触センサーでは、感知できない可能性がある。そこで正面左右の三方向の接触を感知できる機構を考えた。
写真は左右の変位を前後の変位に変換する機構である。黄色いブロックが押し込まれることによりスライドし、前後の変位に変換される。
・初代
一番はじめに作成した車型ロボットに光センサー(黒を認識させるタイプ)を取り付け、コースを走らせてみた。すると、難なくライントレースをすることに成功。そのため、タッチセンサーの作成に着手した。
・二代目
前回の講義の終わりに、先生が『速くかつ正確に』ということを言っていたので、ギヤ比やタイヤの大きさを変更することにより、スピードアップを試みた。しかし、スピードが上がりすぎたのと、タイヤの取り付け位置の関係で、カーブをトレースできなくなってしまた。
・三代目
二代目の問題点は、タイヤがミニ四駆などのように固定されているため自力でのターンが出来づらいというところだった。本来なら車のように前輪の自由度が高くなければ、ターンというものはさせずらい。そこで二輪ならターンを邪魔する摩擦を生む前輪は存在しないので、二輪に改造。これにより悪くなったバランスを補助輪を付けることにより改善し完成型となった。またより敏感な白を認識する光センサーに換装されている。
#define THRESHOLD 40 //閾値を設定 #define MOTOR OUT_A+OUT_C
task main() { SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ2をタッチセンサーと宣言 start line_trace; //ライントレースの開始 while(true){ if(SENSOR_2==1){ //タッチセンサーが反応している間 stop line_trace; //ライントレースをとめ、タッチセンサーを優先させる OnRev(MOTOR); Wait(50); Off(MOTOR); Wait(300); //0.5秒後退して3秒停止 start line_trace; //ライントレースを再開 } } }
task line_trace() { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1(左)を光センサーと宣言 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3(右)を光センサーと宣言 while(true){ if(SENSOR_1>THRESHOLD){ if(SENSOR_3>THRESHOLD){ //センサーが共に白を感知 OnFwd(MOTOR); //前進 }else{ //センサー1は白、3は黒を感知 Off(OUT_C); OnFwd(OUT_A); //右にターン } }else{ if(SENSOR_3>THRESHOLD){ //センサー1は黒、3は白を感知 OnFwd(OUT_C); Off(OUT_A); //左にターン }else{ //センサーが共に黒を感知 Off(MOTOR); Wait(50); OnFwd(MOTOR); Wait(70); //0.5秒停止して、0.7秒直進 } } } }
・前回の反省から、改悪になってしまったときに元の状態に戻しやすいように心がけてみました。
・Wait中は他の動作ができないので、taskを2つに分けました。2つに分けることで、タッチセンサーが反応したら一端ライントレースを停止し、タッチセンサーの反応に対する動きを優先するようにしました。これによって、Waitを使用して進むプログラムになっている交差点でも衝突を感知することができます。
・コースの作成ですが、ただ単に「カーブが緩い」「垂直に交わる」というだけではなく、「交差点へのアプローチでロボットの向きを整えることのできる直線」が必要だという点で苦労しました。
・相手の角度やタイミングによっては前方のみの接触センサーでは感知できない場合がある。そこで一つの接触センサーで正面左右の三方向の接触を感知できる機構を造り上げたこと。
(クノピー) どうも自分は思い込みで突っ走ってしまうところがあるようで、見当違いの改造をしていて、まったく状況に変化が現れないといったことも起きてしまいました。次の機会には先入観というものをぬぐう努力をしなければならないと思う。
(ネタ切れ) 今回はクノピー様にロボの組み立てを完全にお願いしてしまって非常に申し訳なかったです。苦労&工夫のほうでも書きましたが、プログラムの方はWait中に他の動作をすることができないことを考慮し、taskを分けました。とりあえず、作成したプログラムは、手元で動作の確認をした状態ではなんとか課題をこなせそうなので、あとはコース次第といったところでしょうか。
(たまちゃん)私はコース作りの担当でしたが、交差点を垂直に近づけ、さらにカーブのゆるいコースを考えるのが難しかったです。また、プログラミングでは様々な条件を考えて入力してやっと動くようになるのに、もっと複雑な動きをする既成のロボは一体どんなプログラミングになっているのか、考えただけで気が遠くなりました。