目次

課題

全体図

最後の課題は、ピッチャーロボットはA地点からQ地点、バッターロボットはC地点からB地点までゴールに接しないように行き、5球投げそれを打つというものだ。
私たちはピッチャーロボを担当し、中でも私は移動のプログラムを担当した。

ロボットの説明

全体像

これがロボットの概観である。

全体像


タイヤは2つにして、後ろは滑るようになっている。
進行方向に対して右側にボールを打ち出すようにしてある。また、本体自体も右方向へ向いているため、そのまま通信ができるようになっている。
これのおかげで、スタート地点から所定の位置に行くことが簡単になった。

投球部分

ボールを投げる機構はこのようになっている。

ピッチング


50,ピッチング

黄色のブロック(以下ストッパー)はボールをせき止めて、下の2つの黒い曲がったブロックはすべり台のような役目をしている。ボールが投げ出される仕組みはこうである。

―蕕瓩魯棔璽襪鮴僂鵑西態で、ストッパーがせき止めている。
▲癲璽拭爾回転することによってギアが回り、ストッパーが手前に来て、ボールが下におちる。ただしこのとき(2つめの写真を見ればわかるが)、すべり台が上に来るように回転して、ボールが流れないようになる。
ストッパーが奥に戻ると、同時にすべり台が下がってきて、打ち出される。

こんな感じである。
すべり台のギアを小さくすることで、ストッパーの移動と比べてより多く回転するようにした。

プログラムの説明

サブルーチンで使用するものを以下のように定義した。

#define THROW_SIGNAL 100        //こちらが送る数字
#define BATTING_SIGNAL 200      //相手から送られてくる数字
                               //ピッチングに用いる

#define CALL_SIGNAL 201         //こちらが送る数字
#define RESPONS_SIGNAL 101      //相手から送られてくる数字
                                                              //通信のチェックに用いる

これらはすべて、通信用の数字である。詳しくはこのあと説明する。

AからQ地点まで〜

まず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);
}


スタートはA地点であるが、方向はB地点を向いているため、初めに左へ約45°旋回してからQに向けて直進という感じにした。
私たちの班では、最初の移動で光センサは使わずに、回転センサだけでプログラムを組んだ。ここで苦労したのが、毎回所定の位置に行くけれど、少しの誤差がどうしてもなくすことができなかった。光センサを使用しておけばよかったと、今になってすごく感じる。
それでもかなりの確率でベストポジションに行けたので、よかったと思っている。
Cだけパワーを抑えた理由は、それぞれを同じ力にするとBのタイヤの方へ曲がっていってしまうためである。

通信のチェック

sub tsusin_check()
{
    ClearMessage();
    while(Message()!=RESPONS_SIGNAL){
        Wait(40); 
        SendMessage(CALL_SIGNAL);        //応答が来るまで、CALL_SIGNALを送り続ける
    }
    PlaySound(SOUND_UP);                 //応答が来たら、音を鳴らす
} 

これは通信ができるかチェックするプログラムである。
こちらが通信を送り続け、向こうはこれを受け取ったら返信して、こちらがその返信を受け取ったら停止する。
といった感じである。
これが終われば、通信ができる状態になっているので、その後の動作が可能になる。

ピッチング

sub pitching()
{
    SetPower(OUT_A,0);
    OnFwd(OUT_A);
    Wait(20);
    Off(OUT_A);     //ストッパーが手前に移動し、ボールを通せるようにする
     
    Wait(60);
     
    OnRev(OUT_A);
    Wait(21);
    Off(OUT_A);     //ストッパーを戻し、ボールを転がす
}

これはピッチング自体のプログラムであり、後のプログラムに組み込む。
ピッチングの方法の詳細は上で説明したため、ここでは省く。
パワーを最大限小さくして、激しい動きによる負荷を抑えた。

sub tsusin_pitching()
{
    ClearMessage();
      while(Message()!=BATTING_SIGNAL){
          Wait(30);
          SendMessage(THROW_SIGNAL);        //返答が来るまで、THROW_SIGNALを送り続ける
      }
    PlaySound(SOUND_LOW_BEEP);
    pitching();                              //音を鳴らし、ピッチング
}

そしてこれが通信部分を組み込んだプログラムである。
原理は通信チェックと同じで、こちらが通信を送り続けて受け取ったことを確認したら、音を鳴らしてピッチングを始める。

メインプログラム

これがメインのプログラムである。

task main()
{
    AtoQ();                   //AからQへ移動
    tsusin_check();           //通信のチェック
    repeat(5){
       tsusin_pitching();
    }                         //ピッチングを5回繰り返す
}

task mainはとてもすっきりしたものになってよかった。複雑なプログラムではないので、修正するときも、とてもやりやすかった。
5回繰り返す部分は、単純にrepeatを用いた。
ちなみにバッターロボのチームのHPはこちらである。

結果

私たちのグループは7チーム中4位であった。
一回目はボールが詰まってしまって、思ったような結果が出なかった。二回目はロボットのボールを積む部分を修正して挑んだが、今度はバットを振るタイミングが少し早くてボールをあまり打つことができなかった。けれど、それ以外は個人的にはパーフェクトだった。また、1球だけゴールに入ったので満足だった。

反省点と感想

今回は最後の課題ということで、とても難易度が高かった(と思う)。ロボットを1台動かすのと、2台を連携させて動かすのとは全然難易度が違っていて、すごく大変だった。だが、前回よりはプログラムはすっきりしていて、単純なものであったので、その点だけはよかったなと思う。
この授業を通して、私はとても大きな達成感を感じられた。最初は、文系であるためにこういうプログラミングなど、しっかりできるか不安だったが、案外努力すればできるものであった。将来、これを使うことはないだろうけれど、とてもいい経験ができたんだとと思う。
約5か月間、お疲れ様でした。


添付ファイル: files_14086.jpg 67件 [詳細] files_14090.jpg 70件 [詳細] files_14084.jpg 63件 [詳細] file2016b-mission3.png 66件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-02-12 (日) 15:35:04 (922d)