球技ロボット
・ピッチャーロボットとバッターロボットが所定の位置まで移動してピンポン球を投げて打つ
・ピッチャーロボットはA地点をスタートしM地点まで移動する
・バッターロボットはC地点をスタートしB地点まで移動する
・スタート時はそれぞれA地点B地点の枠内に収まること(高さの制限はなし)
・M地点、B地点では接地している部分が枠内に入っていること
・ピッチャーロボットはスタート時にピンポン球を5個まで保持できる
・ピッチャーロボットが投げたピンポン球をバッターロボットは3秒以上保持してはならない
・移動の途中で目標に接触してはならない
自分はバッターを担当していたので、ピッチャーは簡単に説明する。
ピッチャーロボットは、前についている二つのタイヤを回転させて、それによってボールを打ち
出す仕組みです。
また、RIS本体の下にピンポン球を収納する空間をつくって、最大でボールを5個収納できるようにした。
さらに、タイヤにゴムをつけているのは、ロボットが移動中に、ピンポン玉がタイヤの間から出てくるのを、防ぐためにつけた。
また、移動方法は回転センサーと光センサーの二つを使うことによって移動する。
バッターロボットのコンセプトは、実際のバッターと同様に、ボールを見て打つです。
そのため、ボールの判断をするために、ボールを打つところの上に、光センサーを二つ
つけて、その光センサーがボールを感知すれば、ロボットがバットを振るというふうに
つくりました。
また、ロボットがバットを振る仕組みは、上の写真のように、ギアをかました二つの黄色いレゴが
同時に、180度ずつ外にいくように回って、バットを振るという仕組みです。また、光センサーが
左右についていることと、二つのバットがそれぞれ、180度ずつまわることで、ロボットのミート
力がすごく高くなりました。
また、ロボットの移動方法は、ロボットの後ろにつけた光センサーによるライントレースと、右側
のタイヤにつけた回転センサーによる移動です。
また、左右につけた二つのタイヤと、ロボットの中心部にあるキャスターとで、動くようにしました。
光センサーで線上にいるかどうかを判別して、線上にいるならロボットを左に動かして、
線上にいないなら、右に動かして、境界線上をじぐざくしながら、進んでいく。
また、交差点は何秒間まがっているかで、交差点かどうかを判断する。
自分は、バッターを担当していたのでピッチャーは簡単に説明する
ピッチャーロボットは、まずAP間の黒い線まで進み、次にSP間の黒い線まで進み、最後にMに向かうという順で移動する。
#define READY 150 sub stop_line() { until(SENSOR_2<48){ OnFwd(OUT_AC); } PlaySound(SOUND_UP); } //黒い線まで進み、光センサーが線を感知すると音が出るようにした
task main() { 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(); //Aのボックスの黒い線まで進む ClearSensor(SENSOR_1); until(SENSOR_1<-5){ OnFwd(OUT_AC);} //黒い線を超える stop_line(); //AP間の黒い線まで進む Off(OUT_AC); Wait(50); ClearSensor(SENSOR_1); until(SENSOR_1<-4){ OnFwd(OUT_AC);} Off(OUT_AC); Wait(10); //黒い線を超える stop_line(); //SP間の黒い線まで進む 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);} Off(OUT_AC); //黒い線を超える stop_line(); Off(OUT_AC); Wait(60); //Mの円状の黒い線まで進む ClearSensor(SENSOR_1); until(SENSOR_1<-6){ OnFwd(OUT_AC);} ClearSensor(SENSOR_1); until(SENSOR_1<-20){ OnFwd(OUT_A); OnRev(OUT_C);} Off(OUT_AC); //ピッチャーボックスに入るために、調整する ClearMessage(); until(Message()==READY); PlaySound(SOUND_CLICK); while(true){ Wait(500); OnRev(OUT_B); Wait(35); Off(OUT_B); } //バッターからの通信を受け次第、一定の時間間隔を置き、球を発射させる }
バッターロボットは、最初にQR間の黒い線に向かって、回転センサーを使って移動して、そこから
ライントレースを始めて、バッターボックスである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;//しきい値が39以下のところで大きく左に曲がる }else if(SENSOR_2<41){ turn_left1;ClearTimer(0);//しきい値が41以下のところで小さく左に曲がる }else if(SENSOR_2<43){ go_forward;ClearTimer(0);//しきい値が43以下のところで直進する }else if(SENSOR_2<50){ turn_right1;ClearTimer(0);//しきい値が50以下のところで小さく右に曲がる }else{ turn_right2;ClearTimer(0);//しきい値が51以上のところで大きく右に曲がる } } 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);//回転センサー
ClearSensor(SENSOR_3); until (SENSOR_3<-18){ OnFwd(OUT_AC); } //6点のゴールの直前まで進む ClearSensor(SENSOR_3); until(SENSOR_3<-7){ OnFwd(OUT_A);OnRev(OUT_C); } //90度左へ回転する until(SENSOR_2<40){ OnFwd(OUT_AC); }Off(OUT_AC); //ロボットから見て、1回目のQR間の黒い線まで直進し、光センサーで黒い線を感知したら、その場で停止する。 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); } //ロボットから見て、2回目のQR間の黒い線まで直進し、光センサーで黒い線を感知したら、その場で停止する。 ClearSensor(SENSOR_3); until (SENSOR_3<-4){ OnFwd(OUT_AC); } //黒い線を超えるために、少し直進する crossing_stop(); //RのT字路までライントレースをして、Rに差し掛かったら、停止する crossing_left(); // T字路を左へ曲がる crossing_stop(); //BのT字路までライントレースをして、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); } //Bのボックスに入り、かつ球を打てるように、位置を整える 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); } } //SENSOR1の光センサーの値が、62以上になればバットを振り、次の球に備えてすぐに、バットを戻すというふうにした。 Off(OUT_ABC); }
今回のロボコンは、テスト期間と被ったということもあって、メンバー全員が集まることは難しく、また、一部のメンバーに大きく負担がかかってしまったりしたので、そういうところが残念だった。
でも、ロボコンで自分たちで作ったロボットが動いてる姿を見て、頑張ったかいがあったと思えた。