『2013b/Member/ニックネーム/Mission1』 *ロボットの紹介 [#c17bbfd1] ライントレーサー。紙の上に書かれた黒い線を自動でたどってゆくロボットです。 #ref(robotics3.jpg,around); ~四輪モデルでは半径が1.5cmのカーブがスムーズに曲がり切れなかったため、小回りの利く三輪のモデルに改良しました。 ~前の二つのタイヤはそれぞれ独立したモーターで動かし、前輪どうしを結んだ線の中点を軸として回転します。 ~回転軸とセンサーライトまでの距離が短いためセンサーが大きく左右にふられて線を見失ってしまう事が少なくなりました。 ~後輪はロボット全体を支えるための補助となっています。 #clear *コース [#k645f3c7] #ref(mission1.jpg,around); 課題は交差点を判断し、途中におかれた缶をどかし、元の位置に戻してからまたライントレースを続けゴールまで行く。ものでしたが今回は缶に関するプログラムまでは到達できずライントレースのみの課題報告となっています。 ~問題の半径1.5のカーブでは、主となる前の二つのタイヤが離れているため、センサーライトがうまく値を読み取らないと大回りしてしまいました。このことは交差点までの時間を定義していたところに問題が生じさせました。大回りすることで交差点近くになるまでの時間が延び、定義が意味のないものになってしまいました。 #clear *プログラム [#x2919ef6] 決められたコースを一周するプログラムです。 -定義文 動作の定義 #define turn_left OnFwd(OUT_C);Off(OUT_A);// 左回り #define turn_right OnFwd(OUT_A);Off(OUT_C);// 右回り 普通の回転では曲がるほうのタイヤを止め #define go OnFwd(OUT_AC);// 直進 小回りでは両タイヤを逆回転させています。 #define tu_le OnFwd(OUT_C);OnRev(OUT_A);// 左小回り #define tu_ri OnFwd(OUT_A);OnRev(OUT_C);// 右小回り #define black 38 // #define white 46 // #define conr_1 700 ]-| それぞれの交差点手前になるまでの #define conr_2 520 | 時間を定義してあります #define conr_3 109 | #define conr_4 400 ]-| 交差点近くになるまでの時間は、ライントレースで急なカーブを曲がったりするとき、交差点と判断してしまうため定義しました。 ~この時間条件をif文に入れることで交差点付近でのみ conrringのプログラムが動く条件が整います。 -サブルーチン sub conrring() {PlaySound(SOUND_DOWN); 判断を知らせる為の音 SetPower(OUT_AC,5); 少し遅くタイヤが回転します tu_le; Wait(20); Off(OUT_AC); go; Wait(20); ClearTimer(0);} 交差点を判断した時に行う一連の動作です。音が鳴ってからまっすぐに向き直り交差点を渡ります。 ~SetPowerはこの一連の動きを制御するのにゆっくりと動いたほうが扱いやすかったため入れておきました。 -ライントレースをするメインプログラムです task main() { int counts; counts=0; int order; order=0; ・・・・・・交差点ごとに特定のプログラムだけが動くのに使います SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(0); while(true) { if ((conr_times>2)&&(FastTimer(0)>conr_4)&&(order==3)) {conrring;order++;} else if((conr_times>2)&&(FastTimer(0)>conr_3)&&(order==2)) {conrring;order++;} else if((conr_times>2)&&(FastTimer(0)>conr_2)&&(order==1)) {conrring;order++;} else if((conr_times>2)&&(FastTimer(0)>conr_1)) {conrring;order++;} else if (SENSOR_1>white+1){tu_le;conr_times--;} ]-| ノーマルトレース else if(SENSOR_1<black-1){tu_ri;conr_times++;} | 線の縁をたどって else if(SENSOR_1>=white){turn_left;conr_times--;} | 行きます else if(SENSOR_1<=black){turn_right;conr_times++;} | else {go;} ]-| } } プログラムの説明 #ref(threshuhold.jpg) -ノーマルトレースでは、黒・薄い黒・境界部・薄い白・白の5段階で動作します。 ~黒領域では右回転、白領域では左回転をその場で行います。薄い黒では右、薄い白では左に片輪回転、else{go;}に当たる境界部ではそのまま直進します。 -交差点に来ると特定の動きをするプログラムが始動する仕組みが思いつかなかったので、すべての動作をif文に入れて()内の条件を厳しくすることで交差点でのみ特定の動きをするようにしました。 -プログラムは上から順に動いていくためif文では個々の条件の順序を考える必要があったが変数orderを入れることで他のプログラムが動かないようにした。 交差点判断一回目。光センサーで黒だった回数(conr_times)が2回以上で,且つ 交差点に接近する時間が経つまでは条件外で動きません。 ((conr_times>2)&&(FastTimer(0)>conr_1)) {conrring;order++;} 交差点を一回渡ったことで初めてorderが1増え二回目の交差点判断の プログラムが動くようになります。 ((conr_times>2)&&(FastTimer(0)>conr_2)&&(order==1)) {conrring;order++;} 三回目ーーー。 ((conr_times>2)&&(FastTimer(0)>conr_3)&&(order==2)) {conrring;order++;} 四回目ーーー。 ((conr_times>2)&&((FastTimer(0)>conr_4)&&(order==3)) {conrring;order++;} *課題 [#m06816f8] 確実に交差点を渡るため4つのプログラムを用意。しかし交差点を渡るプログラムは、交差点に近づくまでの時間が違うだけでほとんど同じプログラム‥。 ~プログラムが見にくく、長くなる原因となりました。一つのプログラムで多くの場合に対応できるようにしたいです。 -プログラムに柔軟性を持たせる -誤作動を起こさない線の判断の方法を考える *感想 [#mafe0526] 今回のライントレースでは交差点を超えて一周することが出来なかったです。問題としてthresholdの値がうまく決まらず一番初めの直角が曲がれなかった事が大きかったと思います。交差点への侵入角度によってあらぬ方向へ行く事もありました。今度からは確実性も高めていきたいです。 はじめに説明書に書いてあるとうりに作った四輪のロボットでは、二つ目の交差点を横切るところまではうまくいきましたが、ロボットを二輪に改良してからセンサーライトの感受性が変わり一番初めの直角が曲がれなくなってしまいました。一時は自分の影でセンサーライトの値が変わっていることに気づかずプログラムを書き換えてしまい無駄な時間を使ってしまったこともありました。