ロボットの紹介

  1. 最初にボールを投げるロボット
    DSC_0008.jpg
    DSC_0009.jpg
    DSC_0010.jpg
    DSC_0011.jpg
    DSC_0012.jpg
    DSC_0013.jpg
  1. 最初にボールを受け取るロボット
    _36974.jpg
    _36972.jpg
    _36968.jpg
  • ロボットの前方は、ボールをつかむためのアームとパスをするためアームを取り付けて一つのモーターによってどちらもできるようにしました。
  • アームの部分を四角形し、ボールを運ぶ時のボールを手放してしまうのを防ぎ、一辺を車体の横幅ギリギリまで大きくすることでボールをつかむ確率を上げました。
  • ロボットの後方は、タイヤをつけてロボット全体のバランスを整えるようにしました。
  • 課題1のロボットとベースを同じにすることでプログラムの面でも課題1のものを活かせるようにしました。
  • 小さくて平たいブロックをたくさん使うことによって、ロボットの強度を上げるとともに重たくなることも防ぎました。
  • タイヤも課題1と同様、小さいものを使うことによって機動性を高めました。
  • タッチセンサーは、アームのなかほどにつけました。
  • もう一つのロボットも同じ仕様にしてパスの出し手と受け手の違いを少なくしました。

コース攻略

robocon2013a.png
  • 今回のコースは、課題1のコースを利用したもので基本的なライントレースはあまり変わらなかったです。
  • RCXでは、赤外線通信がロボットとの距離が遠くてできなかったので、完全に2台のロボットを時間でコントロールしました。
  • しきい値は、課題1より少し高く39に設定することで調整できました。
  • パスは、真っ直ぐできるようにロボットどうしの向きに注意しました。
  • ボールをつかむ動作では、少しでもずれると取れないので慎重に時間のコントロールをしました。

プログラム説明

  1. 最初にパスを出す側のロボット
  • しきい値、モーターのパワー、左旋回、右旋回、アーム、交差点、nMAXの定義
    #define THRESHOLD 42
    #define HIPOWER 7
    #define LOWPOWER 2
    #define set_power_H SetPower(OUT_AC,HIPOWER);
    #define set_power_L SetPower(OUT_AC,LOWPOWER);
    #define set_power_N SetPower(OUT_B,LOWPOWER);
    #define go_fwd set_power_H; OnFwd(OUT_AC);
    #define arm_fwd set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B);
    #define arm_bwd set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B);
    #define turn_left1 set_power_L ;\
      OnFwd(OUT_C);OnRev(OUT_A);
    #define turn_left0 set_power_L ;\
      OnFwd(OUT_C);Off(OUT_A);
    #define turn_right0 set_power_L ;\
      OnFwd(OUT_A);Off(OUT_C);
    #define turn_right1 set_power_L ;\
      OnFwd(OUT_A);OnRev(OUT_C);
    #define STEP 1
    #define nMAX 3
    #define short_break Off(OUT_AC); Wait(100);
    #define CROSS_TIME 300
    #define cross_line set_power_L;\
      OnFwd(OUT_A);OnRev(OUT_C);\
      Wait(CROSS_TIME);short_break;
    サブルーチン
  • 左旋回でライントレース
    sub followline_l ()
    {
      int nOnline=0;
      int MOVETIME;
      MOVETIME=0;
      SetSensor(SENSOR_2,SENSOR_LIGHT);
    
    
      PlaySound(SOUND_UP);
      MOVETIME=MOVETIME+600;
     
      while(nOnline < nMAX  && FastTimer(0)<=MOVETIME){
       
        if(SENSOR_2< THRESHOLD -14) {
           turn_left1;
           nOnline++;
        }else{
         if(SENSOR_2< THRESHOLD -10){
          turn_left0;
        }else if(SENSOR_2< THRESHOLD -7){
          go_fwd;
        }else if(SENSOR_2< THRESHOLD -1){
          turn_right0;
        }else{
           turn_right1;
         }
         nOnline=0;
        
         }
         Wait(STEP*10);
       }	
    }
  • 右旋回でライントレース
    sub followline_r () 
    {
      int nOnline=0;
      int MOVETIME;
      MOVETIME=0;
      SetSensor(SENSOR_2,SENSOR_LIGHT);
    
    
     MOVETIME=MOVETIME+600;
     PlaySound(SOUND_DOWN);
     
      while(nOnline < nMAX  && FastTimer(0)<=MOVETIME){
       
        if(SENSOR_2< THRESHOLD -14) {
           turn_right1;
           nOnline++;
        }else{
         if(SENSOR_2< THRESHOLD -10){
          turn_right0;
        }else if(SENSOR_2< THRESHOLD -7){
          go_fwd;
        }else if(SENSOR_2< THRESHOLD -1){
          turn_left0;
        }else{
           turn_left1;
         }
         nOnline=0;
        
         }
         Wait(STEP*10);
       }	
    }
  • 左回りでライントレース
    sub followline_l1 ()
    {   
      int MOVETIME;
      MOVETIME=0;
      SetSensor(SENSOR_2,SENSOR_LIGHT);
      MOVETIME=MOVETIME+450; 
      PlaySound(SOUND_LOW_BEEP);
     
     
      while(FastTimer(0)<=MOVETIME){
        if(SENSOR_2< THRESHOLD -14) {
           turn_left1;
        }else{
         if(SENSOR_2< THRESHOLD -10){
          turn_left0;
         }else if(SENSOR_2< THRESHOLD -7){
          go_fwd;
         }else if(SENSOR_2< THRESHOLD -1){
          turn_right0;
         }else{
           turn_right1;
          }
         Wait(STEP*10);
         }
      }
    }
  • 右回りのライントレース
    sub followline_r1 () 
    {   
      int MOVETIME;
      MOVETIME=0;
      SetSensor(SENSOR_2,SENSOR_LIGHT);
      MOVETIME=MOVETIME+150; 
      PlaySound(SOUND_CLICK);
     
     
      while(FastTimer(0)<=MOVETIME){
        if(SENSOR_2< THRESHOLD -14) {
           turn_right1;
        }else{
         if(SENSOR_2< THRESHOLD -10){
          turn_right0;
         }else if(SENSOR_2< THRESHOLD -7){
          go_fwd;
         }else if(SENSOR_2< THRESHOLD +1){
          turn_left0;
         }else{
          turn_left1;
          }
         Wait(STEP*10);
         }
      }
    }
  • ボールをキャッチする
    sub catch_1 ()
    {
           turn_right1;Wait(100);
           Off(OUT_AC);Wait(50);
           go_fwd;Wait(50);
           Off(OUT_AC);Wait(50);
           OnFwd(OUT_B);Wait(15);
           Off(OUT_B);Wait(10);
           turn_left1;Wait(100);
           Off(OUT_AC);Wait(50);
    }
  • ボールを投げる
    sub throw_1 ()
    {
           OnFwd(OUT_B);Wait(10);
           Off(OUT_B);Wait(10);
    }
  • ボールを取りに行く
    sub get_1()
    {
           OnFwd(OUT_B);Wait(10);
           Off(OUT_B);Wait(300);
           OnRev(OUT_B);Wait(40);Off(OUT_B);Wait(10);
    } 
    タスクメイン
    task main ()
    {
     SetSensor(SENSOR_2,SENSOR_LIGHT);
     ClearTimer(0);
     int nOnline;
     int MOVETIME;
     
     turn_left1;Wait(180);
     Off(OUT_AC);Wait(10);
     ClearTimer(0);
 while(FastTimer(0)<=150){
    followline_r1();
 }
       Off(OUT_AC);
       Wait(3500);
 
       turn_left1;Wait(80); 
	 Off(OUT_AC);Wait(100);
       get_1();
       turn_left1;Wait(50);
       Off(OUT_AC);Wait(800);
       throw_1();
       turn_left1;Wait(80);
	Off(OUT_AC);Wait(10);
	ClearTimer(0);         
 
while(FastTimer(0)<=450){
    followline_l1();
 }
       Off(OUT_AC);
       Wait(50); 
       ClearTimer(0);
       turn_right1;Wait(120);Off(OUT_AC);Wait(10);
       get_1();
       turn_left1;Wait(130);Off(OUT_AC);Wait(10);
       ClearTimer(0); 
while(FastTimer(0)<=600){
    followline_l();
 }
       Off(OUT_AC);
       Wait(50); 
      turn_left1;Wait(30);Off(OUT_AC);Wait(10);
    
       throw_1();
       turn_right1;Wait(100);Off(OUT_AC);Wait(10);
       ClearTimer(0);
while(FastTimer(0)<=600){
    followline_l();
 }
       Off(OUT_AC);
       Wait(50); 
       ClearTimer(0);
       catch_1();
}

2. 最初にパスを受け取る側のロボット

  • しきい値、モーターのパワー、左旋回、右旋回、アーム、交差点、nMAXの定義
    #define THRESHOLD 39 //基準のしきい値
    #define HIPOWER 7
    #define LOWPOWER 2
    #define set_power_H SetPower(OUT_AC,HIPOWER);
    #define set_power_L SetPower(OUT_AC,LOWPOWER);
    #define set_power_N SetPower(OUT_B,LOWPOWER);
    #define go_fwd set_power_H; OnFwd(OUT_AC); //前進
    #define throw set_power_H; OnFwd(OUT_B); //投げる
    #define arm_fwd set_power_N; OnFwd(OUT_B);Wait(30);Off(OUT_B); //アームを上げる
    #define arm_bwd set_power_N; OnRev(OUT_B);Wait(30);Off(OUT_B); //アームを下げる
    #define turn_left1 set_power_L ; //左旋回
     OnFwd(OUT_C);OnRev(OUT_A);
    #define turn_left0 set_power_L ; //左回転
     OnFwd(OUT_C);Off(OUT_A);
    #define turn_right0 set_power_L ; //右回転
     OnFwd(OUT_A);Off(OUT_C);
    #define turn_right1 set_power_L ; //右旋回
     OnFwd(OUT_A);OnRev(OUT_C);
    #define STEP 1
    #define nMAX 200 //判断する最大値
    #define short_break Off(OUT_AC); Wait(100); //小休憩
    #define CROSS_TIME 300 //交差点を通過する時間
    #define cross_line set_power_L; //交差点を通過
     OnFwd(OUT_A);OnRev(OUT_C);Wait(CROSS_TIME);short_break;
    サブルーチン
  • 左旋回のライントレース
    sub followline_l () //左側をライントレース {
     int nOnline=0;
     int MOVETIME;
     MOVETIME=0;
     SetSensor(SENSOR_2,SENSOR_LIGHT);
     PlaySound(SOUND_UP);
     MOVETIME=MOVETIME+500;
     while(nOnline < nMAX  && FastTimer(0)<=MOVETIME){
       if(SENSOR_2< THRESHOLD -14) {
          turn_left1;
          nOnline++;
       }else{
        if(SENSOR_2< THRESHOLD -10){
         turn_left0;
       }else if(SENSOR_2< THRESHOLD -7){
         go_fwd;
       }else if(SENSOR_2< THRESHOLD -1){
         turn_right0;
       }else{
          turn_right1;
        }
        nOnline=0;
       
        }
        Wait(STEP*10);
      }
    }
  • 右旋回のライントレース
    sub followline_r () //右側をライントレース {
     int nOnline=0;
     int MOVETIME;
     MOVETIME=0;
     SetSensor(SENSOR_2,SENSOR_LIGHT);
    MOVETIME=MOVETIME+500;
    PlaySound(SOUND_DOWN);
     while(nOnline < nMAX  && FastTimer(0)<=MOVETIME){
        if(SENSOR_2< THRESHOLD -14) {
          turn_right1;
          nOnline++;
       }else{
        if(SENSOR_2< THRESHOLD -10){
         turn_right0;
       }else if(SENSOR_2< THRESHOLD -7){
         go_fwd;
       }else if(SENSOR_2< THRESHOLD -1){
         turn_left0;
       }else{
          turn_left1;
        }
        nOnline=0;
        }
        Wait(STEP*10);
      }	
    }
  • 左回りのライントレース
    sub followline_l1 () //もうひとつの左側のライントレース {
     int MOVETIME;
     MOVETIME=0;
     SetSensor(SENSOR_2,SENSOR_LIGHT);
     MOVETIME=MOVETIME+500; 
     PlaySound(SOUND_LOW_BEEP);
     while(FastTimer(0)<=MOVETIME){
       if(SENSOR_2< THRESHOLD -14) {
          turn_left1;
       }else{
        if(SENSOR_2< THRESHOLD -10){
         turn_left0;
        }else if(SENSOR_2< THRESHOLD -7){
         go_fwd;
        }else if(SENSOR_2< THRESHOLD -1){
         turn_right0;
        }else{
          turn_right1;
         }
        Wait(STEP*10);
        }
     }
    }
  • 右回りのライントレース
    sub catch_1 () //もうひとつの右側のライントレース {
    	 turn_right1;Wait(125);
    	 Off(OUT_AC);Wait(50);
    	 go_fwd;Wait(20);
    	 Off(OUT_AC);Wait(10);
    	 OnFwd(OUT_B);Wait(11);
    	 Off(OUT_B);Wait(10);
    	 go_fwd;Wait(170);
    	 Off(OUT_AC);Wait(1);
    	 OnRev(OUT_B);Wait(10);
    	 Off(OUT_B);Wait(50); 
    	 turn_left1;Wait(20);
    	 Off(OUT_AC);Wait(2);
    }
  • ボールを投げる
    sub throw_1 () //ボールを投げる {
    	 throw;Wait(50);
    	 Off(OUT_B);Wait(10);	
    }
  • ボールを取りに行く
    sub get_1 () //ボールを拾う {
    	 OnFwd(OUT_B);Wait(10);
    	 Off(OUT_B);Wait(600);
    	 OnRev(OUT_B);Wait(50);
    	 Off(OUT_B);Wait(50);
    }
    タスクメイン
    task main () {
    SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);
    int nOnline;
    int MOVETIME;
while(FastTimer(0)<=500){
   followline_l();
 }
	 Off(OUT_AC);
	 Wait(1); 
	 ClearTimer(0);
	
while(FastTimer(0)<=500){
   followline_l();
}
	 Off(OUT_AC);
	 Wait(1); 
	 catch_1();
	 ClearTimer(0);
	
while(FastTimer(0)<=500){
   followline_l();
}
	 Off(OUT_AC);
	 Wait(1); 
	 ClearTimer(0);
	 turn_right1;Wait(10);	
	
while(FastTimer(0)<=300){
 followline_l1();
}
	 Off(OUT_AC);Wait(1);
	 ClearTimer(0);
	 turn_left1;
	 Wait(30);
	 turn_right1;Wait(30);
	
while(FastTimer(0)<=500){
 followline_r();
}
	 Off(OUT_AC);
	 Wait(1);
	 ClearTimer(0);
	
while(FastTimer(0)<=500){
 followline_r();
}
	 Off(OUT_AC);
	 Wait(1);
	 ClearTimer(0);
	
	 turn_left1;Wait(200);
	 Off(OUT_AC);Wait(50);
	 throw_1();	
	 turn_right1;Wait(80);
	 Off(OUT_AC);Wait(10);
	
while(FastTimer(0)<=500){
 followline_r();
  }
	 Off(OUT_AC);
	 Wait(1);
	 ClearTimer(0);	
	
while(FastTimer(0)<=500){
 followline_r();
}
	 Off(OUT_AC);
	 Wait(1);
	 PlaySound(SOUND_CLICK);
	 ClearTimer(0);	
	 turn_left1;Wait(180);
	 Off(OUT_AC);Wait(50);
	 get_1();
	 turn_right1;Wait(60);
	 Off(OUT_AC);Wait(600);	
	 throw_1();
	 Off(OUT_B);Wait(50);
	 Off(OUT_AC);Wait(50);
}

まとめ、感想

今回の課題は、特に外的な要因によっていろいろな影響が出た課題でした。電池の残量によるロボットの動きの変化がロボットを動かすたびに大きく影響しました。電池の残りが多くある場合には、思っているより大きな動きになって、残りが少ない場合には小さな動きになるのでとても苦労しました。そして、ロボット作りにも力をいれました。どうすれば投げる動作と受け取る動作を1つのモーターでできるのかなどを考えて作りました。プログラムの面では、2台のロボットのタイマーの調整に手こずりました。ほんの0.5秒の差が2台の動作を大きく狂わせてしまうので、慎重に根気よく調整を続けました。ロボコンでは、ボールをつかむところまでしか成功しませんでしたが、パスまではもう少しのところまできていたので悔しかったです。このゼミで学んだことは必ず次に生かすことができると思うので最大限活用したいです。


添付ファイル: file_36968.jpg 211件 [詳細] file_36971.jpg 93件 [詳細] file_36974.jpg 214件 [詳細] file_36972.jpg 219件 [詳細] filerobocon2013a.png 194件 [詳細] fileDSC_0014.jpg 90件 [詳細] fileDSC_0013.jpg 231件 [詳細] fileDSC_0012.jpg 238件 [詳細] fileDSC_0011.jpg 232件 [詳細] fileDSC_0010.jpg 218件 [詳細] fileDSC_0009.jpg 224件 [詳細] fileDSC_0008.jpg 204件 [詳細] fileDSC_0007.jpg 86件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-08-17 (土) 22:53:53