[[2006a/C2]] #hr CENTER:&size(25){課題2:黒い線に沿って動くロボット }; #hr CENTER:製作者:佐藤 堀 (五十音順) RIGHT:カウンタ&counter; RIGHT:[[ロボティクス入門ゼミ]] RIGHT:[[2006a/C2]] ------------ 目次 #contents ------- *この課題について [#n09e55e3] -この課題ではスピードと確実性をできる限り両立させたマシンとプログラムを作製しなければならない。 -コースのショートカットをしないようにする。コースアウトをしないようにする。 -主に[[NQC入門]]の[[ここ>NQC入門/5. センサを使う]]を参考にプログラムの開発を行う。 ----------- *この課題の解決への方針 予想される問題点 [#m118daf0] -この課題では、正確性と迅速性といった相反する性質をマシンに与えることが目標である。しかし、マシンの速度を上げると正確性が落ち、速度を落とせば正確性が上昇するが、迅速性が無くなる。 ------------ *マシンの紹介) [#ya896662] ***マシンの名前 [#saa248bf] 命名:BE▲GO -マシンがトレイスをしている感じを見る人により強く印象つけるために、マシンを %%%小型化%%% した。 -タッチセンサー郡を小型化することで、マシン全体を小さく、また正方形に近い形することが出来た。これにより、前方のマシンと衝突した場合でも、 %%%反転のための動きで、再び他機と衝突することを防ぐために自機を後退させる必要が無くなり、無駄なアクションを減らすことが出来る。%%% **マシン作り [#z4ad0dd9] -マシンを作り、テスト走行させ、改善し、また走らせるという作業を繰り返していくうちに分かったことがあります +前輪と後輪の距離を広げると、旋回が遅くなり、比較的ゆるく、曲がりやすいコースでもすぐにコースアウトしてしまう。 +自動車のようなステアリング機構を再現するのは、非常に難しい +車体の横幅を小さくしたほうがすばやい旋回が出来る +かといってあまり狭くしすぎても、うまく曲がってくれない +結局普通のドライブベースが一番安定してる ---------------- *前方のロボットに接触したら反転して進むロボット [#y7381ced] 前半後半に課題を分けさせてもらいますと、前半となりますこの課題。とりあえず、ライントレースをするプログラムにタッチセンサーに反応があった場合、反転することを命ずる部分を追加した。 ----------- **プログラムの紹介 [#l69cf354] モーターA 車体左側の動力担当 順回転で前進 モーターC 車体右側の動力担当 順回転で前進 センサー1 光センサー 車体左側の監視を担当 センサー3 光センサー 車体右側の監視を担当 サンサー2 タッチセンサー マシン前方の中央に設置 #define THRESHOLD 40 //閾値 #define TIME 160 //マシンが反転するのにかかる時間、課題1と同様に直前に測定する。 task main() { SetSensor(SENSOR_1, SENSOR_LIGHT);//1a //センサー1(左)が光センサーであることを宣言 SetSensor(SENSOR_3, SENSOR_LIGHT);//3c //センサー3(右)も光センサーであることを宣言 SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2(中央)がタッチセンサーであることを宣言 while(true){ f((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))//1&3w //センサー1(左)と2 (右)が白を感知した場合 { OnFwd(OUT_A+OUT_C);} 問題なし。ひたすら前進する if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) //1w 3b //センサー1(左)が白 センサー3(右)が黒を感知した場合 (マシンが左にずれた場合) {OnRev(OUT_C); OnFwd(OUT_A);} 右へ急旋回し、軌道の修正を図る if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))//1b 3w //センサー1(左)が黒 センサー3(右)が白を感知した場合 (マシンが右にずれた場合) {OnRev(OUT_A); OnFwd(OUT_C);} //左へ急旋回し、軌道の修正を図る if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))//1b 3b //センサー1(左)と2(右)が黒を感知してしまった場合 {OnRev(OUT_A);OnFwd(OUT_C);} とりあえず回ってみる if(SENSOR_2==1) //タッチセンサーに反応があった場合 {OnRev(OUT_A);OnFwd(OUT_C);Wait(TIME);} //180°回転する 。 } } ----------- ***プログラムの説明、解説 [#s91d13af] -上記の通り、ライントレイスするように命じるためのプログラムに、タッチセンサーに反応があった場合、反転するプログラムを追加したもの -[[課題1>2006a/C2/課題1右/program-1]]のように --------------------- *前方のロボットに接触したらそのロボットを右側から追い抜いて再びライン上に戻って進むロボット [#ze40fe3a] 後半にあたりますこちらのプログラム。このプログラムではロボットが接触した場合、右側に避けつつ追い抜いて行くようにプログラムを書いています。 ---------------- **プログラムの紹介 [#l140f428] 今回プログラムを作りましたが、全く同じ内容で別の雰囲気を醸し出すプログラムを三つほど作りました。プログラム自体が行っている処理は表面的に見えるところでは全く変化していないはずです。 -switch文を用いたプログラム --[[2006a/C2/課題2左/program01]] -if文を主要な部分で用いたプログラム --[[2006a/C2/課題2左/program02]] -サブルーチンを用いたプログラム --[[2006a/C2/課題2左/program03]] ---------------- *先生及びTAの方々のコメント [#x6621bd3] 学生にとって、先生そしてTAのアドバイスは三度の飯より重要です。 プログラムやマシン・レポートの良い点・悪い点・改良するべき点などがございましたら、どんな些細なことでもよろしいので、お書きくださいませ。 -教員のコメントよりもTAのコメントのほうが役に立つ場合も多いのでTAにもアドバイスを求めましょう。 -- [[松本(教員)]] &new{2006-06-14 (水) 10:01:29}; -文法上の話ではありませんが、それなりに意味のある定数名や変数名は多少長くなっても役割がわかりやすい名前にしましょう。 -- [[松本(教員)]] &new{2006-06-14 (水) 10:03:09}; -後半の switch を使用したプログラムについて。switchを使わず、ifの中に直接それぞれの場合の命令を記述したほうが簡明なプログラムになると思います。マクロも活用しましょう。 -- [[松本(教員)]] &new{2006-06-14 (水) 10:07:58}; -半角のカタカナを使うのは止めましょう。 -- [[松本(教員)]] &new{2006-06-14 (水) 10:09:23}; -流れがつかみやすいレポートでなかなかよいのではないでしょうか。また同じタスクを複数のプログラムで表現してあることも評価できます。あと苦労した点についてのまとめや、マシンの詳細や組み立て時の情報などを付け加えるとよりすばらしいレポートとなるでしょう&wink; とりあえず限りなく◎に近い○としておきます。-- [[まいける(TA)]] &new{2006-06-16 (金) 00:38:31}; #comment ---------------- RIGHT:[[ロボティクス入門ゼミ]] RIGHT:[[2006a/C2]] -------------------