目次 #contents * 課題 [#g66f3a51] 課題2で使用したフィールドを用いて、ピッチャーロボットとバッターロボットが通信などをしながら野球をするロボットを制作する。 #ref(kadai3.png) ** 基本ルール [#uc0f2a33] ピッチャーロボットとバッターロボットが所定の位置まで移動してピンポン球を投げて打つ ピッチャーロボットはA地点をスタートしM地点まで移動する バッターロボットはC地点をスタートしB地点まで移動する スタート時はそれぞれA地点B地点の枠内に収まること(高さの制限はなし) M地点、B地点では接地している部分が枠内に入っていること ピッチャーロボットはスタート時にピンポン球を5個まで保持できる ピッチャーロボットが投げたピンポン球をバッターロボットは3秒以上保持してはならない 移動の途中で目標に接触してはならない ** 基本得点の計算方法 [#a3dc5231] 目標は5個あり、それぞれに書かれている点数を合計する。ただし同じ目標に2個以上のピンポン玉が入った場合は2個目以降の得点は1個目の半分とする。 打つことができたにもかかわらずどの目標にも入らなかった場合には1点とする ** 技術点の計算方法 [#q8e1f6b4] 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチームが20点満点で採点し、その平均点を求める。 得点の目安: スタートしてから目的地点まで移動する速さ、正確さ (3点) ピンポン玉を投げる動作 (3点) ピンポン玉を打つ動作 (3点) 2台のロボットの連携の良さ (3点) 自立型のロボットとしての形や動作の美しさ、斬新さ (3点) ロボコン出場ロボットとしての完成度 (3点) その他 (2点) * バッターロボットの説明 [#n111705a] 私たちは、バッターロボットを制作した。 #ref(バッターロボット.png) ** ボールを打ち返す部分の説明 [#zb63ab41] 確実にピンポン玉を打ち返すために、一般的な野球のように棒状のバットを振るのではなく、大きな板でピンポン玉を打ち返すようにした。また、正確にゴールを狙えるように、板の前に枠を取り付け、一度ピンポン玉を保持してロボット本体をゴールに向けさせてから、ピンポン玉を打てるようにした。しかし、枠の角でピンポン玉をはじいてしまうことが多かったので、枠の先端にハの字のパーツを取り付け、ピンポン玉を枠の中に誘導した(画像:バッターロボット参照)。 #ref(ピンポン玉を打ち返すパーツ.png) ** 移動部分の説明 [#ge41b186] 2つのタイヤを別々のモーターで動かす。また、移動中にライントレースや、黒線に対してロボットの向きを垂直にする動きがあるため、ライトセンサーを2つ取り付けた。さらに、前を後ろのバランスが取りづらかったので、枠の部分にツメを取り付けた。しかし、このツメがフィールドとなる紙に引っかかり、ロボットがうまく動作しない部分が多かったため、競技中ではあったが黄色のパーツと取り換えた。 #ref(タイヤと2つのライトセンサ.png) #ref(黄色いツメ.png) ** 通信部分の説明 [#d7bd46d5] ピッチャーロボットがライトセンサーを用いて、バッターロボットを探すようになっているため、バッターロボットには光源としてライトセンサーをロボットの前方に取り付けた。(画像:ピンポン玉を打ち返すパーツ参照) * ピッチャーロボットの説明 [#f3d127b5] #ref(ピッチャーロボット.png) 詳しくはこちらのページを参照してください。 http://yakushi.shinshu-u.ac.jp/robotics/?2016b%2FMember%2Fzaurusu%2FMission3 http://yakushi.shinshu-u.ac.jp/robotics/?2016b%2FMember%2Fguchikou%2FMission3 * プログラムの説明 [#o13f7641] ** 定義の説明 [#u5ebaca2] #define KURO 44 //ライントレース黒のしきい値 #define SHIRO 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 //ピッチャロボットがバッターロボットに送るメッセージ #define SIGNALBATTER 222 //バッターロボットがピッチャーロボットに送るメッセージ ** サブルーチンの説明 [#kf24ae18] sub line() //ライントレースのプログラム { int n=0; while(n==0){ if((SENSOR_1>SHIRO)&&(SENSOR_3>SHIRO)){ OnFwd(OUT_AC); //左右のライトセンサが両方とも白を感知したら前進 }if((SENSOR_1>SHIRO)&&(SENSOR_3<KURO)){ OnFwd(OUT_A); OnRev(OUT_C); //右のライトセンサが黒、左のライトセンサが白を感知したら右旋回 }if((SENSOR_1<KURO)&&(SENSOR_3>SHIRO)){ OnFwd(OUT_C); OnRev(OUT_A); //右のライトセンサが白、左のライトセンサが黒を感知したら左旋回 }if((SENSOR_1<KURO)&&(SENSOR_3<KURO)){ Off(OUT_AC); Wait(50); //左右のライトセンサが両方とも黒を感知したら停止 n++; //ライントレースの終了 } } } sub suichoku() //黒いラインに対してロボットを垂直に向かせるプログラム { int m=0; while(m==0){ OnFwd(OUT_AC); if((SENSOR_1<47)&&(SENSOR_3<42)){ Off(OUT_AC); Wait(50); m++; //左右のライトセンサが黒を感知したら停止、垂直プログラムの終了 } if(SENSOR_1<45){ Off(OUT_AC); Wait(30); turn_left(8); back(10); Wait(50); //左のライトセンサが黒を感知したら少しだけ左折して後退 } if(SENSOR_3<40){ Off(OUT_AC); Wait(30); turn_right(10); back(10); Wait(50); //右のライトセンサが黒を感知したら少しだけ右折して後退 } } } 正確に垂直を向かせたいが、左右のライトセンサで示す値にずれがあったため、あえて定義のしきい値は使わずに新しいしきい値を設定した。 sub shoot6r() //バッターロボットから見て右側の6点のゴールを狙うプログラム { senkai_right(017); //ゴールの方を向く go_forward(020); //転がるピンポン玉を追いかける OnRev(OUT_B); Wait(15); //ピンポン玉を打つ Off(OUT_B); OnFwd(OUT_B); Wait(15); Off(OUT_B); //板を元に戻す back(025); senkai_left(020); //バッターロボットをピッチャーロボットに向きなおさせる Wait(50); } sub shoot6l() //バッターロボットから見て左側の6点のゴールを狙うプログラム { 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); //バッターロボットをピッチャーロボットに向きなおさせる } sub shoot4r() //バッターロボットから見て右側の4点のゴールを狙うプログラム { senkai_right(036); //ゴールのほうを向く go_forward(020); //転がるピンポン玉を追いかける OnRev(OUT_B); Wait(15); //ピンポン玉を打つ Off(OUT_B); OnFwd(OUT_B); Wait(15); Off(OUT_B); //板を元に戻す back(025); senkai_left(034); Wait(50); //バッターロボットをピッチャーロボットに向きなおさせる } sub shoot10() //10点のゴールを狙うプログラム { 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(007); Wait(50); //バッターロボットをピッチャーロボットに向きなおさせる } ** メインプログラムの説明 [#n1836fb6] 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); //画像:kadai3-移動の、赤丸の位置まで移動 #ref(kadai3-移動.png) line(); //黒線感知のためのライントレース go_forward(50); senkai_left(85); back(80); suichoku(); //画像:kadai3-黒線の、赤く塗られた部分の黒線に対してロボットを垂直に向かせる #ref(kadai3-黒線.png) go_forward(99); senkai_left(105); //ピッチャーロボットのほうを向く go_forward(125); //通信のために前進 ClearMessage(); Off(OUT_AC); until(Message() == SIGNALPITCHER); SendMessage(SIGNALBATTER); PlaySound(SOUND_CLICK); //ピッチャーロボットからSIGNALPICHERを受け取ったら、SIGNALBATTERを送り返す back(165); //バッターボックスに戻る Wait(200); shoot4r(); //右側の4点ゴールを狙う Wait(100); shoot6l(); //左側の6点ゴールを狙う Wait(185); shoot6r(); //右側の6点ゴールを狙う Wait(130); shoot6l(); //左側の6点ゴールを狙う Wait(160); shoot10(); //10点ゴールを狙う } * 結果 [#u6140431] 競技の1周目の基本点は、一投目4点、二投目1点、三投目6点、四投目と五投目は空振りで、合計11点と高得点だった。技術点の平均は13.5点であり、これも高得点で、合計24.5点で一位になることができた。しかし2周目では、ロボット同士がうまく向き合うことができず、基本点はすべて空振りで0点だった。そのせいか技術点の平均は7.3点であり、1周目よりも低い点数となってしまった。 * 感想 [#y7b118e4] 私たちのグループは確かに一位になることができたが、準備段階のほうがロボットがうまく動いていたということもあり、悔しい思いをした。また、他のグループが2周目で1周目の記録を更新していく中、私たちはより低い点数になってしまったことも、悔しいことの1つである。しかし、仲間と意見を出し合い、1つの作品を作り上げることの楽しさを学ぶことができた。 今回の競技会で私は司会進行を務めた。慣れない進行だったが、もう1人の司会の協力もあり、無事に協議を終えることができた。 今回の競技会で私は司会進行を務めた。慣れない進行だったが、もう1人の司会の協力もあり、無事に競技を終えることができた。