[[2015a/Member]]

*ライントレース (A→Bコース) [#q8098b7b]

**はじめに [#nb533e1c]
このページは2015年ロボティックス前期課題2のライントレースA→Bを説明するページである。

ライントレースとは黒く塗られた道をロボットの光センサーを利用して道なりに進ませるものである。

光センサーに閾値を設定してあげることによってロボットに黒か白か判断させることが可能となり、ライントレースが行える。

**ロボットの説明 [#z2cafbc6]
全体図
#ref(1437009372175.jpg,,30%)
先端部(上)
#ref(1437009370384.jpg,,30%)
全体図(下)
#ref(1437009368119.jpg,,30%)
裏側の青い部分が光センサーである。
中心より少しずらすことによって少しでも曲がれば光センサーの位置も真下から見るとずれるように設計されている。先端にアームをつけることで球を挟んで勝手に転がりださないようになっている。
シュートするときはアームとシュートする棒が連動しているので開けば自動的にシュートできるようになっている。

**プログラミング [#y196f944]

   #define THRESHOLD 40
   #define HIPOWER 6
   #define LOWPOWER 2
   #define set_power_H SetPower(OUT_AC,HIPOWER);
   #define set_power_L SetPower(OUT_AC,LOWPOWER);
   #define go_forward set_power_H; OnFwd(OUT_AC);
   #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 MOVE_TIME 1750
   #define MOVE_TIME2 2100
   #define CLOSE OnFwd(OUT_1)
   #define OPEN OnRev(OUT_1)
   
   
   sub fetch()
   {OPEN; Wait(900) CLOSE; Wait(1200) OPEN; }
   
   task main()
   {
     SetSensor(SENSOR_2,SENSOR_LIGHT);
   
     ClearTimer(0);
   
   	while(true){
   while (FastTimer(0) <= MOVE_TIME) {
   	    if (SENSOR_2 > THRESHOLD +4) {
   	      turn_left1;
   	    } else if (SENSOR_2 > THRESHOLD +3) {
   	      turn_left0;
   	    } else if (SENSOR_2 > THRESHOLD -3) {
   	      go_forward;
   	    } else if (SENSOR_2 > THRESHOLD -4) {
   	      turn_right0;
   	    } else {
   	      turn_right1;
   	    }
   	}
   while (MOVE_TIME < MOVE_TIME2){
   if (SENSOR_2 < THRESHOLD -4) {
   	      turn_left1;
   	    } else if (SENSOR_2 < THRESHOLD -3) {
   	      turn_left0;
   	    } else if (SENSOR_2 < THRESHOLD +3) {
   	      go_forward;
   	    } else if (SENSOR_2 < THRESHOLD +4) {
   	      turn_right0;
   	    } else {
   	      turn_right1;
   	    }
   }
   }
   {while(MOVE_TIME2){
   go_forward}
   }
   } 
  #define THRESHOLD 44
  #define HIPOWER 6
  #define LOWPOWER 2
  #define set_power_H SetPower(OUT_AC,HIPOWER);
  #define set_power_L SetPower(OUT_AC,LOWPOWER);
  #define go_forward set_power_H; OnFwd(OUT_AC);
  #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 short_break Off(OUT_AC); Wait(10);
  #define MAX 10
  #define CLOSE OnRev(OUT_B); Wait(5);
  #define OPEN OnFwd(OUT_B); Wait(5);
  
  
  task main()
  {
    SetSensor(SENSOR_2,SENSOR_LIGHT);
	int count=0;
	int count_2=0;
  
  	while(true){
        while(count < MAX) {	    
            if (SENSOR_2 < THRESHOLD -4) {
  	      turn_left1;
		count++;
  	    } else if (SENSOR_2 < THRESHOLD -3) {
  	      turn_left0;
  	    } else if (SENSOR_2 < THRESHOLD +3) {
  	      go_forward;
  	    } else if (SENSOR_2 < THRESHOLD +4) {
  	      turn_right0;
              count=0;
  	    } else {
		turn_right1;
		}
		Wait(STEP);
  	    }
	count_2++;
 if(count_2 == 1){
     short_break;
     CLOSE;
     turn_right1; Wait(MAX*STEP);
     count=0;}
 if(count_2 == 2){
     short_break;
     turn_right1; Wait(MAX*STEP);
     count=0;
     go_forward; Wait(30);
     turn_right1; Wait(MAX*STEP);}
 if(count_2 == 3){
     short_break;
     turn_right1; Wait(MAX*STEP);
     OPEN;}
 }
 }
**プログラミングの説明 [#r281cbb1]
   #define THRESHOLD 40
閾値の設定ここでは40にした。
   #define HIPOWER 6
   #define LOWPOWER 2
パワーの設定
   #define set_power_H SetPower(OUT_AC,HIPOWER);
   #define set_power_L SetPower(OUT_AC,LOWPOWER);
   #define go_forward set_power_H; OnFwd(OUT_AC);
   #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 MOVE_TIME 1750
   #define MOVE_TIME2 2100
それぞれの時間の設定
   #define CLOSE OnFwd(OUT_1)
   #define OPEN OnRev(OUT_1)
アームの開閉の設定
   
   
   sub fetch()
   {OPEN; Wait(900) CLOSE; Wait(1200) OPEN; }
9秒まで開き、その後12秒閉じて、開くプログラミング
   
   task main()
   {
     SetSensor(SENSOR_2,SENSOR_LIGHT);
光センサーの設定
   
     ClearTimer(0);
タイマーの設定
   
   	while(true){
   while (FastTimer(0) <= MOVE_TIME) {
   	    if (SENSOR_2 > THRESHOLD +4) {
   	      turn_left1;
   	    } else if (SENSOR_2 > THRESHOLD +3) {
   	      turn_left0;
   	    } else if (SENSOR_2 > THRESHOLD -3) {
   	      go_forward;
   	    } else if (SENSOR_2 > THRESHOLD -4) {
   	      turn_right0;
   	    } else {
   	      turn_right1;
   	    }
   	}
黒線の左側に沿って動くプログラミング(17.5秒まで)
   while (MOVE_TIME < MOVE_TIME2){
   if (SENSOR_2 < THRESHOLD -4) {
   	      turn_left1;
   	    } else if (SENSOR_2 < THRESHOLD -3) {
   	      turn_left0;
   	    } else if (SENSOR_2 < THRESHOLD +3) {
   	      go_forward;
   	    } else if (SENSOR_2 < THRESHOLD +4) {
   	      turn_right0;
   	    } else {
   	      turn_right1;
   	    }
   }
   }
黒線の右側に沿って動くプログラミング(21秒まで)
   {while(MOVE_TIME2){
   go_forward}
   }
   } 
まっすぐ行くプログラミング
  #define THRESHOLD 44
しきい値の設定
  #define HIPOWER 6
  #define LOWPOWER 2
ギアのスピードの設定
  #define set_power_H SetPower(OUT_AC,HIPOWER);
  #define set_power_L SetPower(OUT_AC,LOWPOWER);
  #define go_forward set_power_H; OnFwd(OUT_AC);
  #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
判断する間隔0.1sの設定
  #define short_break Off(OUT_AC); Wait(10);
小休止
  #define MAX 10
10回左折し続ける時をMAXとおく
  #define CLOSE OnRev(OUT_B); Wait(5);
  #define OPEN OnFwd(OUT_B); Wait(5);
ボールを回収、シュートするための開閉を設定
  
  task main()
  {
    SetSensor(SENSOR_2,SENSOR_LIGHT);
	int count=0;
	int count_2=0;
光センサーを設定し、countは左に曲がろうとした回数、count_2は交差点に差し掛かった回数
  
  	while(true){
            while(count < MAX) {	    
            if (SENSOR_2 < THRESHOLD -4) {
  	      turn_left1;
		count++;
  	    } else if (SENSOR_2 < THRESHOLD -3) {
  	      turn_left0;
  	    } else if (SENSOR_2 < THRESHOLD +3) {
  	      go_forward;
  	    } else if (SENSOR_2 < THRESHOLD +4) {
  	      turn_right0;
              count=0;
  	    } else {
		turn_right1;
		}
		Wait(STEP);
  	    }
黒線の左側をトレースするプログラム左折することを計10回するまで行う
	count_2++;
交差点を判断したということで回数をプラス一回する
 if(count_2 == 1){
     short_break;
     CLOSE;
     turn_right1; Wait(MAX*STEP);
     count=0;}
交差点1回目はボールをつかみ、左折した時間だけ右折させる
 if(count_2 == 2){
     short_break;
     turn_right1; Wait(MAX*STEP);
     count=0;
     go_forward(30); Wait(30);
     turn_right1; Wait(MAX*STEP);}
交差点2回目は左折した時間だけ右折させ、その直線上にある突き当りまで進み左折する
 if(count_2 == 3){
     short_break;
     turn_right1; Wait(MAX*STEP);
     OPEN;}
 }
 }
交差点3回目は左折した時間だけ右折してそのあとシュートする


最初のカーブは比較的緩やかなので、Q地点まで左側に沿って動かしてもたどり着くことができる。

交差点も急なため認識されず、スムーズに通過可能。

途中で球を回収するときは時間を測って確実にアームの中に収まっているときに閉じることで、カー
ブでも転がり落ちないようにしている。

Q地点から先は右側に沿って動くので、直角に曲がる部分も正面で白を認識した後で、右にターンするのでそのまま道なりに進める。

最後はまっすぐ進ませつつ、アームを開くことで、ゴールにロボットごと突っ込ませる。


**おわりに [#pbd9c5e7]
黒線の上では左車輪も右車輪もlowパワーだったので、交差点をらくらく通過できたのがよかった。

直角のところで左に曲がって戻ってしまうので苦戦したが、タイマーを使って途中で黒線の右に沿って動かすことで可能となった。
左折をし続けると交差点と判断するようにプログラミングを書いた。

最後はシュートせず、アームを開いたまま突っ込ませることで、ゴールにいれた。
直角のところで左に曲がって戻ってしまうので苦戦したが、2回目の左折の後そのままそこもこなすことで通過した。

シュートは手前で左折するので交差点と判断するはずなのでそれを利用してシュートした。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS