[[2016b/Member]]
#contents
*課題の説明 [#o00b0829]
課題2で作成したフィールドを使って野球ロボットを製作する~
自分はバッターロボを担当しました。
#ref(2016b/Member/yosuke/Mission3/2016b-mission3.png,70%,バッター)~

*ロボット本体の説明(バッター) [#q206d180]
#ref(2016b/Member/yosuke/Mission3/IMG_1102.JPG,10%,バッター)~
~
#ref(2016b/Member/yosuke/Mission3/IMG_1104.JPG,10%,バッター)~
~
バッターポジションまで向かうのには前回作成したライントレースのプログラム(ペアの方のもの)を使用しました。移動には回転センサーと光センサーそれぞれ一個ずつを使用しました。回転センサーを使用することで時間で設定するよりもより正確に目的地まで到達することができるようになりました。また、裏面にはキャスターを用いることで摩擦を少なく移動をさせることができました。次に、ピッチャーロボットから放たれた球を打つ方法についてですが、これは黄色いL字型の部品をギアにかませそのギアをモーターにかませるという形でバットを作成し、モーターを動かすことによってバットをスイングしボールを打つという構造です。バットの役目を果たすL字型の部品が二つあることによってある程度なら球の軌道が変化してもしっかりと球を打ち返すことができました。また、打つ際には前面にある光センサー二つが黒を検知する(球が近づいたことを検知する)ことによってバットを振るという仕組みです。この仕組みに関してもセンサーが二つあることによってより正確に球が来たことを判断することができました。
*ロボット本体の説明(ピッチャー) [#u1c3a590]
#ref(2016b/Member/yosuke/Mission3/IMG_1101.JPG,10%,ピッチャ-)~
~
#ref(2016b/Member/yosuke/Mission3/IMG_1105.JPG,10%,ピッチャ-)~
~
ピッチャーロボットの移動に関してもバッターロボットの移動と同様に光センサーと回転センサーを用いました。どちらの機体についてもですが回転センサーを用いることで電池残量等の影響を受けずに正確な動きをすることができました。ボールの投げ方については前面についている二つのタイヤを回転させることによってボールを放つという仕組みです。タイヤにゴムが巻いてあるのはボールがタイヤを回転していないのに勝手に転がって行ってしまうのを防ぐためです。また、RIS本体の下にはボールを収納できる空間があり最大5個までためておくことが可能です。
*プログラム (ピッチャー)[#c7a8c9d1]
サブルーチンは光センサーが黒を検知するまで進むというもの。検知したら音を鳴らす。
 sub stop_line()
 {
   until(SENSOR_2<48){
   OnFwd(OUT_AC);
   }
  PlaySound(SOUND_UP);
 }
基本的には目的地まで直線的に向かうが最終的に向きがB地点を向くように調節してある。
 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);   //一定間隔ごとに球を発射
                  
                     }
 
 }
*プログラム(バッター) [#lfd4b5a4]
 #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()より上の定義やサブルーチンに関しては前回のライントレースの課題のものを使用しています。しかし、条件文の数値に関しては多少前回のものと変更しています。~
task main()の中でピッチャーロボとの通信について記述している部分はこちらからメッセージを送りピッチャーロボが受け取ったら球を投げるという仕組みです。目的地の移動に関してはまず初めに回転センサーを用いてQR間の黒線まで行く。その後ライントレースを行いB地点に向かう。
task main()の中でピッチャーロボとの通信について記述している部分はこちらからメッセージを送りピッチャーロボが受け取ったら球を投げる準備をするという仕組みです。目的地の移動に関してはまず初めに回転センサーを用いてQR間の黒線まで行きます。その後ライントレースを行いB地点に向かいます。その後位置の微調整を行います。

 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);
 }
*まとめ、感想 [#v8b8eb91]
今回の課題は前回、前々回に比べて非常に難易度が上がっていて大変でした。~
実際に本番のロボコンの際には多くのチームが不具合を起こしたりして普段~
のように動作しないということがありました。その理由として教室が~
変わったことにより床の環境(摩擦度合い等)や光センサーの値が変化したり~
、教室の傾き度合いでボールの軌道が変化したりするといったことによるのではないかと~
考えられました。その結果普段のような結果にならなかったということについて~
ロボットはとても繊細なんだなということを感じました。~
また、機体に関しても動作の途中に部品が外れたりギアのかみ合わせが外れ~
正常な動作をしないというケースが多発したことに関してもロボットの繊細な部分を~
感じることができました。加えてこの授業全体を通して最も強く感じたことがたかが~
漢字を一つ書くことや線の上をなぞって所定の位置に行くこと、片方の機体が放った球を~
もう片方の機体が打つという単純な動作をするロボットを製作するのにこんなにも~
長い時間をかけ、たくさんの労力をかける必要があったということにとても驚きました。~
人が行えば一瞬で行うことができる活動をロボットにさせるときに~
何十時間とかける必要があるということを知りいかに効率よくロボットを製作し、~
より効率の良いプログラムを構築することはロボットの製作において~
最も大切なことの一つではないかと感じました。現在では対話型のロボット(ペッパー君など)~
や様々な、人の活動を代わりに行うロボットがたくさん生産され始めました。~
今まではそういったロボットを多少すごいと感じても人間がやったほうが~
早いんじゃないかと考えていましたがこのロボティクス入門ゼミの講義を~
経験したうえでそういったロボットを見てみると制作者の何時間に及ぶ努力や~
そういったロボットが常人には製作できる代物ではないと感じることができ~
違った視点でロボットを見ることができるようになりました。~
また、そのほかにも自分と同じ班の三人の方には本当に助けてもらいました。~
自分が参加できない時でも非難することなく取り組んでくれたりして協力すること~
の大切さを学んだ気がします。自分はプログラミングを学ぶ学科
なのでこの講義を通して学んだことを~
これからの授業に生かして行ければいいなと感じました。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS