2016a/Member

目次

課題2

詳しい説明ページ2016a/Mission2

 

今回は、ライントレースをするために下にあるコースの作成から始まった。コースの完成度は他の班に勝るぐらい正確に作られた自信がある。
黒線の幅は20mmでライントレースをさせる。コースは全部で3種類、班員3人でそれぞれ担当した。
私は、「A地点からB地点まで」のコースを担当した。

 
制作したコース

 (Fig.1 制作したコース)

A地点からB地点へ

A地点スタート➡P直進(交差点)➡Q直進(交差点)➡Q直進(交差点)➡R左折(交差点)➡B地点ゴール

A➡Bコース図

 (Fig.2 A➡Bコース図)

ロボット概要

今回、ロボット制作に時間を取られることはなかった。

正面

ロボット前方中心に光センサーを装着。

ロボット正面

 (Fig.3 ロボット正面)

側面

ロボット側面

 (Fig.4 ロボット側面)

裏側

赤枠に囲われた所が、今回ライントレースを行うために必要な光センサーである。

ロボット裏側

 (Fig.5 ロボット裏側)

ライントレース概要

ライントレースをするために、黒線左側を走らせることにした。
私が担当したA➡Bコースは、交差点で直進と左折だけをする。よって、交差点を右折することがないので説明を省略する。

直線

(1)センサーが黒と判断したとき、左旋回または左折をして方向維持。

 

(2)センサーが白と判断したとき、右旋回または右折をして方向維持。

 

(3)センサーが薄黒と判断したとき、直進して進む。

 

(1)〜(3)を繰り返して直線を進む。

直線のライントレース

 (Fig.6 直線のライントレース)

交差点(直進)

センサーが交差点と判断したとき(車体が大きく傾くことなく交差点と判断できる)、黒線1本分直進させる。
その後、ライントレースで進む。

交差点を直進

 (Fig.7 交差点を直進)

交差点(左折)

センサーが交差点と判断したとき、車体を左旋回させ左の黒線の左側の白部分までセンサーを移動させる。
その後、ライントレースで進むと左折ができる。

交差点を左折

 (Fig.8 交差点を左折)

プログラム概要

定義

定義する閾値は4つ。これにより細かい動作により動きに無駄をなくせる。また、今回は測定した値をそのまま定義にした。

#define THRES1 39    //閾値1(黒、黒線中央)
#define THRES2 43    //閾値2(黒に近い黒、黒線中央から少し外側)
#define THRES3 53    //閾値3(薄黒、黒線中央と境界の中間)
#define THRES4 59    //閾値4(白に近い黒、黒線境界から少し内側)

スピードは、2種類。速いとセンサーの判断が鈍くなったり曲がるとき雑になるのを防ぐことができる。

#define SPEED_H 40         //速いスピード
#define SPEED_L 17         //遅いスピード

交差点を直進するときの動作時間。

#define TIME_CROSS 230   //交差点を渡る時の時間

大切な定義。1回の判断で進む時間。nMAXとは、ある同じ動作でSTEPを280回分することで交差点と判断させる基準である。

#define STEP 1        //1回の判定で進む時間
#define nMAX 280    //交差点での黒の判定基準

サブルーチンで使う基本動作を変数で定義。

#define move_RL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);    //基本動作

交差点で動作するとき1回止まる。

#define short_break 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 go_crossline()            //交差点を渡る
{
  move_RL(SPEED_H,SPEED_H);
  Wait(TIME_CROSS);short_break;
}

sub left_crossline()          //交差点を左折
{
  move_RL(SPEED_L,-SPEED_L);
  Wait(1400);short_break;
}

メインプログラム

注:交差点は4回しかないが、最後B地点に入るときのT字路も同じく交差点と判断させるので合計5回の交差点判断を行っている。

B地点へ入る

 (Fig.9 B地点へ入る)

 

以下、プログラム
プログラムは、交差点の判定を5回行うまで動き続けます。

task main ()
{
  SetSensorLight(S1);
  int n_black=0;            //黒をカウント
  int m_kousa=0;            //交差点をカウント


  while(m_kousa < 5) {                 //交差点が5回目未満の間
    while (n_black < nMAX) {             //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;                        //n_black(黒)をリセットして
      }
       Wait(STEP);          //上記の動作を、STEP(1回)ずつ行う。
    }

ここまでで、センサーがn_blackの(黒である)回数がnMAXに達し交差点と判断するまでライントレースを行うことができる。

 

交差点と判断した後、交差点の数をカウントしながら交差点での動きが書かれている。
簡単に示すと、
交差点3回目までは交差点を直進➡交差点4回目では左折➡B地点へ入る(5回目)➡5回目より以降プログラムは終了する

      if (m_kousa < 3) {              //もし交差点が3回目まで交差点を直進
        short_break;
        PlaySound(SOUND_DOUBLE_BEEP);   //直進の合図
        go_crossline();
         m_kousa++;         //交差点をカウント
         n_black=0;         //n_blackを0に戻すことでライントレースに戻る。
      } else if (m_kousa < 4) {      //交差点が4回目のとき交差点を左折
         short_break;
         PlaySound(SOUND_DOWN);   //左折の合図
         turn_left_B();
         Wait(1100);
          m_kousa++;
          n_black=0;
      } else {                 //B地点前T字を交差点5回目として直進しB地点へ入る
         short_break;
         go_forward();
         Wait(1500);
         Off(OUT_BC);
          m_kousa++;          //m_kousa(交差点)=5回目となり、While(m_kousa<5)から抜け出す。
          PlaySound(SOUND_FAST_UP);       //終了の合図
      }
  }
}

全体

ここに、全体のプログラムを載せておく。これをコピーして試してもらっても構わない。
しかし、他のコースでは閾値などが異なる可能性があるので注意してもらいたい。

#define THRES1 39    //閾値1(黒、黒線中央)
#define THRES2 43    //閾値2(黒に近い黒、黒線中央から少し外側)
#define THRES3 53    //閾値3(薄黒、黒線中央と境界の中間)
#define THRES4 59    //閾値4(白に近い黒、黒線境界から少し内側)
#define SPEED_H 40         //速いスピード
#define SPEED_L 17         //遅いスピード
#define TIME_CROSS 230   //交差点を渡る時の時間
#define STEP 1        //1回の判定で進む時間
#define nMAX 280    //交差点での黒の判定基準
#define move_RL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);    //基本動作
#define short_break 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 go_crossline()            //交差点を渡る
{
  move_RL(SPEED_H,SPEED_H);
  Wait(TIME_CROSS);short_break;
}

sub left_crossline()          //交差点を左折
{
  move_RL(SPEED_L,-SPEED_L);
  Wait(1400);short_break;
}



task main ()
{
  SetSensorLight(S1);
  int n_black=0;            //黒をカウント
  int m_kousa=0;            //交差点をカウント


  while(m_kousa < 5) {                 //交差点が5回目未満の間
    while (n_black < nMAX) {             //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;                        //n_black(黒)をリセットして
      }
       Wait(STEP);          //上記の動作を、STEP(1回)ずつ行う。
    }
      if (m_kousa < 3) {              //もし交差点が3回目まで交差点を直進
        short_break;
        PlaySound(SOUND_DOUBLE_BEEP);   //直進の合図
        go_crossline();
         m_kousa++;         //交差点をカウント
         n_black=0;         //n_blackを0に戻すことでライントレースに戻る。
      } else if (m_kousa < 4) {      //交差点が4回目のとき交差点を左折
         short_break;
         PlaySound(SOUND_DOWN);   //左折の合図
         turn_left_B();
         Wait(1100);
          m_kousa++;
          n_black=0;
      } else {                 //B地点前T字を交差点5回目として直進しB地点へ入る
         short_break;
         go_forward();
         Wait(1500);
         Off(OUT_BC);
          m_kousa++;          //m_kousa(交差点)=5回目となり、While(m_kousa<5)から抜け出す。
          PlaySound(SOUND_FAST_UP);       //終了の合図
      }
  }
}

結果

正確にライントレースをすることができ、交差点もすべて判定し動かすことができた。
特に直線で、必ずロボットが直進だけをすることができ時間短縮につながった。これは、図を正確に描いたおかげでもあると思う。

タイム

54.33秒

感想&反省

今回、課題通りに目的を達成することができてよかった。
プログラムも同じことを書くことがなく、論理的に順序良く組み立てることができたと思う。
ただ、サブルーチンでライントレースの動きを作っればメインプログラムをもっと簡単なものにできたと思う。今回は、一つ一つの動作をサブルーチンにして挑戦していたために改めてライントレース用のサブルーチンを作ることに時間を割かなっかた。
次の課題も、うまく班員とクリアしていきたい。


添付ファイル: fileゴール1.png 127件 [詳細] file左折.jpg 163件 [詳細] file直進.png 136件 [詳細] fileライントレース1.png 146件 [詳細] file裏1.jpg 124件 [詳細] fileコース.png 132件 [詳細] fileAコース経路.jpg 142件 [詳細] file正面1.jpg 126件 [詳細] file横1.jpg 135件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-07-15 (金) 09:22:27