[[2006a/C2]]

#hr
CENTER:&size(25){課題2:黒い線に沿って動くロボット };
#hr


CENTER:製作者:佐藤 堀 (五十音順)

RIGHT:カウンタ&counter;
RIGHT:[[ロボティクス入門ゼミ]]
RIGHT:[[2006a/C2]]
------------
目次
#contents
-------


*この課題について [#n09e55e3]


-この課題ではスピードと確実性をできる限り両立させたマシンとプログラムを作製しなければならない。

-コースのショートカットをしないようにする。
-コースのショートカットをしないようにする。コースアウトをしないようにする。

-主に[[NQC入門]]の[[ここ>NQC入門/5. センサを使う]]を参考にプログラムの開発を行う。
-----------
*この課題の解決への方針 予想される問題点 [#m118daf0]

-この課題では、正確性と迅速性といった相反する性質をマシンに与えることが目標である。しかし、マシンの速度を上げると正確性が落ち、速度を落とせば正確性が上昇するが、迅速性が無くなる。ということが予想される。
-この課題では、正確性と迅速性といった相反する性質をマシンに与えることが目標である。しかし、マシンの速度を上げると正確性が落ち、速度を落とせば正確性が上昇するが、迅速性が無くなる。

-
-マシンがコースアウトする原因はマシンがカーブに差しかかったときに、旋回が間に合わないためであろうと予想される。
そこで、我々の班は旋回に間に合うようにマシンの速度を遅くするのではなく、旋回をすばやく行えるようにマシン・プログラムを改良する。(予定)

-前輪操舵か?後輪操舵か?やはり全輪操舵か?
--今回のコースにはけっこう急なカーブがあり前輪操舵・後輪操舵では難易度高し。そこで全輪操舵を採用。(が二輪、三輪にする場合あり)

-今回の課題では、プログラムはどの班も似た形になると思われる。そこで今回はプログラムでは差がつかないので、マシンの改良に力を入れてみる。


------------
*マシンの紹介 [#ya896662]
*マシンの紹介(大幅に改良する場合あり) [#ya896662]

***マシンの名前 [#saa248bf]
***マシンの名前 [#saa248bf]

 命名:BE▲GO

-マシンがトレイスをしている感じを見る人により強く印象つけるために、マシンを
%%%小型化%%%
した。

-周回コースを2台のロボットが走行することが想定されるそうなので、ほかのマシンに想像を絶するくらい勢いよく、衝突というより激突されても、びくともしないように
%%%重量感のあるマシン%%%に仕上げた。

-リアバンパーを取り付けたため、ほかのマシンにかなり勢いよく衝突されても、自機のタイヤと他機のタッチセンサー郡が絡まないようにした。

-また前方にもタイヤの保護帯を取り付けることにより、自機のタイヤと他機が絡みついたり、引っかかったりしないようにした。

-タッチセンサー郡を小型化することで、マシン全体を小さく、また正方形に近い形することが出来た。これにより、前方のマシンと衝突した場合でも、
%%%反転のための動きで、再び他機と衝突することを防ぐために自機を後退させる必要が無くなり、無駄なアクションを減らすことが出来る。%%%
----------------
*前方のロボットに接触したら反転して進むロボット [#y7381ced]
*前方のロボットに接触したら反転して進むロボット [#y7381ced]

前半後半に課題を分けさせてもらいますと、前半となりますこの課題。とりあえず、ライントレースをするプログラムにタッチセンサーに反応があった場合、反転することを命ずる部分を追加した。

-----------
**プログラムの紹介 [#l69cf354]
------------------
 モーターA 車体左側の動力担当 順回転で前進
 モーターC 車体右側の動力担当 順回転で前進

 センサー1 光センサー 車体左側の監視を担当
 センサー3 光センサー 車体右側の監視を担当
 サンサー2 タッチセンサー マシン前方の中央に設置
 サンサー2 タッチセンサー マシン前方の中央に設置

 #define T 40 //TはTHRESHOLD(閾値)の頭文字
 #define  TIME 160  //マシンが反転するのにかかる時間、課題1と同様に直前に測定する。
 #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>T)&&(SENSOR_3>T))//1&3w  //センサー1(左)と2 (右)が白を感知した場合
   f((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))//1&3w  //センサー1(左)と2 (右)が白を感知した場合
             { OnFwd(OUT_A+OUT_C);} 問題なし。ひたすら前進する
                     
  if((SENSOR_1>T)&&(SENSOR_3<T)) //1w 3b //センサー1(左)が白 センサー3(右)が黒を感知した場合
  if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) //1w 3b //センサー1(左)が白 センサー3(右)が黒を感知した場合
                                                         (マシンが左にずれた場合)
             {OnRev(OUT_C); OnFwd(OUT_A);} 右へ急旋回し、軌道の修正を図る
               
   if((SENSOR_1<T)&&(SENSOR_3>T))//1b 3w //センサー1(左)が黒 センサー3(右)が白を感知した場合
   if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))//1b 3w //センサー1(左)が黒 センサー3(右)が白を感知した場合
                                                         (マシンが右にずれた場合)
             {OnRev(OUT_A); OnFwd(OUT_C);}   //左へ急旋回し、軌道の修正を図る
                
   if((SENSOR_1<T)&&(SENSOR_3<T))//1b 3b //センサー1(左)と2(右)が黒を感知してしまった場合
   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]]のように

---------------------
*前方のロボットに接触したらそのロボットを右側から追い抜いて(あるいは避けて通り)、再びライン上に戻って進むロボット [#y6315815]
*前方のロボットに接触したらそのロボットを右側から追い抜いて再びライン上に戻って進むロボット [#ze40fe3a]

後半にあたりますこちらのプログラム。このプログラムではロボットが接触した場合、右側に避けつつ追い抜いて行くようにプログラムを書いています。
----------------
**プログラムの紹介 [#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という関数にそれぞれの状態の時に数値を代入します。この行動自体はごく普通なのですが。
今回プログラムを作りましたが、全く同じ内容で別の雰囲気を醸し出すプログラムを三つほど作りました。プログラム自体が行っている処理は表面的に見えるところでは全く変化していないはずです。
-switch文を用いたプログラム
--[[2006a/C2/課題2左/program01]]
-if文を主要な部分で用いたプログラム
--[[2006a/C2/課題2左/program02]]
-サブルーチンを用いたプログラム
--[[2006a/C2/課題2左/program03]]

----------------

*先生のコメント [#x6621bd3]
学生にとって、先生のアドバイスは三度の飯より重要です。
*先生及び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};

#comment
----------------
RIGHT:[[ロボティクス入門ゼミ]]
RIGHT:[[2006a/C2]]

-------------------


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