目次

課題の説明

課題2で作成したフィールドを使い、バッターとピッチャーの機体をそれぞれ作成して通信などを行いながら、ピッチャーはボールを投げ、バッターはそのボールを打ってゴールに入れる。 そして獲得した点数とロボットの完成度などを参考にして機体を評価する。

課題3.jpg

課題のルール

基本ルール
       ピッチャーロボットとバッターロボットが所定の位置まで移動してピンポン球を投げて打つ
       ピッチャーロボットはA地点をスタートしM地点まで移動する
       バッターロボットはC地点をスタートしB地点まで移動する
       スタート時はそれぞれA地点B地点の枠内に収まること(高さの制限はなし)
       M地点、B地点では接地している部分が枠内に入っていること
       ピッチャーロボットはスタート時にピンポン球を5個まで保持できる
       ピッチャーロボットが投げたピンポン球をバッターロボットは3秒以上保持してはならない
       移動の途中で目標に接触してはならない
基本得点の計算方法
       目標は5個あり、それぞれに書かれている点数を合計する。ただし同じ目標に2個以上のピンポン玉が入った場合は2個目以降の得点は1個目の半分とする。
       打つことができたにもかかわらずどの目標にも入らなかった場合には1点とする
技術点の計算方法
   以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチームが20点満点で採点し、その平均点を求める。 得点の目安:
       スタートしてから目的地点まで移動する速さ、正確さ (3点)
       ピンポン玉を投げる動作 (3点)
       ピンポン玉を打つ動作 (3点)
       2台のロボットの連携の良さ (3点)
       自立型のロボットとしての形や動作の美しさ、斬新さ (3点)
       ロボコン出場ロボットとしての完成度 (3点)
       その他 (2点)

ロボットの説明

全体像

今回の課題では移動だけではなくボールを打ち出すことも求められているため、モーターを左右のタイヤとボールを打ち出す部分の3つに使用した。ピッチャーが向きを合わせるためにライトセンサーを使用するため向く向きの確実性を上げるためにこちらにもライトセンサーを取り付けた。

機体画像2.jpg

移動部分

左右のタイヤそれぞれにモーターを使用している。移動をする際の動きを制御するために、ライトセンサーを前方に2つ取り付けた。

機体画像4.jpg

ボールを打ち出す部分

この課題ではボールを打つ必要があった。僕は棒状のものを振ってボールを打つのはタイミングの調整の難易度を考えると難しいのでボールを一回受け止めてから打ち出すようにした。そして多少ボールがそれても何とかなるように先端の部分にパーツを取り付けた。

機体画像3.jpg

プログラミングの説明

定義の解説

#define KURO 44//ライトセンサーの値が44
#define SHIRO 50//ライトセンサーの値が50
#define go_forward(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//まっすぐ進む
#define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//まっすぐ下がる
#define senkai_left(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_AC);//左旋回
#define senkai_right(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_AC);//右旋回
#define turn_left(t) OnFwd(OUT_C);Off(OUT_A);Wait(t);Off(OUT_AC);//左へ曲がる
#define turn_right(t) OnFwd(OUT_A);Off(OUT_C);Wait(t);Off(OUT_AC);//右へ曲がる
#define SIGNALPITCHER 111//111のメッセージ
#define SIGNALBATTER 222//222のメッセージ

サブルーチンの解説

ライントレースを行うためのプログラム(T字路を感知すると停止する)

sub line()
{
   int n=0;
   while(n==0){
       if((SENSOR_1>SHIRO)&&(SENSOR_3>SHIRO)){//センサー1と3の値が両方とも50より大きい
           OnFwd(OUT_AC);//直進
       }if((SENSOR_1>SHIRO)&&(SENSOR_3<KURO)){//センサー1の値が50より大きくて、センサー3の値が44より小さい
           OnFwd(OUT_A);//左に旋回
           OnRev(OUT_C);//左に旋回
       }if((SENSOR_1<KURO)&&(SENSOR_3>SHIRO)){//センサー1の値が44より小さくて、センサー3の値が50より大きい
           OnFwd(OUT_C);//右に旋回
           OnRev(OUT_A);//右に旋回
       }if((SENSOR_1<KURO)&&(SENSOR_3<KURO)){//センサー1と3の値が両方共44よりも小さい
            Off(OUT_AC);//停止
            Wait(50);//待機
            n++;//関数に足す1
        }
   }
}

ライトセンサーを使って機体を黒線に対して垂直にするプログラム

sub suichoku()
{
   int m=0;
   while(m==0){
       OnFwd(OUT_AC);//直進
       if((SENSOR_1<47)&&(SENSOR_3<42)){//センサー1の値が47より小さくて、せんさー3の値が42より小さい
           Off(OUT_AC);//停止
           Wait(50);//待機
           m++;//関数に足す1
        }
       if(SENSOR_1<45){//センサー1の値が45よりも小さい
           Off(OUT_AC);//停止
           Wait(30);//待機
           turn_left(8);//左へ曲がる
           back(10);//後退
           Wait(50);//待機
        }
       if(SENSOR_3<40){//センサー3の値が40よりも小さい
           Off(OUT_AC);//停止
           Wait(30);//待機
           turn_right(10);//右へ曲がる
           back(10);//後退
           Wait(50);//待機
        }
    }
}

右側にある6点のゴールを狙うプログラム

sub shoot6r()
{
    senkai_right(018);//右に旋回
    go_forward(020);//直進
    OnRev(OUT_B);//ボールを打ち出す
    Wait(15);//待機
    Off(OUT_B);//停止
    OnFwd(OUT_B);//ボールを打ち出す部分を元に戻す
    Wait(15);//待機
    Off(OUT_B);//停止
    back(025);//後退
    senkai_left(023);//左に旋回
    Wait(50);//待機
}

左側にある6点のゴールを狙うプログラム

sub shoot6l()
{
    senkai_left(018);//左に旋回
    go_forward(030);//直進
    OnRev(OUT_B);//ボールを打ち出す
    Wait(15);//待機
    Off(OUT_B);//停止
    OnFwd(OUT_B);//ボールを打ち出す部分を元に戻す
    Wait(15);//待機
    Off(OUT_B);//停止
    back(045);//後退
    senkai_right(026);//右に旋回
    Wait(50);//待機
    
}

右側にある4点のゴールを狙うプログラム

sub shoot4r()
{
    senkai_right(035);//右に旋回
    go_forward(020);//直進
    OnRev(OUT_B);//ボールを打ち出す
    Wait(15);//待機
    Off(OUT_B);//停止
    OnFwd(OUT_B);//ボールを打ち出す部分を元に戻す
    Wait(15);//待機
    Off(OUT_B);//停止
    back(025);//後退
    senkai_left(035);//左に旋回
    Wait(50);//待機
}

10点のゴールを狙うプログラム

sub shoot10()
{
    senkai_left(006);//左に旋回
    go_forward(050);//直進
    OnRev(OUT_B);//ボールを打ち出す
    Wait(15);//待機
    Off(OUT_B);//停止
    OnFwd(OUT_B);//ボールを打ち出す部分を元に戻す
    Wait(15);//待機
    Off(OUT_B);//停止
    back(055);//後退
    senkai_right(008);//右に旋回
    Wait(50);//待機
}

タスクメインの解説

task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);
   senkai_left(35);//左に旋回
   Wait(30);//待機
   go_forward(200);//直進
   Wait(30);//待機
   senkai_left(34);//左に旋回
   Wait(30);//待機
   go_forward(210);//直進
   Wait(30);//待機
   line();//ライントレイス
   go_forward(50);//直進
   senkai_left(85);//左に旋回
   back(80);//後退
   suichoku();//機体を黒線に対して垂直にする
   go_forward(99);//直進
   senkai_left(105);//左に旋回
   go_forward(125);//直進
   ClearMessage(); //メッセージを0にする
   Off(OUT_AC);//停止
   until(Message() == SIGNALPITCHER);//メッセージが111になるまで
   SendMessage(SIGNALBATTER);//222を送る
   PlaySound(SOUND_CLICK);//音を鳴らす
   back(165);//後退
   Wait(200);//待機
   shoot4r();//右の4を狙う
   Wait(100);//待機
   shoot6l();//左の6を狙う
   Wait(185);//待機
   shoot6r();//右の6を狙う
   Wait(130);//待機
   shoot6l();//左の6を狙う
   Wait(160);//待機
   shoot10();//10を狙う
   
}

結果・感想

ロボコン当日、結果的には僕たちの班は一位だったけれども、すべての動作が完璧だったわけではなかったのが残念だった、練習の段階でもっとうまくいっていただけに余計に残念だった。

まとめ

今回の課題は2台の機体を通信する必要があったために、ただ自分の機体のことだけを考えて作ると通信ができなくなるということがあった。通信に使われているのが赤外線だったために余計なパーツがあるとすぐに通信できなくなってしまった。その点が今回の課題で最も難しい点だったと思った僕らの班は全員が同じ学科のメンバーだったために班のメンバーで集まりやすかったので皆で協力してできて達成感を味わうことができた。2016b/Member


添付ファイル: file機体画像3.jpg 147件 [詳細] file機体画像1.jpg 106件 [詳細] file課題3.jpg 175件 [詳細] file機体画像4.jpg 72件 [詳細] file機体画像2.jpg 165件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-02-12 (日) 22:47:46