*目次 [#p29d7ff8] #contents *課題 [#k9798d32] #ref(./2016b-mission3.png,全体図) 最後の課題は、ピッチャーロボットはA地点からQ地点、バッターロボットはC地点からB地点までゴールに接しないように行き、5球投げそれを打つというものだ。 &br;私たちはピッチャーロボを担当し、中でも私は移動のプログラムを担当した。 *ロボットの説明 [#o3709025] **全体像 [#z82ad345] これがロボットの概観である。 #ref(./s_14084.jpg,全体像) &br;タイヤは2つにして、後ろは滑るようになっている。 &br;進行方向に対して右側にボールを打ち出すようにしてある。また、本体自体も右方向へ向いているため、そのまま通信ができるようになっている。 &br;これのおかげで、スタート地点から所定の位置に行くことが簡単になった。 **投球部分 [#ve84eb1b] ボールを投げる機構はこのようになっている。 #ref(./s_14086.jpg,ピッチング) &br; #ref(./s_14090.jpg,50,ピッチング) 黄色のブロック(以下ストッパー)はボールをせき止めて、下の2つの黒いモノはすべり台のような役目をしている。ボールが投げ出される仕組みはこうである。 黄色のブロック(以下ストッパー)はボールをせき止めて、下の2つの黒い曲がったブロックはすべり台のような役目をしている。ボールが投げ出される仕組みはこうである。 &br;&br;�―蕕瓩魯棔璽襪鮴僂鵑西�態で、ストッパーがせき止めている。 &br;�▲癲璽拭爾�回転することによってギアが回り、ストッパーが手前に来て、ボールが下におちる。ただしこのとき(2つめの写真を見ればわかるが)、すべり台が上に来るように回転して、ボールが流れないようになる。 &br;��ストッパーが奥に戻ると、同時にすべり台が下がってきて、打ち出される。 &br;&br;こんな感じである。 &br;すべり台のギアを小さくすることで、ストッパーの移動と比べてより多く回転するようにした。 *プログラムの説明 [#h51302c2] サブルーチンで使用するものを以下のように定義した。 #define THROW_SIGNAL 100 //こちらが送る数字 #define BATTING_SIGNAL 200 //相手から送られてくる数字 //ピッチングに用いる #define CALL_SIGNAL 201 //こちらが送る数字 #define RESPONS_SIGNAL 101 //相手から送られてくる数字 //通信のチェックに用いる これらはすべて、通信用の数字である。詳しくはこのあと説明する。 **AからQ地点まで〜 [#t2eea11b] まずAからQ地点まで行くプログラムである。 sub AtoQ() { SetSensor(SENSOR_2,SENSOR_ROTATION); ClearSensor(SENSOR_2); SetPower(OUT_C,4); Wait(100); PlaySound(SOUND_UP); //スタート音と重ならないように、1秒後鳴る OnFwd(OUT_B); OnRev(OUT_C); until(SENSOR_2==4); //回転センサが4になるまで、左旋回 Off(OUT_BC); ClearSensor(SENSOR_2); OnRev(OUT_BC); until(SENSOR_2==-65); //回転センサが-65になるまで、直進 Off(OUT_BC); ClearSensor(SENSOR_2); } &br;スタートはA地点であるが、方向はB地点を向いているため、初めに左へ約45°旋回してからQに向けて直進という感じにした。 &br;私たちの班では、最初の移動で光センサは使わずに、回転センサだけでプログラムを組んだ。ここで苦労したのが、毎回所定の位置に行くけれど、少しの誤差がどうしてもなくすことができなかった。光センサを使用しておけばよかったと、今になってすごく感じる。 &br;それでもかなりの確率でベストポジションに行けたので、よかったと思っている。 &br;Cだけパワーを抑えた理由は、それぞれを同じ力にするとBのタイヤの方へ曲がっていってしまうためである。 **通信のチェック [#oe871df0] sub tsusin_check() { ClearMessage(); while(Message()!=RESPONS_SIGNAL){ Wait(40); SendMessage(CALL_SIGNAL); //応答が来るまで、CALL_SIGNALを送り続ける } PlaySound(SOUND_UP); //応答が来たら、音を鳴らす } これは通信ができるかチェックするプログラムである。 &br;こちらが通信を送り続け、向こうはこれを受け取ったら返信して、こちらがその返信を受け取ったら停止する。 &br;といった感じである。 &br;これが終われば、通信ができる状態になっているので、その後の動作が可能になる。 **ピッチング [#m7a0bab2] sub pitching() { SetPower(OUT_A,0); OnFwd(OUT_A); Wait(20); Off(OUT_A); //ストッパーが手前に移動し、ボールを通せるようにする Wait(60); OnRev(OUT_A); Wait(21); Off(OUT_A); //ストッパーを戻し、ボールを転がす } これはピッチング自体のプログラムであり、後のプログラムに組み込む。 &br;ピッチングの方法の詳細は上で説明したため、ここでは省く。 &br;パワーを最大限小さくして、激しい動きによる負荷を抑えた。 sub tsusin_pitching() { ClearMessage(); while(Message()!=BATTING_SIGNAL){ Wait(30); SendMessage(THROW_SIGNAL); //返答が来るまで、THROW_SIGNALを送り続ける } PlaySound(SOUND_LOW_BEEP); pitching(); //音を鳴らし、ピッチング } そしてこれが通信部分を組み込んだプログラムである。 &br;原理は通信チェックと同じで、こちらが通信を送り続けて受け取ったことを確認したら、音を鳴らしてピッチングを始める。 **メインプログラム [#u8c41483] これがメインのプログラムである。 task main() { AtoQ(); //AからQへ移動 tsusin_check(); //通信のチェック repeat(5){ tsusin_pitching(); } //ピッチングを5回繰り返す } task mainはとてもすっきりしたものになってよかった。複雑なプログラムではないので、修正するときも、とてもやりやすかった。 &br;5回繰り返す部分は、単純にrepeatを用いた。 &br;ちなみにバッターロボのチームのHPは[[こちら:http://yakushi.shinshu-u.ac.jp/robotics/?2016b%2FMember%2Fats%2FMission3]]である。 *結果 [#p5d15196] 私たちのグループは7チーム中4位であった。 &br;一回目はボールが詰まってしまって、思ったような結果が出なかった。二回目はロボットのボールを積む部分を修正して挑んだが、今度はバットを振るタイミングが少し早くてボールをあまり打つことができなかった。けれど、それ以外は個人的にはパーフェクトだった。また、1球だけゴールに入ったので満足だった。 *反省点と感想 [#e52ae42f] 今回は最後の課題ということで、とても難易度が高かった(と思う)。ロボットを1台動かすのと、2台を連携させて動かすのとは全然難易度が違っていて、すごく大変だった。だが、前回よりはプログラムはすっきりしていて、単純なものであったので、その点だけはよかったなと思う。 &br;この授業を通して、私はとても大きな達成感を感じられた。最初は、文系であるためにこういうプログラミングなど、しっかりできるか不安だったが、案外努力すればできるものであった。将来、これを使うことはないだろうけれど、とてもいい経験ができたんだとと思う。 &br;約5か月間、お疲れ様でした。