ロボットの紹介とコース攻略

robocon2013a_3.png

↑コース

  • 課題1と同様タイマーを使い細かく時間を区切り、時間の調節をしやすいようにプログラムした
  • ロボット1…はじめにボールを缶に当てるロボット
    _36974_2_1.jpg
    _36972_2_2.jpg
    _36968_2_3.jpg
  1. ロボット2からボールをもらう位置に移動
  2. 向きを調節し待機
  3. ボールを受け、向きを調節しパス
  4. ライントレースしボールを受け、またライントレース
  5. 缶の前までライントレースしたらシュート
  6. 後半はロボット2の前半と同様に動く
  • ロボット2…はじめにボールを拾うロボット
    DSC_0009_1_1.jpg
    DSC_0011_1_2.jpg
    DSC_0013_1_3.jpg
  1. ライントレースを繰り返し、ボールの前まで進む
  2. アームを上げボールをキャッチ
  3. 再びライントレース
  4. パス、ライントレース、受けを繰り返す
  5. 待機
  6. 後半はロボット1と同様に動く

プログラム説明

  • ロボット1

#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

#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);

}

まとめ

  • ライントレースをすべて時間で区切って操作していたため、調節することが大変だった。また、電池の残量にも気をつけなければならないので、非常に苦労した。
  • 時間が少しでもずれると2台のロボットの動きもすべてずれるので、安定してパスするということができなかった。
  • 結果的に私たちのチームは下から2番目の順位と残念ではあったが、みんなで協力した結果なのでしょうがない。
  • このロボティクス入門ゼミは非常に難しい講義のように思えた。そして、多くのことを学ぶことができたので、これからの大学生活にいかしていきたい。

添付ファイル: fileDSC_0013_1_3.jpg 147件 [詳細] filerobocon2013a_3.png 137件 [詳細] fileDSC_0011_1_2.jpg 133件 [詳細] file_36974_2_1.jpg 135件 [詳細] file_36972_2_2.jpg 131件 [詳細] file_36968_2_3.jpg 121件 [詳細] fileDSC_0009_1_1.jpg 148件 [詳細]

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