[[2016a/Member]]

*目次 [#l2279707]
#contents

*課題 [#o9e55d5b]

下の図のようなコースを各チームで作成し、

「ミッション」を遂行するためのロボットを作成せよ。

#ref(2016a-mission2-.png)

黒線の幅は20mmでなるべく均等な濃さにすること。

↓↓「ミッション」↓↓

次の経路を黒い線にそって動くロボットを作成する

ただし、なるべく速く正確に動くロボットになるように工夫して、

交差点では1秒間停止すること。

•C地点からA地点へ (三人目) 

◦C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点

#ref(2016a-mission2- - コピー (7).png)

*ロボット本体の説明 [#yb2c36ad]

下の画像のように、ロボット本体の前方に光センサーを取り付けた

前回同様、モーターB,Cでタイヤを動かしている

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2016a%2FMember%2FEtu%2FMission2&openfile=%A5%ED%A5%DC%CB%DC%C2%CE.JPG
*プログラムの説明 [#rdd5a4c5]

今回使用した定義はこれらである

 #define THRES1 38
 #define THRES2 43
 #define THRES3 53
 #define THRES4 59
 #define SPEED_H 30
 #define SPEED_L 15
 #define TIME_CROSS 230
 #define move_RL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
 #define STEP 1
 #define nMAX 300
 #define breaking Off(OUT_BC); Wait(500);

サブルーチンはこちら
 sub go_forward()
 {
 move_RL(SPEED_H,SPEED_H);
 }                             //直進
 sub turn_left_A()
 {
 move_RL(SPEED_L,0);
 }                             //左折
 sub turn_left_B()
 {
 move_RL(SPEED_L,-SPEED_L);
 }                             //左旋回
 sub turn_right_A()
 {
 move_RL(0, SPEED_L);
 }                             //右折
 sub turn_right_B()
 {
 move_RL(-SPEED_L,SPEED_L);
 }                              //右旋回
 sub cross_line()
 {
 move_RL(SPEED_H,SPEED_H);Wait(TIME_CROSS);breaking;
 }                             //交差点直進


 task main ()
 {
   SetSensorLight(S1);
   int n_black=0;
   int m_kousa=0;

下のプログラムはライントレースしつつ交差点に差し掛かると左折するプログラムである

僕のコースでは、c地点からはじまり、S交差点とP交差点で左折をするので

リピートを使って二回繰り返した
  repeat(2){
    while (n_black < nMAX) {
      if (SENSOR_1 < THRES1) {
           turn_left_B();
           n_black++;
      } else {
          if (SENSOR_1 < THRES2) {
             turn_left_A();
          } else if (SENSOR_1 < THRES3) {
             go_forward();
          } else if (SENSOR_1 < THRES4) {
             turn_right_A();
          } else {
             turn_right_B();
           }
           n_black=0;
      }
         Wait(STEP);
    }
      breaking;
      PlaySound(SOUND_DOWN);
      turn_left_B();
      Wait(1500);
      n_black=0;
  }
下のプログラムはライントレースしつつ交差点に差し掛かると直進するプログラムである

P交差点を左折したあと、Q交差点をぐるっと2回通りすぎるコースなので

ここでもリピートを使って2回繰り返した
  repeat(2) {
    while (n_black < nMAX) {
      if (SENSOR_1 < THRES1) {
         turn_left_B();
         n_black++;
      } else {
        if (SENSOR_1 < THRES2) {
           turn_left_A();
        } else if (SENSOR_1 < THRES3) {
           go_forward();
        } else if (SENSOR_1 < THRES4) {
           turn_right_A();
        } else {
           turn_right_B();
         }
         n_black=0;
      }
       Wait(STEP);
    }
    breaking;
    PlaySound(SOUND_DOUBLE_BEEP);
    cross_line();
    n_black=0;
  }

下のプログラムはライントレースしつつ交差点に差し掛かると右折するプログラムである

Q交差点を2回通りすぎたあと、R交差点を右折するコースなので、ここで使った

    while (n_black < nMAX) {
      if (SENSOR_1 < THRES1) {
         turn_left_B();
         n_black++;
      } else {
        if (SENSOR_1 < THRES2) {
           turn_left_A();
        } else if (SENSOR_1 < THRES3) {
           go_forward();
        } else if (SENSOR_1 < THRES4) {
           turn_right_A();
        } else {
           turn_right_B();
         }
         n_black=0;
      }
       Wait(STEP);
    }
    breaking;
    PlaySound(SOUND_DOWN);
    move_RL(0,20);
    Wait(1500);
    n_black=0;

下のプログラムは最初に使った、

ライントレースしつつ交差点に差し掛かると左折するプログラムである

R交差点を右折したあと、P交差点を左折するために使った

  while (n_black < nMAX) {
      if (SENSOR_1 < THRES1) {
         turn_left_B();
         n_black++;
      } else {
        if (SENSOR_1 < THRES2) {
           turn_left_A();
        } else if (SENSOR_1 < THRES3) {
           go_forward();
        } else if (SENSOR_1 < THRES4) {
           turn_right_A();
        } else {
           turn_right_B();
         }
         n_black=0;
      }
       Wait(STEP);
    }
    breaking;
    PlaySound(SOUND_DOUBLE_BEEP);
    turn_left_B();
    Wait(1500);
    n_black=0;

下のプログラムはこれも最初に使った

ライントレースしつつ交差点に差し掛かると直進するプログラムであるが

最後にA地点で止まるために1.8秒間直進するプログラムを組み込んだ

P交差点を左折したあとAの場所を交差点とみなし、

A地点で止まるために使った

    while (n_black < nMAX) {
      if (SENSOR_1 < THRES1) {
         turn_left_B();
         n_black++;
      } else {
        if (SENSOR_1 < THRES2) {
           turn_left_A();
        } else if (SENSOR_1 < THRES3) {
           go_forward();
        } else if (SENSOR_1 < THRES4) {
           turn_right_A();
        } else {
           turn_right_B();
         }
         n_black=0;
      }
       Wait(STEP);
    }
      breaking;
      go_forward();
      Wait(1800);
      Off(OUT_BC);
 }
*課題結果 [#h0c85155]

cコースをすべての交差点を認識しゴールまでたどり着くことはできた

が、成功率は五分五分といった感じだった

また少し時間がかかりすぎた

もっと早く進ませることができたかもしれない

さらに言うと、サブルーチンの関係でプログラム全体が長ったらしくなってしまった

ライントレースのサブルーチンをつくってやるともっと短く出来たかもしれない

タイムは2分32秒だった

*苦労した点 [#mc604dcd]

しきい値の調整に苦労した

また、交差点を認識させるのが難しく

特にR交差点→P交差点→A地点の時のP交差点の認識がうまくいかないことが多かったのと

Q交差点→R交差点→P交差点の時のR交差点は右折で、

今回のライントレースは先の左側をベースにしていたので

右折するとなると曲がる距離の関係でモーターの出力をすこし上げなければならなくて

その調整にも苦労した
21

*感想 [#mf5546d8]

今回は全体的にプログラムが長くなってしまった

交差点の認識などもむずかしく、友達と協力しながら出来たのはよかった。



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