- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#Contents
*課題3の内容 [#g40fe707]
#ref(2016b/Member/god22ila/Mission3/2016b-mission3.png,50%,コース)
今回の課題は基本ルールに従ってピッチャーロボとバッターロボが通信をして野球をするというものである。
**基本ルール [#z54d30fa]
-ピッチャーロボとバッターロボが決められた場所についてピンポン玉を投げて打つ
-ピッチャーロボはA地点からM地点まで移動
-バッターロボはC地点からB地点まで移動
-高さの制限はないがスタートの時点で機体が枠内に収まること
-M,B地点では接地部分が枠内に収まっていること
-ピッチャーロボはスタート時にピンポン玉を5個まで持てる
-バッターロボはピンポン玉を3秒以上持っていてはいけない
-移動の途中でゴールにぶつかってはいけない
**得点の計算方法 [#m8cee12c]
-5つあるゴールに書かれている数字を合計するが、同じゴールに2個以上のピンポン玉がはいったら2個目以降の得点は1個目の半分になる
-打つことはできたがどのゴールにも入らなかった場合は1点になる
**技術点の説明 [#ca104426]
以下の評価ポイントを含めた技術的な工夫や芸術性について他のチームが20点満点で評価し、その平均点を求める
**評価ポイント [#c216650b]
-スタートから所定の位置まで移動するスピードと正確さ(3点)
-ピンポン玉を投げる動作について(3点)
-ピンポン玉を打つ動作について(3点)
-2台のロボットの連携の良さについて(3点)
-自立型ロボットとしての形や動作の美しさ、斬新さについて(3点)
-ロボコン出場ロボットとしての完成度(3点)
-その他(2点)
*本体の説明(バッターロボ) [#qfbc9a2d]
#ref(2016b/Member/god22ila/Mission3/IMG_kitai1.JPG,50%,機体裏)
本体は今回もライントレーサーを使うこともあり、課題2で使っていたものをそのまま利用した。
*アームの説明(バッターロボ) [#r24463bf]
#ref(2016b/Member/god22ila/Mission3/IMG_kitai3.JPG,50%,機体裏)
斜め上から
#ref(2016b/Member/god22ila/Mission3/IMG_kitai4.JPG,50%,アーム上)
アームは直接モータにブロックを付けた構造になっているので動きとしては、逆水平チョップを打つような感じになっている。
*本体の説明(ピッチャーロボ) [#fe6d1ad0]
#ref(2016b/Member/god22ila/Mission3/IMG_kitai2.JPG,50%,機体裏)
バッターロボと同じくライントレーサーを使うので、前回の僕たちの班のロボットの本体と同じ構造になっている。
*アームの説明(ピッチャーロボ) [#mac7a008]
#ref(2016b/Member/god22ila/Mission3/IMG_armkeisya.jpg,50%,横)
ピンポン玉の収納部の下が傾斜しているのでピンポン玉がそこに落ちると転がってバッターのもとへいくようになっている。
#ref(2016b/Member/god22ila/Mission3/IMG_syuriken.jpg,50%,手裏剣)
ピンポン玉がどんどん落ちてこないように手裏剣型のストッパーを用意した。このストッパーは回転するとすぐ下のピンポン玉を押し出し、次のピンポン玉を発射する準備をしその次のピンポン玉を落ちてこないようにする役目を担っている。
*2台を通信するプログラムについて [#cbea9911]
バッターロボをマスター、ピッチャーロボをスレーブとし2台で通信する
バッターロボをマスター、ピッチャーロボをスレーブとし2台で通信する。マスターがスレーブにメッセージを送ると、それを受け取ったスレーブが決まった動作を実行する。バッターロボのほうが直進では早いのでM地点でぶつかることはない。
*バッターロボのプログラム [#kfe49bfb]
#define turnright OnFwd(OUT_C,45);
#define turnleft OnFwd(OUT_B,45);
#define SR OnFwdSync(OUT_BC,45,-100);
#define SL OnFwdSync(OUT_BC,45,100);
#define GF OnFwdSync(OUT_BC,60,0);
#define XrdTR TR Wait(500);SL Wait(1400);Off(OUT_BC);Wait(300);GF Wait(500);Off(OUT_BC);
#define XrdTL TL Wait(500);SR Wait(1400);Off(OUT_BC);Wait(300);GF Wait(500);Off(OUT_BC);
#define XrdST TR Wait(1000);
#define MS Wait(400);
#define CONN 1
#define SIGNALON 11
#define SIGNALOFF 12
#define senkairight OnFwdSync(OUT_BC,45,-100);
#define senkaileft OnFwdSync(OUT_BC,45,100);
#define goforward OnFwdSync(OUT_BC,60,0);
#define zokkou Wait(400);
#define CONN 1 //スレーブの接続番号
#define SIGNALON 11 //モータを動かすメッセージ
#define SIGNALOFF 12 //モータを止めるメッセージ
**光センサーを起動 [#xbad0f68]
task main()
{
SetSensorLight(S1);
int n=0;
int m=1200;
while(n<2){
if(SENSOR_1>40){
GF
int n=0; //nの値を決める
int m=1200; //mの値を決める
**ライントレースで目標の場所まで移動 [#x92b7f6c]
バッターロボはC地点からB地点までM地点を介して移動する。C〜Bまでで計5回黒い部分を通過するので、C〜Mまでの2回、M〜Bまでの3回でプログラムを分ける。
-C〜Mまで
while(n<2){ //nの値が2より小さいとき
if(SENSOR_1>40){ //白と認識したとき
goforward //直進
}
else{
GF
MS
else{ //違ったら
goforward //白と認識するまで直進する
zokkou
Off(OUT_BC);
MS
n++;
zokkou
n++; //nの値を増やす
}
}
Off(OUT_BC);
MS
SR
-M〜Bまで
Off(OUT_BC);//Bのほうへ機体を向ける
zokkou
senkairight
Wait(1300);
Off(OUT_BC);
nの値が2〜5までの時
while(n<6){
if(SENSOR_1>40){
GF
if(SENSOR_1>40){ //白と認識されているとき
goforward //前進
}
else{
GF
MS
else{ //違ったら
goforward //白と認識されるまで前進して
zokkou
Off(OUT_BC);
MS
n++;
zokkou
n++; //nの値を1増やす
}
}
Off(OUT_BC);
MS
GF
微調整をしてBの枠の中に入り、ボールを打てる向きに機体の向きを調節する
Off(OUT_BC); //機体の向きを調節するためのプログラム
zokkou
goforward
Wait(600);
Off(OUT_BC);
MS
SL
zokkou
senkaileft
Wait(700);
Off(OUT_BC);
MS
GF
zokkou
goforward
Wait(1100);
Off(OUT_BC);
Wait(2000);
while (m<1450){
SendRemoteNumber(CONN,MAILBOX1,SIGNALON);
Wait(m);
**通信のプログラム [#f55eba9c]
while (m<1450){ //mの値が1450よりも小さいとき
SendRemoteNumber(CONN,MAILBOX1,SIGNALON); //スレーブにSIGNALONを送信する
-バットで打つプログラム
Wait(m); //mの値でピンポン玉を打つタイミングを調節する
RotateMotor(OUT_A,75,180);
Wait(500);
RotateMotor(OUT_A,-20,180);
Wait(500);
n++;
m=m+50;
}
m=m+50; //mの値を増やす
}
SendRemoteNumber(CONN,MAILBOX1,SIGNALOFF); //スレーブにSIGNALOFFを送信する
Off(OUT_A);
}
スレーブにSIGNALONが送信されるとピンポン玉が発射される。ピンポン玉を打つタイミングは時間によって操作されているので1回打つ毎に打つタイミングがが変化し、すべての場所を狙えるようになっている
*ピッチャーロボのプログラム [#cd84a823]
#define turnright OnFwd(OUT_C,45);
#define turnleft OnFwd(OUT_B,45);
#define seikairight OnFwdSync(OUT_BC,45,-100);
#define senkaileft OnFwdSync(OUT_BC,45,100);
#define goforward OnFwdSync(OUT_BC,45,0);
#define zokkou Wait(400);
#define SIGNALON 11
#define SIGNALOFF 12
**光センサーとタイマーを起動 [#k20e6350]
#define SIGNALON 11 //モータを動かすメッセージ
#define SIGNALOFF 12 //モータを止めるメッセージ
**光センサーを起動 [#k20e6350]
task main()
{
SetSensorLight(S1);//光センサー起動
int n=0;//nの値を決める
teisi
**ラインとレースで目標の場所まで移動 [#u93b11a5]
**ライントレースで目標の場所まで移動 [#u93b11a5]
ロボットは枠の中からスタートしMに向かって直進し、Mの枠内で向きを変えてバッターロボットのほうに発射口を向けるという移動の仕方をする。ロボットは黒い線の上を4回通り、もし白と認識したら直進し、黒と認識したら白と認識されるまで直進しnの値を増やし直進するという動きをする。これをnが4になるまで行う
while(n<4){ //スタート地点からM地点まで行くプログラム
if(SENSOR_1>37){
goforward
if(SENSOR_1>37){ //白と認識したとき
goforward //前進
}
else{
goforward
else{ //違ったら
goforward //白と認識されるまで前進し
zokkou
Off(OUT_BC);
zokkou
n++;
n++; //nの値を増やす
}
}
nの値が4以上になったら方向転換してバッターロボのほうに発射口を向ける。
Off(OUT_BC);//方向を変えるプログラム
goforward
zokkou
Off(OUT_BC);
zokkou
turnright
Wait(3500);
Off(OUT_BC);
**通信のプログラム [#m12ccad8]
MAILBOXに値を受け取ることにより動作を実行する。受け取った数値により動作が変わる。
int msg; //受け取った値を入れておく変数
while (true) {
ReceiveRemoteNumber(MAILBOX1,true,msg);//MAILBOX1の値を受けとってmsgに入れる。trueを指定するとMAILBOXが空になる
if (msg == SIGNALON) { //SIGNALONを受け取った場合
RotateMotor(OUT_A,-20, 95);//ピンポン玉を発射するプログラムが起動
}
if (msg == SIGNALOFF) { //SIGNALOFFを受け取った場合
Off(OUT_A); //停止
}
}
}
*感想 [#k0a1c7eb]
今回の課題は2台のロボットを用いて野球をするというもので、2台のロボットの動きのタイミングとピンポン玉の転がり方を考慮してプログラムするのが難しかった。ロボットの移動のプログラムは前回のプログラムを用いたのでそこまで難しくなかった。だが、ピッチャー側でよくセンサーの誤認識があったのでセンサーの値や黒色の部分をマジックで塗ったりして問題をクリアするのを頑張った。プログラムを調節したおかげでロボコン本番ではすべての打席でヒットを打つことができたので良かった。ピッチャーロボを作るときにどうすればボールを投げれるのかがなかなか思いつかなかったので苦労した。この授業では何回も様子を見てプログラムや機体を調整することの大切さを学ぶことができた。あと、ほかの人と絶対に連絡できる手段を一つは持っておいたほうがいいということも学んだ。