[[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 -マシンがトレイスをしている感じを見る人により強く印象つけるために、マシンを %%%小型化%%% した。 -周回コースを2台のロボットが走行することが想定されるそうなので、ほかのマシンに想像を絶するくらい勢いよく、衝突というより激突されても、びくともしないように %%%重量感のあるマシン%%%に仕上げた。 -リアバンパーを取り付けたため、ほかのマシンにかなり勢いよく衝突されても、自機のタイヤと他機のタッチセンサー郡が絡まないようにした。 -また前方にもタイヤの保護帯を取り付けることにより、自機のタイヤと他機が絡みついたり、引っかかったりしないようにした。 -タッチセンサー郡を小型化することで、マシン全体を小さく、また正方形に近い形することが出来た。これにより、前方のマシンと衝突した場合でも、 %%%反転のための動きで、再び他機と衝突することを防ぐために自機を後退させる必要が無くなり、無駄なアクションを減らすことが出来る。%%% ---------------- *前方のロボットに接触したら反転して進むロボット [#y7381ced] 前半後半に課題を分けさせてもらいますと、前半となりますこの課題。とりあえず、ライントレースをするプログラムにタッチセンサーに反応があった場合、反転することを命ずる部分を追加した。 ----------- **プログラムの紹介 [#l69cf354] ------------------ モーターA 車体左側の動力担当 順回転で前進 モーターC 車体右側の動力担当 順回転で前進 センサー1 光センサー 車体左側の監視を担当 センサー3 光センサー 車体右側の監視を担当 サンサー2 タッチセンサー マシン前方の中央に設置 #define T 40 //TはTHRESHOLD(閾値)の頭文字 #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>T)&&(SENSOR_3>T))//1&3w //センサー1(左)と2 (右)が白を感知した場合 { OnFwd(OUT_A+OUT_C);} 問題なし。ひたすら前進する if((SENSOR_1>T)&&(SENSOR_3<T)) //1w 3b //センサー1(左)が白 センサー3(右)が黒を感知した場合 (マシンが左にずれた場合) {OnRev(OUT_C); OnFwd(OUT_A);} 右へ急旋回し、軌道の修正を図る if((SENSOR_1<T)&&(SENSOR_3>T))//1b 3w //センサー1(左)が黒 センサー3(右)が白を感知した場合 (マシンが右にずれた場合) {OnRev(OUT_A); OnFwd(OUT_C);} //左へ急旋回し、軌道の修正を図る if((SENSOR_1<T)&&(SENSOR_3<T))//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]]のように --------------------- *前方のロボットに接触したらそのロボットを右側から追い抜いて(あるいは避けて通り)、再びライン上に戻って進むロボット [#y6315815] 後半にあたりますこちらのプログラム。このプログラムではロボットが接触した場合、右側に避けつつ追い抜いて行くようにプログラムを書いています。 ---------------- **プログラムの紹介 [#l140f428] #define LB 42 // 閾値を42にするつもりで、LBと設定 task main(){ SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_LIGHT); int pt = 0; while(1){ if((SENSOR_1 >= LB) && (SENSOR_3 >= LB)){ pt = 1; // センサーがどちらも白と判断している場合モード1に移行 }else if((SENSOR_1 < LB) && (SENSOR_3 >= LB)){ //left=kuro pt = 2; // センサーの左側が黒と判断されている場合モード2に移行 }else if((SENSOR_1 >= LB) && (SENSOR_3 < LB)){ //right=kuro pt = 3; // センサーの右側が黒と判断されている場合モード3に移行 }else if((SENSOR_1 < LB) && (SENSOR_3 < LB)){ //aal=kuro pt = 4; // センサーがどちらも黒と判断している場合モード4に移行 } if(SENSOR_2 == 1){ pt = 5; // タッチセンサーが押された場合モード5に移行 } switch(pt){ case 0: case 1: // モード1 OnFwd(OUT_A+OUT_C); break; case 2: // モード2 OnFwd(OUT_C); OnRev(OUT_A); break; case 3: // モード3 OnFwd(OUT_A); OnRev(OUT_C); break; case 4: // モード4 OnFwd(OUT_A); OnRev(OUT_C); break; case 5: // モード5 OnFwd(OUT_A); OnRev(OUT_C); Wait(50); OnFwd(OUT_A+OUT_C); Wait(175); OnFwd(OUT_C); OnRev(OUT_A); Wait(50); OnFwd(OUT_A+OUT_C); Wait(175); OnFwd(OUT_C); OnRev(OUT_A); Wait(50); OnFwd(OUT_A+OUT_C); break; } } } ***プログラムの説明 [#y2ebeff1] -こちらのプログラムは少し嗜好をこらしてみました。(ただ単プログラムを書いた人が、昔やっていたC言語の名残でついこうなってしまったというのもありますが、これはこれでおもしろいからいいのかな、と思っています。だからプログラム設計者は全く後悔していませんよ、えぇそうですとも!!) -まず、define文で閾値を設定した後、センサーの定義をそれぞれ行い、while(1)で無限ループを構築しています。まぁ、だれでも分かるとはおもいますけども。 -次からが問題です。上のプログラム内でもコメントで書いてありますが、ptという関数にそれぞれの状態の時に数値を代入します。この行動自体はごく普通なのですが。 ---------------- *先生のコメント [#x6621bd3] 学生にとって、先生のアドバイスは三度の飯より重要です。 プログラムやマシン・レポートの良い点・悪い点・改良するべき点などがございましたら、どんな些細なことでもよろしいので、お書きくださいませ。 #comment ---------------- RIGHT:[[ロボティクス入門ゼミ]] RIGHT:[[2006a/C2]] -------------------