ロボットで野球を行う。ピッチャーロボットが投げたピンポン玉をバッターロボットが打ち、ゴールに入ったピンポン玉の得点で競う。
◦ピッチャーロボットとバッターロボットが所定の位置まで移動してピンポン球を投げて打つ
◦ピッチャーロボットはA地点をスタートしM地点まで移動する
◦バッターロボットはC地点をスタートしB地点まで移動する
◦スタート時はそれぞれA地点B地点の枠内に収まること(高さの制限はなし)
◦M地点、B地点では接地している部分が枠内に入っていること
◦ピッチャーロボットはスタート時にピンポン球を5個まで保持できる
◦ピッチャーロボットが投げたピンポン球をバッターロボットは3秒以上保持してはならない
◦移動の途中で目標に接触してはならない
今回担当したのはピッチャーロボットだ。RISの下の部分に空間があり、そこにピンポン玉を積む。コンパクトに積めたのはこの機体の良かったところだ。
光センサーと回転センサーを使った。移動する時は光センサーで黒線を感知して止まり、そこで角度を調節する。この時電池残量などに左右されず、同じだけ回転するように回転センサーを使う。ボールの発射の邪魔にならないように光センサーはボール発射するタイヤとは反対側につけた。センサーがある方を前にして進む。
2つのタイヤの間にピンポン玉を挟み、タイヤを回してボールを発射する。タイヤ間の距離が広かったので、ゴムを巻いて調節してみた。
同じチームの相方コンビが作ったバッターロボット。
光センサーを使ってピンポン玉を感知するとアームが動く。より広い範囲に来る球を打つためにこの部分に2つ光センサーを使った。移動はピッチャーロボットと同様に光センサーと回転センサーを使って行う。
光センサーが黒線を感知するまで前に進むサブルーチン。わかりやすいように黒線を感知すると音が鳴るようにしてある。
sub stop_line() { until(SENSOR_2<48){ OnFwd(OUT_AC); } PlaySound(SOUND_UP); }
移動はAからMまでほぼ直進するルートを通るが最後にBを向きやすいように機体の向きを調節しながら進む。AとMの枠も入れて計4本の黒線を感知する。
task main() #define READY 150 //通信で使う値 { SetSensor(SENSOR_1,SENSOR_ROTATION); SetSensor(SENSOR_2,SENSOR_LIGHT); ClearSensor(SENSOR_1); until(SENSOR_1>4){ OnFwd(OUT_C); OnRev(OUT_A);} //機体の向きを変える Off(OUT_AC); stop_line(); //1本目の線(Aの枠)まで前進 ClearSensor(SENSOR_1); until(SENSOR_1<-5){ OnFwd(OUT_AC);} //1本目の線を完全に通過 stop_line(); //2本目の線まで前進 Off(OUT_AC); Wait(50); ClearSensor(SENSOR_1); until(SENSOR_1<-4){ OnFwd(OUT_AC);} //2本目の線を完全に通過 Off(OUT_AC); Wait(10); stop_line(); //3本目の線まで前進 Off(OUT_AC); Wait(40); ClearSensor(SENSOR_1); until(SENSOR_1>2){ OnFwd(OUT_C); OnRev(OUT_A);} //機体の向き調整 ClearSensor(SENSOR_1); until(SENSOR_1<-7){ OnFwd(OUT_AC);} //3本目の線を完全に通過 Off(OUT_AC); stop_line(); //4本目の線(Mの枠)まで前進 Off(OUT_AC); Wait(60); ClearSensor(SENSOR_1); until(SENSOR_1<-6){ OnFwd(OUT_AC);} ClearSensor(SENSOR_1); until(SENSOR_1<-20){ OnFwd(OUT_A); OnRev(OUT_C);} //機体の向き調整 Bを向く Mの枠を軸に回転するので機体はMにちょうど収まる。 Off(OUT_AC); ClearMessage(); until(Message()==READY); //メッセージを受け取る。 PlaySound(SOUND_CLICK); //確認のため音をならす。 while(true){ Wait(500);// OnRev(OUT_B); Wait(35); Off(OUT_B); //一定間隔ごとに球を発射 } }
#define go_forward OnFwd(OUT_AC);//前に進む #define turn_left1 Off(OUT_C);OnFwd(OUT_A);//小さく左に曲がる #define turn_left2 OnRev(OUT_C);OnFwd(OUT_A);//大きく左に曲がる #define turn_right1 Off(OUT_A);OnFwd(OUT_C);//小さく右に曲がる #define turn_right2 OnRev(OUT_A);OnFwd(OUT_C);//大きく右に曲がる #define MAX_TIME 20 //交差点判断の際のタイマーの基準値
sub crossing_stop() //交差点に入って止まる { ClearTimer(0); while(FastTimer(0)<MAX_TIME){ //タイマーが基準値以下のときライントレースする if(SENSOR_2<39){ turn_left2; //真黒なところで大きく左に曲がる }else if(SENSOR_2<41){ turn_left1;ClearTimer(0); //ほとんど黒いところで小さく左に曲がる }else if(SENSOR_2<43){ go_forward;ClearTimer(0); //白と黒の間で直進する }else if(SENSOR_2<50){ turn_right1;ClearTimer(0); //ほとんど白いところ小さく右に曲がる }else{ turn_right2;ClearTimer(0); //真っ白なところで大きく右に曲がる } } Off(OUT_AC);Wait(100); OnRev(OUT_AC);Wait(20);//タイマーが基準値を上回ったとき交差点と判断し一時停止して、後退する }
sub crossing_left()//T字路で止まってから、左に曲がる { turn_left1; Wait(80); }
task main() { SetSensor(SENSOR_1,SENSOR_LIGHT);//バッティングするときに使う光センサー SetSensor(SENSOR_2,SENSOR_LIGHT);//ライントレースをするときに使う光センサー SetSensor(SENSOR_3,SENSOR_ROTATION);//回転センサー
まず、回転センサーを使いながらRの少し前まで進む。
ClearSensor(SENSOR_3); until (SENSOR_3<-18){ OnFwd(OUT_AC); } ClearSensor(SENSOR_3); until(SENSOR_3<-7){ OnFwd(OUT_A);OnRev(OUT_C); } until(SENSOR_2<40){ OnFwd(OUT_AC); }Off(OUT_AC); ClearSensor(SENSOR_3); until (SENSOR_3>1){ OnRev(OUT_A);Off(OUT_C); } ClearSensor(SENSOR_3); until (SENSOR_3<-4){ OnFwd(OUT_AC); } until(SENSOR_2<40){ OnFwd(OUT_AC); } ClearSensor(SENSOR_3); until (SENSOR_3<-4){ OnFwd(OUT_AC); }
R前の直線からライントレースを始める
crossing_stop(); crossing_left(); crossing_stop();
Bに入り、向きを調節する。
ClearSensor(SENSOR_3); until (SENSOR_3>6){ OnRev(OUT_A);Off(OUT_C); } ClearSensor(SENSOR_3); until (SENSOR_3<-24){ OnFwd(OUT_AC); } ClearSensor(SENSOR_3); until (SENSOR_3>9){ OnRev(OUT_A);Off(OUT_C); } Off(OUT_AC);Wait(30);
ピッチャーに近づき、メッセージを送る。その後戻る。光センサーでボールを見つけ、打つ。
ClearSensor(SENSOR_3); until (SENSOR_3>16){ OnRev(OUT_AC); } Off(OUT_AC); SendMessage(150); Wait(100); ClearSensor(SENSOR_3); until (SENSOR_3<-16){ OnFwd(OUT_AC); } Off(OUT_AC); while(true){ if(SENSOR_1>61){ OnRev(OUT_B); Wait(10); Off(OUT_B);Wait(50); OnFwd(OUT_B); Wait(10); Off(OUT_B); } } Off(OUT_ABC); }
投げる部分があまり良くなかったと思う。手でタイヤを回したときにうまくいったからとこだわりすぎた。ギヤの噛み合わせに時間がかかって実験してみるまでも時間がかかってしまったので実験しやすいというのも大事だと思った。最後までギヤのかみ合わせは納得できなかったが妥協したのでちゃんと飛ばなかった。移動に使う左右のモーターに差があると直進するプログラムを書いても曲がっていくので左右の差が少なくなるように試したほうが良かった。時間があるうちにいろいろ試してみて比べるのが大事だと実感した。時間があると思わないでもっと集まっておけばよかったというのが反省点だ。一緒に作った人とはバッターやピッチャーに関わらず助けてもらった。ほかのチームの人にも助けてもらった。ロボットのゼミだが、人間性の大切さを学んだ。助けてくれた人たちありがとうございました。