#contents *課題2:黒い線に沿って動くロボット[#l522b75d] 黒い線に沿って動くロボットを作成せよ。ただし、 -速さと正確さを追求すること。 -交差点で優先側を走っていない場合には、一時停止すること。 -前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと。 #ref(三代目.jpg) ~''(製作者:クノピー、ネタ切れ、たまちゃん)'' **ロボットの機構 [#kaffc3aa] 光センサーを使うことでライントレースをさせると同時に、タッチセンサーを使うことで他のロボットに接触したときに停止するための機構を考える。 ***光センサーの取り付け [#ce4ea78a] 光センサーは対象の明暗を認識する。そこで、2つの光センサーをつかってロボットにコースを認識させる方法を考える。 ~ ・方法1:ロボットに「黒」を認識させる。(光量が一定以下になる) ~ →両方のセンサーが反応したら直進。片方だけが反応したら、反応した側へ曲がる。 #ref(初代1.jpg) #ref(黒トレース.jpg) ~ ・方法2:ロボットに「白」を認識させる。(光量が一定以上になる) ~ →両方のセンサーが反応したら直進。片方だけが反応したら、反応したのと逆側へ曲がる。 #ref(初代2.jpg) #ref(白トレース.jpg) これらのどちらか方法によってコースに沿ってロボットを動かすことができる。 ***コースを書く [#oaaae980] -交差点で優先側ではないコースでは、コースのない交差点をロボが通過しなくてはならないので、交差点の手前から通過点であらたにコースにのるまでの間、ロボに直進をさせる。通過したロボが再びコースにのれるようにするためには、本体の向きがすでに交差点を通過した地点のほうに向いていなければならない。 ~ →交差点に向かうすぐ手前にカーブがあると、通過後に再びコースに戻ることが難しくなってしまう。 ~ -急なカーブはセンサーが反応しづらいので、緩やかなカーブと直線でコースを作成。(交差点はまだ書かれていない) #ref(コース.jpg) ***タッチセンサーの取り付け [#sabfdede] 今回の課題では、他のロボに接触したら停止して、先にいたロボが通過するのを待ってから再びトレースを開始しなくてはならないので、前方での接触のみを感知するバンパーを取り付けることにした。しかし、相手の角度やタイミングによっては前方のみの接触センサーでは、感知できない可能性がある。そこで正面左右の三方向の接触を感知できる機構を考えた。 写真は左右の変位を前後の変位に変換する機構である。黄色いブロックが押し込まれることによりスライドし、前後の変位に変換される。 #ref(タッチセンサ2.jpg) ***時系列試行錯誤 [#sabfdede] ・初代 一番はじめに作成した車型ロボットに光センサー(黒を認識させるタイプ)を取り付け、コースを走らせてみた。すると、難なくライントレースをすることに成功。そのため、タッチセンサーの作成に着手した。 #ref(初代1.jpg) ・二代目 前回の講義の終わりに、先生が『速くかつ正確に』ということを言っていたので、ギヤ比やタイヤの大きさを変更することにより、スピードアップを試みた。しかし、スピードが上がりすぎたのと、タイヤの取り付け位置の関係で、カーブをトレースできなくなってしまた。 #ref(二代目1.jpg) ・三代目 二代目の問題点は、タイヤがミニ四駆などのように固定されているため自力でのターンが出来づらいというところだった。本来なら車のように前輪の自由度が高くなければ、ターンというものはさせずらい。そこで二輪ならターンを邪魔する摩擦を生む前輪は存在しないので、二輪に改造。これにより悪くなったバランスを補助輪を付けることにより改善し完成型となった。またより敏感な白を認識する光センサーに換装されている。 #ref(三代目+説明.jpg) **プログラム [#w69f76ad] #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秒直進 } } } } **苦労&工夫した点 [#s9d57864] ・前回の反省から、改悪になってしまったときに元の状態に戻しやすいように心がけてみました。 ~・Wait中は他の動作ができないので、taskを2つに分けました。2つに分けることで、タッチセンサーが反応したら一端ライントレースを停止し、タッチセンサーの反応に対する動きを優先するようにしました。これによって、Waitを使用して進むプログラムになっている交差点でも衝突を感知することができます。 ~・コースの作成ですが、ただ単に「カーブが緩い」「垂直に交わる」というだけではなく、「交差点へのアプローチでロボットの向きを整えることのできる直線」が必要だという点で苦労しました。 ~・相手の角度やタイミングによっては前方のみの接触センサーでは感知できない場合がある。そこで一つの接触センサーで正面左右の三方向の接触を感知できる機構を造り上げたこと。 **感想 [#u7278976] (クノピー) どうも自分は思い込みで突っ走ってしまうところがあるようで、見当違いの改造をしていて、まったく状況に変化が現れないといったことも起きてしまいました。次の機会には先入観というものをぬぐう努力をしなければならないと思う。 ~(ネタ切れ) 今回はクノピー様にロボの組み立てを完全にお願いしてしまって非常に申し訳なかったです。苦労&工夫のほうでも書きましたが、プログラムの方はWait中に他の動作をすることができないことを考慮し、taskを分けました。とりあえず、作成したプログラムは、手元で動作の確認をした状態ではなんとか課題をこなせそうなので、あとはコース次第といったところでしょうか。 ~(たまちゃん)私はコース作りの担当でしたが、交差点を垂直に近づけ、さらにカーブのゆるいコースを考えるのが難しかったです。また、プログラミングでは様々な条件を考えて入力してやっと動くようになるのに、もっと複雑な動きをする既成のロボは一体どんなプログラミングになっているのか、考えただけで気が遠くなりました。 ***コメントをどうぞ [#cb292078] -「Wait中は他の動作ができないので、taskを2つに分けました」 さらっと書いてありますが、もう少し詳しく書いてください。 -- [[まいける(TA)]] &new{2007-06-21 (木) 10:24:06}; -光センサー・タッチセンサーのギミックがきちんと図示されており、わかりやすかった。 -- [[ヒロヤ]] &new{2007-06-21 (木) 13:35:02}; #comment [[2007a/A9]]