[[2007b/A2]]

*ライントレースロボット [#sa9c239c]
#ref(PA0_0050.JPG,around,wrap) 
#contents



~
~
~
*課題2の説明 [#f829c0f6]
詳しい課題の内容は
[[こちら:http://yakushi.shinshu-u.ac.jp/robotics/?2007b%2F%CE%FD%BD%AC%CC%E4%C2%EA#content_1_1]]から

課題2のポイントとしては、~
#ref(ポイント.jpg,around,wrap)
1)ラインをたどる~
2)ラインが交差する地点~
3)ぶつかった時の対応~
4)スピードの追求~
           の4点です。
~
~
~
~
~
~
~
~
~
~
~
~
~
*ロボットの構造 [#u7248080]
**最初に制作したロボットの特徴 [#g1f53de3]
1)三輪にした。~
理由…4輪駆動と比較して小回りが可能。なぜなら、4輪駆動は旋回するときに前後のタイヤがそれぞれの回転軌道で回ろうとするので、お互いに動きの邪魔をして、結果として無理矢理回転しようとしているので、ストレスがかかっているので、3輪駆動にすることで、無駄な力がかからずスムーズな旋回ができる。~
#ref(回転模式図.jpg,wrap)
2)タイヤの幅を狭くした。~
理由…タイヤの幅の間隔が狭い方が、小回りすることが可能だから。~
3)前輪にキャスターを使った。~
理由…空転するキャスターは後輪駆動の動きを邪魔しないので光センサーが感知した動きを的確に伝えることができる。~
4)光センサーを前輪のすぐ後方に設置した。~
理由…光センサーが感知したラインをトレースするのに前輪のすぐ後ろにあった方が良いと考えた。~
5)光センサーを地面にできるだけ近くした。~
理由…その方がセンサーの感度が良さそうだと考えたから。~
6)タッチセンサーを2つ使用した。~
理由…タッチセンサーを2つ使用した方が、広い範囲の衝突に対応できるから。
#ref(最初に制作したロボット.jpg,wrap)

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


**改良したロボットの特徴 [#j2f2a31d]
1)前輪駆動にした。~
理由…光センサーとの距離が狭まりラインを的確におえるようになった。~
2)キャスターを後ろに持ってきた。~
理由…キャスターがついてくるだけなのでスムーズにカーブを回れるようになった。~
3)バンパーに高さの幅を持たせた。~
理由…衝突の幅が増え衝突が上手く行えるようになった。~
#ref(改良したロボット.jpg,wrap)
→さらなる問題点~
ロボットが走行中に突然回転するようになった~
理由…バンパーが重すぎて走行の振動でタッチセンサーに触れてしまったため、タッチセンサーが反応した時の動作を行った~
改善…バンパーを必要最低限の構造にして軽量化した
#ref(完成形.JPG,wrap)
↑ロボットの完成形


*プログラムについて [#n054c279]
光センサーについて~
**光センサーについて [#z7cb0444]
光センサーは明るさを0〜100の値として感知します。そこで、プログラムでは~
until (SENSOR_1 < 40) ;   // センサの値が40未満になるまで次の命令を実行しない~
というように書くのだが、これは~
現在感知している明るさ<40~
ということである。すなわち、この40という値を任意に設定することで光センサーの反応を変えることができる。~
40という値は白と黒の区別をするために必要で「閾値」と呼ばれる。
40という値は白と黒の区別をするために必要で「閾値」と呼ばれる。~
下図は光センサーの値の取り方を図示したものである。
#ref(光センサー.jpg,wrap)
**ライントレースの方法 [#d0ec644c]
ロボットは下図の3種類の動作を連続的に行うことで、黒いラインをたどって進む。
#ref(ライントレース.jpg,wrap)
2つの光センサーがラインを挟む設置方法は、~
1)1つの光センサーに比べ動作が少なくて済むのではないか~
2)ラインの幅が狭くて済むのではないか~
                       と考え採用した。
#ref(ラインを挟む.JPG,wrap)
**プログラムの概要 [#rb4ceadd]
プログラムは下図のような流れで制作している
#ref(プログラムの流れ.jpg,wrap)
**プログラム [#oa603ca8]
// kadai2 program //
 
 #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);                    //両方のタイヤの回転を止める
  }
  }
 }
*感想 [#c5075f94]
最も苦労した点は、やはり上手くラインをトレースできるかという点であった。そのためにプログラミングに技巧を凝らし、ロボットの製作にも苦労を費やした。3輪の前輪駆動にしたことで小回りがきき、カーブもスムーズに進むことができるようになった。次に苦労した点は、ロボット同士の衝突するところである。最初は、ロボット同士のバンパーの高さがあわずに正面衝突した時に上手くいかなかった。でも、バンパーに高さを持たせることで幾分ましとなった。ロボットが他のロボットの側面に衝突する場合にも同様の理由でスムーズに行うことができるようになった。コースを少し複雑にしてしまったために衝突の可能性が高くなってしまったのが難点んだが、本番では練習の時よりも上手くできたと思う。反省点は、プログラミングやロボットの製作に時間がかかり過ぎてしまったことだろう。次の課題は効率良く質の高いものを製作したい。


***コメントをお願いします。 [#j054655f]
#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS