今回の課題内容はピッチャー役のロボットとバッター役のロボットの二台を用いて課題2において用いられたライントレースのシート上で野球をするというものであった
細かいルールは、
・ピッチャーロボットはピンポン球を5球保持したままA地点からM地点まで移動し、ピンポン球を1球ずつ配球する
・バッターロボットはC地点からB地点まで移動し、ピッチャーロボットから射出されたピンポン球を3秒間保持してしまうことなく打ち返さまければならない
・ピッチャーロボットおよびバッターロボットはそれぞれ、A地点C地点において枠内に収まってなければならず、M地点B地点の枠内に設置部分が収まっていなければならない ただし上方向に制限はない また、移動時には目標物に当たってはならない
・得点は打つだけで目標物に入らなかった場合は1点、目標物に入った場合はその場所に応じた得点を獲得できる ただし同じ場所に二度以上入った場合は二球目以降の点数は半分のみとする また、技術点としてほかの班の人たちにより20点満点での採点を行い、その平均値が加算される
といったものであった
今回上記のルールの中でロボットを製作するにあたって以下のことを考えた
・前回のライントレースの機構を使った駆動部を利用し、ライントレースを使ってそれぞれを所定の一に移動させた それにあたり、前回課題となった重心が後ろに来てしまいタイヤの地下路がうまく伝わらないという不具合をなくすため重いNXT本体をタイヤの上に持ってきた
・ピッチャーロボットのピンポン球の排出部分、バッターロボットのバットの機構部分を本体の進行方向に対して後ろを正面に持ってきた これは上記のNXT本体が前にあるからというのもあるが、プログラムの難易度をUターンの回数を減らし位置の調整をしやすくするという目的や、バッター側を下記のようにするためというものでもあった
・バッターロボットのバットの部分を野球盤のように振らせるようにした これは見た目を重視したほかに、バットも部分を長く取ることができ、振る速度をよういに持たせ強く打て、タイミングが合わせやすく、ピッチャー側のロボットと同期するタイミングをずらすだけでそれぞれ異なる的を狙うプログラムを容易にすル目的もあった まさにそれがうまくはまり短期間でのプログラミングの調整を可能にし、他のどこの班もなしえなかった打率10割という結果をもたらすこととなった
・ピッチャー側のピンポン球をためておく部分を斜めに組み立てた これは垂直にボールを入れるとかなりの精度の高さでサイズが設定されていないと詰まってしまったり、うまく転がり出にくかったりすることを避けるために行った 結果として投球におけるミスは全くなく、しっかりと完成形としてロボコンではその威力を発揮できた
2.ピッチャーロボット 全体像はこのようなものとなった
上述したように、進行方向に対して後ろに排出口がつけてあり、見て取れるようにタンクに当たる部分に傾斜がつけてある サイズの整合性を取る必要性が少なかったのでピンポン球の個数にあわせて感単に拡張することができた
排出の仕組みとしては、タンク上部のモータが下図の手裏剣型の仕切り弁を回転させ、一球一球くぎりながら投球させた
3.バッターロボット 全体像はこのようになった
特筆すべき点としては上記のことの他に、こちら側がマスターとしてプログラミングされており、再接続をしやすくするため本体の向きが基本のこの向きと上向きが簡単に変えられるようになっていた
バットの部分は紙やピンポン球、地面影響に対応すべく、なるべく長くするため、モータの下のスペースに格納した
今回は下図の赤線をピッチャーロボット、青線をバッターロボットの通り道とした
見てわかるとおりピッチャーロボットは黒い線を四回、バッターロボットは黒い線を二回、そこで角度を変え、再び黒線を四回踏むと目的地にたどりつくことがわかる こういうルートを取ったのは、きっちりとしたライントレースよりも制御がしやすくプログラミング自体もとても簡単にできると言うことでこの動きを採用した 副産物的にバッターロボットに方向転換がいらず、そのことも難度を下げた また、時間などで移動すル位置を決めるのとは違いマシンを置く位置のずれや地面環境によるひっかかりなどの影響を受けにくく安定性を高めることができた
それぞれのポジションにたどり着く順番がバッターロボットの方が後だったので、バッターロボット側から指示を出させることにした その際、ボールを投げるのは常に一定のペーストし、バットを振るタイミングを少し早めの基準値から遅らせていくことで広角打法を身につけた
1.ピッチャーサイドのプログラム
#define TR OnFwd(OUT_C,45);//左に曲がる #define TL OnFwd(OUT_B,45);//右に曲がる #define GF OnFwdSync(OUT_BC,45,0);直進 #define MS Wait(400);オフの命令の後など少しの間を持たせて安定した動きをさせるためのマクロ ミニマムストップの頭文字から取っている #define SIGNALON 11 #define SIGNALOFF 12//通信のために用いたマクロ task main() { SetSensorLight(S1); int n=0; MS //動作時に閾値より遙かに高い値の場所で閾値以下の行動が行われるバグがありそれを軽減させるためのもの while(n<4){ if(SENSOR_1>37){ GF } else{ GF MS Off(OUT_BC); MS n++; } }//四回の黒線との交差を検出するためのもの 判定してから線の幅の分進ませている Off(OUT_BC); GF MS Off(OUT_BC); MS TR Wait(3500); Off(OUT_BC);//マウンドに立ち、後部の投げる機構をバッターボックスに向ける調整 int msg; while (true) { ReceiveRemoteNumber(MAILBOX1,true,msg); if (msg == SIGNALON) { RotateMotor(OUT_A,-20, 95); } if (msg == SIGNALOFF) { Off(OUT_A); } }バッター側からの通信を受け取り、球を投げるための動作 90度ごとに区切られている弁に対し95度という少し大きな値を取らせることで非常に安定した投球を可能にした }
2.バッターサイドのプログラム
#define SR OnFwdSync(OUT_BC,45,-100);//左旋回 #define SL OnFwdSync(OUT_BC,45,100);//右旋回 #define GF OnFwdSync(OUT_BC,60,0);//前進 #define MS Wait(400);//ピッチャーサイド同様の調整用 タイミングの関係で少し短めになっている #define CONN 1 #define SIGNALON 11 #define SIGNALOFF 12//通信用のもの task main() { SetSensorLight(S1); int n=0; int m=1200;//nは回数を数えるものでmはバットを振る基本の時間 while(n<2){ if(SENSOR_1>40){ GF } else{ GF MS Off(OUT_BC); MS n++; } }//二回の黒線との交差の検出 Off(OUT_BC); MS SR Wait(1300); Off(OUT_BC);//バッターボックス側に本体を向ける while(n<6){ if(SENSOR_1>40){ GF } else{ GF MS Off(OUT_BC); MS n++; } }//後半四回の黒線との交差の検出 Off(OUT_BC); MS GF Wait(600); Off(OUT_BC); MS SL Wait(700); Off(OUT_BC); MS GF Wait(1100); Off(OUT_BC);//ルール通りバッターボックス内に本体を納めるための調整 Wait(2000); while (m<1450){ SendRemoteNumber(CONN,MAILBOX1,SIGNALON); Wait(m); RotateMotor(OUT_A,75,180); Wait(500); RotateMotor(OUT_A,-20,180); Wait(500); n++; m=m+50; } Off(OUT_A); }//ピッチャー側への通信と打つ動き 少しずつ遅らせて振っている
ちなみに、バッター側のファイル名はyamadaピッチャー側はotaniにした otaniは全打席打たれてしまうという結果になったが持ち前のコントロールを発揮し、yamadaは見事に打点と打率において二冠王にかがやいた
こんかいは3つのことに頭を抱えさせられた
一つ目としては一人との連絡が途絶えてしまったことだ 対応が遅れてしまったことは反省したいが、臨機応変に完成していたピッチャーマシンの構造やプログラムを応用させ、他の班とは比べものにならない完成度で仕上げられた自分を今はたたえたいと思う
二つ目はピンポン球の転がりの不安定さである ピンポン球自体が百均で買ったものであり彰化のひずみがあった上、地面の影響も非常に大きく、緩急のある非常にいいピッチングが炸裂しまくって調整の際何が原因なのかをうまく見極める必要があった 他の班でもそれに苦しめられているところもあり、ロボコンが企画される時点に立ち返った対策の必要性を感じた
三つ目はピッチャーマシンのプログラミングのところでも述べたバグについてである バグが怒るスタート地点を含めた周り一体の光センサの値を取ってみたが、閾値である37を黒線以外のところでは下回るなんてことは全くなく、なぜそこで反応してしまうのか不思議であった 結局原因はわからず応急的な措置で乗り切ることとなってしまった
しかし、それらのことを踏まえても、他のチームとは比べものにならないルールに忠実でしっかりとした安定性確実性完成度で仕上げられたのは非常に大きな達成感を得られたし、その過程でのトライアンドエラーの際にはこの授業を等して学んだことをフルに動員して思いつく最善を尽くしていけたことは非常に大きな達成感を得ることができた それはこの授業で学んだことが学んだだけで終わらず、身についてきた証でもあると思うので忘れずに今後に生かしていきたい