*目次 [#p29d7ff8]
#contents
*課題 [#k9798d32]
#ref(./s_2016b-mission2.png,コース)
次のいずれかの経路を黒い線にそって動くロボットを作成する (他のメンバーとは別の経路になるようにする)。

&br;・A地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をD地点においたゴールへシュートする (一人目)
&br;Aスタート → P直進 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S左折 → Dへシュート
&br;・B地点をスタートしてQ付近の3/4円周上でピンポン玉をつかみ、そのピンポン玉をC地点においたゴールへシュートする (二人目)
&br;Bスタート → R直進 → P右折 → Q直進 → (ピンポン玉をキャッチ) → Q直進 → R右折 → P直進 → S右折 → Cへシュート

&br;ただし、

&br;なるべく速く正確に動くロボットになるように工夫して、交差点では1秒間停止すること。
&br;ピンポン玉はQ近くの3/4円周上ならどこにおいてもよい
&br;可能であればC,Dのゴールエリアライン上からシュートする

&br;私はA点→D点のコースを担当した。
 A点→P直進→Q直進→R右折→P直進→S左折→D点→シュート
*ロボットの説明 [#o3709025]
#ref(./s_12459.jpg,全体像)
#ref(./s_12462.jpg,全体像)

今回はできるだけコンパクトにするためにタイヤ同士の間隔を狭くした。また細かな動きができるように、大きい方のタイヤを前輪とした。ピンポン玉をつかむのにクワガタムシ方式を取り入れた。
#ref(./s_12460.jpg,50,arm)
ここのところで工夫した点は、ギアを組合わせるのに高さがずれていたためギアを2つ重ねたことだ。

*プログラムの説明 [#h51302c2]
task mainやサブルーチンで使用するものを以下のように定義した。
 #define rightSENKAI OnFwd(OUT_A);OnRev(OUT_C); //右旋回
 #define rightMAGARU OnFwd(OUT_A);Off(OUT_C); //右に曲がる
 #define leftSENKAI OnFwd(OUT_C);OnRev(OUT_A); //左旋回
 #define leftMAGARU OnFwd(OUT_C);Off(OUT_A); //左に曲がる
 #define middle 47 //閾値
  
 #define go(got) OnFwd(OUT_AC);Wait(got);Off(OUT_AC); //got秒直進
 #define TURN_RIGHT OnFwd(OUT_A);OnRev(OUT_C);until(SENSOR_2<=40);Off(OUT_AC); //左折
 #define TURN_LEFT OnFwd(OUT_C);OnRev(OUT_A);until(SENSOR_2>=50);Off(OUT_AC); //右折
 #define TURN_RIGHT OnFwd(OUT_A);OnRev(OUT_C);until(SENSOR_2<=40);Off(OUT_AC); //センサーが黒を感知するまで右折
 #define TURN_LEFT OnFwd(OUT_C);OnRev(OUT_A);until(SENSOR_2>=50);Off(OUT_AC); //センサーが白を感知するまで左折
 #define cross_stop Off(OUT_AC);Wait(100); //交差点で1秒停止
 #define middle 47 
 #define middleSP 49

2つの閾値と「左右に曲がる」「右折左折」については後に説明する。
「左右に曲がる」と「右折左折」については後に説明する。
**ライントレースのプログラム [#d5b3ace5]
私はロボットが黒線の左側をなぞるプログラムを考えた。よってロボットは

&br;黒−左旋回
&br;黒っぽい―左に曲がる
&br;黒と白の中間―直進
&br;白っぽい―右に曲がる
&br;白−右旋回
&br;といった感じに動くとした。
交差点の判別は、左旋回が0.3秒以上であるなら(黒が0.3秒以上続くのなら)停止するという風にした。

そして基本的なライントレースのプログラムを以下のように定義した。
 sub Line() //ライントレース
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  ClearTimer(0);
  while(FastTimer(0)<=30) //左旋回が0.3秒以内の場合はループしなさい
  {
   if(SENSOR_2>middle+5)    
    {
     rightSENKAI
     ClearTimer(0);     //白だったら右旋回しなさい
    }
   else if(SENSOR_2>middle+3)    
    {
     rightMAGARU
     ClearTimer(0);     //白っぽいなら右に曲がりなさい
    }
   else if(SENSOR_2>middle)   
    {
     OnFwd(OUT_AC);
     ClearTimer(0);     //中間なら直進しなさい
    }
   else if(SENSOR_2>middle-3)    
    {
     leftMAGARU
     ClearTimer(0);          //黒っぽいなら左に曲がりなさい
    }
   else    
    {
     leftSENKAI        //黒なら旋回しなさい
     }
   }
 Off(OUT_AC);        //とまれ
 }

これで大半はできたが、一部うまくいかない区間があった。そこはRP間であり、うまく交差点判別ができなかった。
&br;理由はおそらく交差点への進入角度が垂直でなく、やや左側に傾いていたからだ。私のプログラムは線の左側をなぞるため、左斜めに進入すると左旋回の時間が0.3秒以内に収まってしまったと考えられた。
&br;そこでその区間だけ特別にプログラムを組んだ。

 sub LineSP()  //ライントレースSP
 {
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  ClearTimer(0);
  while(FastTimer(0)<=30)
  {
   if(SENSOR_2>middle+7)    
    {
     rightSENKAI
     ClearTimer(0);
    }
   else if(SENSOR_2>middle+5)    
    {
     rightMAGARU
     ClearTimer(0);
    }
   else if(SENSOR_2>middle)   
    {
     OnFwd(OUT_AC);
     ClearTimer(0);
    }
   else if(SENSOR_2>middle-6)    
    {
     leftMAGARU
     ClearTimer(0);
    }
   else    
    {
     leftSENKAI   
     }
  }
 Off(OUT_AC);
  }

解決策としては仝鮑硬脆淑未0.3秒を短くする交差点進入を垂直にする、の2つが考えられた。,里曚Δ浪寝鵑tryしたがうまくいかなかったため、あきらめて△鯀択した。
&br;中身はほとんど変えず、middleに加減する数値を徐々に大きくしてみたところ、より垂直に進入するようになった。結果、この数字でうまくいった。

**ピンポン玉のキャッチとシュート [#l199736a] 
ピンポン球のキャッチは以下に定義した。
 void hold(int t)    //球のキャッチ
  {
 
   OnFwd(OUT_B);
   Wait(t);
   Off(OUT_B);    //ハサミを閉じる
 
   }

プログラムを楽にするために初めの段階からハサミを開いておいて、あとは閉じるだけにした。

&br;次にシュートのプログラムである。
 sub shoot()      //シュート
 {
 
  rightSENKAI   
  Wait(20);    //右に角度調整
  OnRev(OUT_AC);
  Wait(30);       //少し後退
  OnRev(OUT_B);
  Wait(10);    //ハサミを開く
  go(30);     //直進して、勢いでゴール
  Off(OUT_ABC);  //すべて停止
 
 }

シュートは最後なので、シュートの直前は交差点判別されて(T字路っぽくなっているから)止まっているはずである。またそのときロボットはゴールに対してやや左側へ傾いている。
&br;よって角度を右に修正してあげる必要がある。あとは少し後退して、ハサミを開き、直進して勢いでゴールさせる。

*メインプログラム [#x63349f2]
 task main()
 {
  
  Line();      //A-P間
 
  cross_stop  //一時停止
 
  go(30);   //直進
 
  Line();      //P-Q間
   
  cross_stop   //一時停止
 
  go(30);      //直進
 
  hold(15);  //球キャッチ
 
  Line();      //Q-Q間
  
  cross_stop   //一時停止
 
  go(20);      //直進
 
  Line();      //Q-R間
 
  cross_stop   //一時停止
 
  hold(5);     //ハサミの緩みをなおす
 
  go(30);      //直進
 
  TURN_RIGHT   //右折
  TURN_RIGHT   //センサーが黒を感知するまで右折
 
  LineSP();    //R-P間
 
  cross_stop   //一時停止
 
  go(30);      //直進
 
  Line();      //P-S間
 
  cross_stop   //一時停止
 
  TURN_LEFT    //左折
  TURN_LEFT    //センサーが白を感知するまで左折
 
  Line();   //S-D間
 
  shoot();     //シュート
 
 }
  

交差点からの直進や左右折の対処に関して、あらかじめコースが決められているためその都度直進させたりしてからライントレースにしている。そのためサブルーチンのものとは違うマクロを用意した。
*反省点と感想 [#e52ae42f]
字がとてもふにゃっとしており(特に縦線)、出来があまりよくなかった。もうすこし篇を持つ部分を補強できればよくなったのではないかと思う。また其の部分をもうすこしプログラミングをきれいにできたらよかった。今回を踏まえて、次回はもっとよいものを作りたい。
本体自体の完成も若干手間がかかったため、授業終了後も残ってプログラムを作った。またライントレースがうまくいかなくて何回も数値をいじったりの繰り返しでとても大変だった。
&br;けれども本番でちゃんと動いてゴールもできたときはとても嬉しくて感動した。
&br;今回の反省点はプログラムが大きくなってしまったことである。次回が最後なので今回のことを生かして頑張りたいと思う。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS