2007b/A2

ライントレースロボット

PA0_0050.JPG




課題2の説明

詳しい課題の内容は こちらから

課題2のポイントとしては、

ポイント.jpg

1)ラインをたどる
2)ラインが交差する地点
3)ぶつかった時の対応
4)スピードの追求
           の4点です。












ロボットの構造

最初に制作したロボットの特徴

1)三輪にした。
理由…4輪駆動と比較して小回りが可能。なぜなら、4輪駆動は旋回するときに前後のタイヤがそれぞれの回転軌道で回ろうとするので、お互いに動きの邪魔をして、結果として無理矢理回転しようとしているので、ストレスがかかっているので、3輪駆動にすることで、無駄な力がかからずスムーズな旋回ができる。

回転模式図.jpg

2)タイヤの幅を狭くした。
理由…タイヤの幅の間隔が狭い方が、小回りすることが可能だから。
3)前輪にキャスターを使った。
理由…空転するキャスターは後輪駆動の動きを邪魔しないので光センサーが感知した動きを的確に伝えることができる。
4)光センサーを前輪のすぐ後方に設置した。
理由…光センサーが感知したラインをトレースするのに前輪のすぐ後ろにあった方が良いと考えた。
5)光センサーを地面にできるだけ近くした。
理由…その方がセンサーの感度が良さそうだと考えたから。
6)タッチセンサーを2つ使用した。
理由…タッチセンサーを2つ使用した方が、広い範囲の衝突に対応できるから。

最初に制作したロボット.jpg

最初のロボットの問題点

1)急なカーブが曲がりきれない
理由…光センサーとタイヤの距離が広かったため、センサーが感知したラインの情報とタイヤがある位置のラインに形状の差が出たので、直線や緩いカーブの時は問題ないが、急なカーブのときには的確な動きがとれなくなり、結果として光センサーがラインを見失いカーブが曲がり切れなかった。
2)ロボット同士が衝突しても無視して走り続ける
理由…タッチセンサーの位置が高いもしくは低いために相手のロボットとの衝突を感知できないため

改良したロボットの特徴

1)前輪駆動にした。
理由…光センサーとの距離が狭まりラインを的確におえるようになった。
2)キャスターを後ろに持ってきた。
理由…キャスターがついてくるだけなのでスムーズにカーブを回れるようになった。
3)バンパーに高さの幅を持たせた。
理由…衝突の幅が増え衝突が上手く行えるようになった。

改良したロボット.jpg

→さらなる問題点
ロボットが走行中に突然回転するようになった
理由…バンパーが重すぎて走行の振動でタッチセンサーに触れてしまったため、タッチセンサーが反応した時の動作を行った
改善…バンパーを必要最低限の構造にして軽量化した

完成形.JPG

↑ロボットの完成形

プログラムについて

光センサーについて

光センサーは明るさを0〜100の値として感知します。そこで、プログラムでは
until (SENSOR_1 < 40) ; // センサの値が40未満になるまで次の命令を実行しない
というように書くのだが、これは
現在感知している明るさ<40
ということである。すなわち、この40という値を任意に設定することで光センサーの反応を変えることができる。
40という値は白と黒の区別をするために必要で「閾値」と呼ばれる。
下図は光センサーの値の取り方を図示したものである。

光センサー.jpg

ライントレースの方法

ロボットは下図の3種類の動作を連続的に行うことで、黒いラインをたどって進む。

ライントレース.jpg

2つの光センサーがラインを挟む設置方法は、
1)1つの光センサーに比べ動作が少なくて済むのではないか
2)ラインの幅が狭くて済むのではないか
                       と考え採用した。

ラインを挟む.JPG

プログラムの概要

プログラムは下図のような流れで制作している

プログラムの流れ.jpg

プログラム

#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回転するようなプログラムにしてしまったが、本来ならば、黒いラインを何度通り過ぎたかという柔軟なプログラムにしたかったが、こちらも時間的にできなかったので、次回の課題以降の課題で挑戦していきたい。ライントレースするロボットのプログラムというと、もっと複雑なものを想像していたが、プログラムの構成自体は単純なものの組み合わせであったことに驚いた。

コースについて

下図の様なコースを製作した。

コース.JPG

簡単なコースはつまらないというコンセプトの下で書かれたもので、このような複雑な形になっており、見た目通り難易度の高いコースになっている。このコースを走行するにあたり難しい箇所は
1)交差点が三か所ある
2)右上のカーブは非常に急
3)停止線の手前にカーブがある
4)先行しているロボットがカーブを曲がってくると、追従しているロボットと正面衝突する(下項目参照)







課題発表会において

ロボットの制作に手間取っていたこと、プログラムの詰めが甘かったことがあり、最初の課題発表会には間に合わなかったので非常に残念だった。しかし次の週にもう一度発表の機会が与えられたので、今度こそはという気で臨んだ。
グループのもう一台のロボットが先行してそれをこちらのロボットが追従していった。3回ほどこちらのロボットが先行しているロボットに接触したが、適切に衝突した時の対応をしたので、問題なく進んで行った。
しかし、コースの途中にある急なカーブにおいて、カーブを曲がり終えた先行するロボットが折り返しくる一方、追従するこちらのロボットはそのカーブに侵入しようとしたので、対向車線が接近している箇所で、すれ違うことができずに、正面衝突した。2台のロボットはそれぞれ衝突した時の対応をした。このまま2台は同じ場所で衝突を続けると思われたが、先行するロボットの対応は単純に後退してから前進を続けるというもので、こちらのロボットは1回転するという対応なので、対応の時間に差が生じたために2回ほど衝突した後、先行していたロボットが衝突から逃れ衝突の無限ループを解消することに成功した。これを松本先生が見ていらっしゃり「このグループは秀逸だな」と言っていただけたことが、大変うれしく感じました。

衝突.jpg

感想

最も苦労した点は、やはり上手くラインをトレースできるかという点であった。そのためにプログラミングに技巧を凝らし、ロボットの製作にも苦労を費やした。3輪の前輪駆動にしたことで小回りがきき、カーブもスムーズに進むことができるようになった。次に苦労した点は、ロボット同士の衝突するところである。最初は、ロボット同士のバンパーの高さがあわずに正面衝突した時に上手くいかなかった。でも、バンパーに高さを持たせることで幾分ましとなった。ロボットが他のロボットの側面に衝突する場合にも同様の理由でスムーズに行うことができるようになった。コースを少し複雑にしてしまったために衝突の可能性が高くなってしまったのが難点んだが、本番では練習の時よりも上手くできたと思う。反省点は、プログラミングやロボットの製作に時間がかかり過ぎてしまったことだろう。次の課題は効率良く質の高いものを製作したい。

コメントをお願いします。

  • ほんのわずかな改良やアイデアの積み上げで見違えるようなロボットになります。次回の課題やロボコンも今回の課題のように一つ一つの問題点を解決していきましょう。 -- 松本 2007-12-17 (月) 15:26:51
  • 初めて見た人にもわかるように、そのバンパーの機構でどのように接触センサーを押しているかの説明がほしいです。 -- クノ? 2008-01-06 (日) 20:25:44


添付ファイル: file衝突.jpg 431件 [詳細] fileコース.JPG 585件 [詳細] fileラインを挟む.JPG 561件 [詳細] fileライントレース.jpg 629件 [詳細] fileプログラムの流れ.jpg 566件 [詳細] file光センサー.jpg 515件 [詳細] file完成形.JPG 518件 [詳細] file改良したロボット.jpg 519件 [詳細] file最初に制作したロボット.jpg 561件 [詳細] file回転模式図.jpg 759件 [詳細] fileポイント.jpg 621件 [詳細] filePA0_0050.JPG 626件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-01-06 (日) 20:25:44 (4242d)