2017a/Member

目次

課題について

詳しくは課題2を参照。

コース

コース概要

E地点直進コースを選択した。

ロボットの概要

ロボット概要

上の写真のように、規定のサイズに収まるようにロボットを改造した。センサーが取り付けられている方が前方である。

センサーの位置

下から見た図

上の写真はロボットをしたから撮影したものである。センサーはできるだけ車軸に近い位置に設置し、急なカーブでも安定して走行できるようにした。

プログラム

定義,サブルーチン

#define THRESHOLD 50   //しきい値
#define SPEED 28
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define go_forward  OnRL(SPEED, SPEED);
#define go_back OnRL(-SPEED,-SPEED);
#define turn_left1  OnRL(SPEED, -SPEED);    //左旋回
#define turn_left0  OnRL(SPEED, 0);    //左折
#define turn_right0 OnRL(0, SPEED);    //右折
#define turn_right1 OnRL(-SPEED, SPEED);    //右旋回
#define STEP 1
#define nMAX 180 //黒を認識する上限回数

sub cLeft1() //(SOUND_UP)&左旋回
{
    PlaySound(SOUND_UP);
    turn_left1;
    until(SENSOR_3 > THRESHOLD+12);
}

sub cLeft2() //(SOUND_DOWN)&一時停止&左回転
{
    PlaySound(SOUND_DOWN);
    Off(OUT_BC);
    Wait(1000);
    turn_left0;
    until(SENSOR_3 > THRESHOLD+12);
}

sub straight() //方向修正&直進
{
    turn_right1;
    Wait(600);
    Off(OUT_BC);
    go_forward;
    Wait(500);
    Off(OUT_BC);
}

ライントレース

task main()
{
    SetSensorLight(S3);
    int nOnline=0; // 続けて黒になった回数
    int nTurn=0;
    go_forward; // Aスタート,E1
    Wait(500);
    Off(OUT_BC);
    while (nTurn < 13) {
     while (nOnline < nMAX) {
      if (SENSOR_3 < THRESHOLD-10) {   //濃い黒
       turn_left1;
       nOnline++;  // カウンタを増やす
      } 
      else {
       if (SENSOR_3 < THRESHOLD-5) {   //黒寄りの灰色
        turn_left0;
        }
       else if (SENSOR_3 < THRESHOLD+5) {   //灰色
        go_forward;
        }
       else if (SENSOR_3 < THRESHOLD+10) {   //白寄りの灰色
        turn_right0;
        }
       else {   //白色
        turn_right1;
        }
       nOnline=0;   //カウントをリセット
      }
      Wait(STEP);
     }

『E地点直進コース』では終始左側走行でも交差点認識が可能だったので、黒なら左方に、白なら右方に方向転換し、常にラインの左際を走行するようにした。また、nMAX回連続で濃い黒を認識したら、その地点が交差点もしくは曲がり角であるとした。

交差点、曲がり角での動作

     if(nTurn < 1){    //F
      cLeft1();
      nTurn++;
      nOnline=0;
     }
     else if(nTurn < 2){    //Q
      cLeft2();
      nTurn++;
      nOnline=0;
     }
     else if(nTurn < 3){    //R1
      PlaySound(SOUND_UP);
      straight();
      nTurn++;
      nOnline=0;
     }
     else if(nTurn < 6){    //S1,G,H
      cLeft1();
      nTurn++;
      nOnline=0;
     }
     else if(nTurn < 8){    //T1,T2
      PlaySound(SOUND_DOWN);
      Off(OUT_BC);
      Wait(1000);
      straight();
      nTurn++;
      nOnline=0;
     }
     else if(nTurn < 9){    //R2
      cLeft2();
      nTurn++;
      nOnline=0;
     }
     else if(nTurn < 10){    //S2
      PlaySound(SOUND_UP);
      straight();
      nTurn++;
      nOnline=0;
     }
     else if(nTurn < 11){    //P
      cLeft1();
      nTurn++;
      nOnline=0;
     }
     else if(nTurn < 12){    //E2
      cLeft2();
      nTurn++;
      nOnline=0;
     }
     else if(nTurn < 13){    //A停止
      Off(OUT_BC);
      turn_right1;
      Wait(300);
      Off(OUT_BC);
      go_forward;
      Wait(2000);
      Off(OUT_BC);
      PlaySound(SOUND_DOWN);
      nTurn++;
    }
  }
}

交差点と曲がり角を通過する回数と順番は分かっているので、nTurnでのカウントにより、各ポイントでの動作を分類し、すべての認識ポイントを通過した後、停止するようにした。

感想

交差点の判別を確実にしつつ、急カーブなどでの誤認識をしないようにしきい値や速度、nMAXの調節が特に難しかった。それさえクリアすれば、後は順番に動作を並べるだけだったので、前回の課題に比べれば短時間の作業で済んだ。また、本やテレビなどでライントレースするロボットは知っていたが、今回の課題で初めて、それがどのような仕組みで動いていたか理解することができ、楽しかった。


添付ファイル: fileコース.JPG 119件 [詳細] file下から.JPG 187件 [詳細] fileロボット.JPG 195件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-14 (月) 00:38:59