目次
#contents

*1、レポートの概要 [#n41e83f1]
 今回の課題で、私はバッターのロボットを担当した。このレポートでは、ピッチャーロボットとの連携やバッターロボットの構造、バッターロボットのプログラムについて説明する。
 今回の課題で、私はバッターのロボットを担当した。このレポートでは、ピッチャーロボットとの連携やバッターロボットの構造、バッターロボットのプログラムについて説明する。このレポートで使用しているコースの地図の画像はロボティクス入門ゼミのホームページの課題3から引用している。
#ref(2016b/Member/ats/Mission3/view.gif,50%,バッターロボットの全体像)

*2、 ロボットの構造[#q795a61a]
 バッターロボットは、上の写真を見てもわかるように台車の上に制御装置を置き、その上にバットとそれを振るモーターがつくという構造になっている。バッターロボットはバットを振るだけでいいので、このような単純な構造にした。また、こうすることで最初の移動の時に正確な移動ができるようになった。

**⑴台車 [#lcfe2938]
#ref(2016b/Member/ats/Mission3/sensor.gif,50%,台車)
 ロボットの動作には光センサーを使用したため、正確な動作のために台車は小回りが利くように作る必要があった。そのため、車輪は2つ設置し、上の写真を見てもわかるように車輪の近くに光センサーを設置した。また、今回の課題では回転センサーを使用したが、上の写真のように設置してある。

**⑵バット [#r61423de]
#ref(2016b/Member/ats/Mission3/batto.jpg,50%,バット)
 バットは、ボールに当てる確率を上げるために長くした。また、スイングスピードを上げるためにモーターの軸に直接取り付けてた。スイングスピードを速くしたのは、打球のスピードを上げて10点のゴールも狙えるようにするためだ。長いバットを高速で振るため、バットとバットを動かすモーターを支える部分には大きな力が加わる。そのため、上の写真のように強力な補強を施した。下の写真は構えた時のバットの位置(水色の部分)で、その右側の図はボールを打つ過程である。

&ref(2016b/Member/ats/Mission3/batto1.jpg,40%,バットの位置);  &ref(2016b/Member/ats/Mission3/batting.gif,50%,過程);

 このロボットは光センサーがある方を進行方向として動いて、車輪も進行方向側に寄っている。そのため、バットを進行方向前側に設置すると車輪と接触する可能性があった。そこで車輪のない進行方向後ろ側にバットを設置することでこの問題を解決した。また、それに伴って機器同士の通信をする送受信部分も進行方向後ろ側に向いている。

*2、プログラム [#y28a6f33]
 今回は、移動のプログラムを私が書き、通信及びバッティングのプログラムをバッターロボットの相方が書き、それを合わせて一つのプログラムとした。そのため、マクロやプログラムの書き方に違いが出ている。
 今回は、移動のプログラムを私が書き、通信及びバッティングのプログラムをバッターロボットの相方が書き、それを合わせて一つのプログラムとした。そのため、マクロやプログラムの書き方に違いが出ている。(大文字のマクロは私が、小文字のマクロは相方が書いた)

**⑴移動のプログラム [#c4884574]
移動のプログラムは私が担当した。プログラムの書き方としては3つのサブルーチンに分割して、task main()はセンサーの設定と3つのサブルーチンを書くのみとした。3つのサブルーチンの分け方は以下のとおりである。
#ref(2016b/Member/ats/Mission3/map.jpg,50%,青線→赤線→緑線)

 位置的には直進できるが、そうすると4点のゴールにぶつかってしまうため、このようなルートとなった。

***P1(青線) [#le2dd0a7]

 #define BLANK Off(OUT_ABC);Wait(30); //動作の安定のために一時停止するマクロ
 
 #define WHITE 47 //白の光センサーの下限値
 
 #define BLACK 40 //黒の光センサーの上限値
 
 #define FIRST_COUNT 21 //スタートの黒枠を出てから45度回転するまでの回転センサーの値
 
 #define TURN_L45 ClearSensor(SENSOR_3);OnFwd(OUT_A);OnRev(OUT_C);until(SENSOR_3 == -6);Off(OUT_AC); //左に45度回転するときのマクロ
 
 #define TURN_R45 ClearSensor(SENSOR_3);OnFwd(OUT_C);OnRev(OUT_A);until(SENSOR_3 == 6);Off(OUT_AC); //右に45度回転するときのマクロ
 
 #define FORWARD_W_B OnFwd(OUT_AC);until(SENSOR_2 < BLACK);Off(OUT_AC); //白いところから黒いところに入るまで直進するマクロ
 
 #define FORWARD1(X) ClearSensor(SENSOR_3);OnFwd(OUT_AC);until(SENSOR_3 == X);Off(OUT_AC); //回転センサーがxの値になるまで直進するマクロ

 sub P1()
 {
   TURN_R45;
   BLANK;
   FORWARD_W_B;
   FORWARD1(FIRST_COUNT);
   BLANK;
   TURN_L45;
   BLANK;
 }

 プログラムの流れとしては「B枠の方向を向いたロボットを右斜めに回転する→黒線を感知するまで直進する→そこから設定した回転センサーの値まで直進する→左斜めに回転して元の向きに戻す」という流れになっている。光センサーを使用することで、最初の位置取りによる誤差がなるべくなくなるようにした。また、回転センサーを使用することにより、正確な移動ができるようにした。

***P2(赤線) [#o4c6a80b]

 #define WHITE 47 //白の光センサーの下限値
 
 #define BLACK 40 //黒の光センサーの上限値
 
 #define FORWARD_W_B OnFwd(OUT_AC);until(SENSOR_2 < BLACK);Off(OUT_AC); //白いところから黒いところに入るまで直進するマクロ
 
 #define FORWARD_B_W OnFwd(OUT_AC);until(SENSOR_2 > WHITE);Off(OUT_AC); //黒いところから白いところに入るまで直進するマクロ

 sub P2()
 {
   repeat(3)
   {
     FORWARD_W_B;
     FORWARD_B_W;
   }
 }

 先ほどの移動ルートの図を見てもわかるように、P2(赤線)のルートは3本の黒線を横断するルートとなっている。そこで「白いエリアを進む→黒いエリアを進む」という流れを3回繰り返すことで、ちょうど左側にB枠が来るようにした。また、光センサーのみを使用することでP1(青線)で生じた誤差を修正することができる。下の図はこのプログラムを図解したものである。

#ref(2016b/Member/ats/Mission3/p2.jpg,70%,P2)

***P3(緑線) [#f1c1cd07]

 #define BLANK Off(OUT_ABC);Wait(30); //動作の安定のために一時停止するマクロ
 
 #define WHITE 47 //白の光センサーの下限値
 
 #define BLACK 40 //黒の光センサーの上限値
 
 #define B_COUNT 17 //バッターボックスに入ったあとに進む距離の回転センサーの値
 
 #define TURN_COUNT 10 //90度回転するときの回転センサーの値
 
 #define TURN_L ClearSensor(SENSOR_3);OnFwd(OUT_A);OnRev(OUT_C);until(SENSOR_3 == -TURN_COUNT);Off(OUT_AC); //左に90度回転するときのマクロ
 
 #define FORWARD_W_B OnFwd(OUT_AC);until(SENSOR_2 < BLACK);Off(OUT_AC); //白いところから黒いところに入るまで直進するマクロ
 
 #define FORWARD1(X) ClearSensor(SENSOR_3);OnFwd(OUT_AC);until(SENSOR_3 == X);Off(OUT_AC); //回転センサーがxの値になるまで直進するマクロ
 
 #define turnr(b) ClearSensor(SENSOR_3);OnFwd(OUT_C);OnRev(OUT_A);until(SENSOR_3>=b);Off(OUT_AC);ClearSensor(SENSOR_3); //右旋回

 sub P3()
 {
   OnFwd(OUT_AC);
   Wait(30);
   BLANK; //少し直進
 
   TURN_L;
   BLANK;
   FORWARD_W_B;
   FORWARD1(B_COUNT);
   BLANK;
   turnr(5);
 }

 このプログラムの流れとしては「P2(赤線)終了後、少し直進→左に90度回転→Cの枠線に着くまで直進(光センサー使用)→設定した回転センサーの値になるまで直進→右斜めに回転してバットと送受信部がピッチャーロボットの方向に向くようにする」という流れである。光センサーでBの枠を感知することで、全て回転センサーに頼るときに比べてそれまでの移動での誤差の影響を最小限にとどめてほぼ同じ位置に停止することができる。実際、プログラムを組む過程で何回か移動実験を行ったがほとんどの場合でBの枠内に収まり、送受信部がピッチャーロボットの方向に向いた。

**&#9333;バッティングのプログラム [#l4eb1746]
 今回のバッティングのプログラムは相方が担当した。プログラムの流れとしては、ピッチャーロボットと通信できるまで近づき、そのあとバッティングが始まるという流れだ。

***通信可能になるまで近づくプログラム [#kcffddd6]

 #define back(d) ClearSensor(SENSOR_3);OnRev(OUT_AC);until(SENSOR_3<=-d);Off(OUT_AC);ClearSensor(SENSOR_3); //後退
 
 #define test 101 //受信可能であることを確認後、ピッチャーロボットが受信可能か確かめるメッセージ
 
 #define confirm2 201 //バッターロボットが近づいてる間、ピッチャーロボットから送信されるメッセージ(バッターロボットが移動してる間、ピッチャーロボットから連続して送信される)

 while(Message()!=confirm2) //ピッチャーロボットからメッセージを受信するまで後退を続ける
  {
    Wait(80);
    back(1);
  }
 
 PlaySound(SOUND_UP); //受信したら音を鳴らす
 
 back(4); 安定した通信環境を確保するため、さらに後退する
 
 repeat(10) //ピッチャーロボットに確認メッセージを送信する(念のために連続して送信している)
 {
   SendMessage(test);
 }

 どちらのロボットも、移動の際に誤差ができて毎回同じ場所に止まるということが難しい。そのため、場合によってはお互いに通信できない場所に止まることがある。そこでこのプログラムを実行することによって、通信できないという事態を防ぐことにした。ほとんどの場合、初めから通信可能でこの近づくプログラムは実行されないことが多かったが、このプログラムによって通信できるようになった例はいくつかあり、効果は確認されている。

***バッティングのプログラム [#xc04317c]

 #define BLANK Off(OUT_ABC);Wait(30); //動作の安定のために一時停止するマクロ
 
 #define getset 100 //投げる合図(こっちが受け取る)
 
 #define confirm 200 //投げる合図の確認(こっちが送る)
 
 #define hit OnRev(OUT_B);Wait(15);Off(OUT_B); //バットを構える(振ったアームを戻す)
 
 #define set OnFwd(OUT_B);Wait(15);Off(OUT_B); //バットで打つ
 
 #define t1 220 //ピッチャーロボットが投球してからバットを振るまでの時間

 repeat(5)
 {
   ClearMessage();
   until(Message()==getset); //ピッチャーロボットからのメッセージが来るまで待機
 
   repeat(10) //投げる合図を受け取ったら確認のメッセージを送る(念のため連続で送信)
   {
     SendMessage(confirm);
   }
 
   Wait(t1); //メッセージ送信後、ピッチャーロボットが投球するため、バットを振るタイミングまで待つ
 
   PlaySound(SOUND_DOUBLE_BEEP); //振る時に音を鳴らす
   
   set;
   BLANK;
   hit; //バットを振る
 }

 バッティングのプログラムは5球打つようになっている。ピッチャーロボットとの通信はその都度行うため、通信のプログラムとバッティングのプログラムの両方がrepeatの中に入っている。その都度通信を行うことで最初のみ通信をするときに比べ、最初の誤差を後の方まで引きずらないようにした。

*3、まとめ、感想 [#gff627e0]
 今回の課題はロボットを2台使い、4人で協力して取り組むという難しい課題だった。今までの課題は2人ずつ独立していたため、プログラムは自分流で予定も合わせやすかった。しかし、今回は通信機能を使ったため、通信する時のメッセージの数字やどのように通信するかなど、完全に自分流にというわけにはいかなかった。また、通信機能を使ったプログラムは片方のロボット単体で試せるものではなく、両方のロボットが無いと試せないものだったので、4人の都合の合う日を探らなければいけなかった。そのため、一人で進められるところは独自に進めるようにしないといけなかった。そのような状況のなかで無事に完成にたどりつけられたことはすごいことだなと思った。私は、この授業を通して、アイデアを生み出したりお互いに協力したりする力が身に着いたと感じている。いろいろ大変な授業だったが、有意義な授業だったと思う。


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