目次 #contents * 課題の説明[#r33b7dc4] 課題2で作成したフィールドを使い、バッターとピッチャーの機体をそれぞれ作成して通信などを行いながら、ピッチャーはボールを投げ、バッターはそのボールを打ってゴールに入れる。 そして獲得した点数とロボットの完成度などを参考にして機体を評価する。 **課題のルール [#h6c51c20] 基本ルール ピッチャーロボットとバッターロボットが所定の位置まで移動してピンポン球を投げて打つ ピッチャーロボットはA地点をスタートしM地点まで移動する バッターロボットはC地点をスタートしB地点まで移動する スタート時はそれぞれA地点B地点の枠内に収まること(高さの制限はなし) M地点、B地点では接地している部分が枠内に入っていること ピッチャーロボットはスタート時にピンポン球を5個まで保持できる ピッチャーロボットが投げたピンポン球をバッターロボットは3秒以上保持してはならない 移動の途中で目標に接触してはならない 基本得点の計算方法 目標は5個あり、それぞれに書かれている点数を合計する。ただし同じ目標に2個以上のピンポン玉が入った場合は2個目以降の得点は1個目の半分とする。 打つことができたにもかかわらずどの目標にも入らなかった場合には1点とする 技術点の計算方法 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチームが20点満点で採点し、その平均点を求める。 得点の目安: スタートしてから目的地点まで移動する速さ、正確さ (3点) ピンポン玉を投げる動作 (3点) ピンポン玉を打つ動作 (3点) 2台のロボットの連携の良さ (3点) 自立型のロボットとしての形や動作の美しさ、斬新さ (3点) ロボコン出場ロボットとしての完成度 (3点) その他 (2点) *ロボットの説明 [#s38745de] **全体像 [#o43ecb60] **移動部分 [#t94bf97b] **ボールを打ち出す部分 [#me9c4377] *プログラミングの説明 [#h1f17bf8] **定義の解説 [#j0e0c35c] #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のメッセージ **サブルーチンの解説 [#x54d7e17] ライントレースを行うためのプログラム(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);//待機 } **タスクメインの解説 [#r5fb7345] 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を狙う } * 結果・感想[#vc55c6f9] * まとめ[#bfc72408] [[2016b/Member]]