[[2017a/Member]]
~目次
#contents


*課題について [#zd83be0b]
詳しくは[[課題2>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2]]を参照。
**コース [#h2bfa239]
#ref(./コース.JPG,70%,コース概要)
[[E地点直進コース>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2#h3f8021b]]を選択した。
*ロボットの概要 [#c989ac2c]
#ref(./ロボット.JPG,ロボット概要)
上の写真のように、規定のサイズに収まるようにロボットを改造した。センサーが取り付けられている方が前方である。
**センサーの位置 [#d7362af9]
#ref(./下から.JPG,下から見た図)
上の写真はロボットをしたから撮影したものである。センサーはできるだけ車軸に近い位置に設置し、急なカーブでも安定して走行できるようにした。
*プログラム [#wa774f6a]
**定義,サブルーチン [#u92f8759]
 #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);
 }
**ライントレース [#s9d20a3b]
 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回連続で濃い黒を認識したら、その地点が交差点もしくは曲がり角であるとした。
**交差点、曲がり角での動作 [#q955c725]
      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でのカウントにより、各ポイントでの動作を分類し、すべての認識ポイントを通過した後、停止するようにした。
*感想 [#x7bfe45c]
交差点の判別を確実にしつつ、急カーブなどでの誤認識をしないようにしきい値や速度、nMAXの調節が特に難しかった。それさえクリアすれば、後は順番に動作を並べるだけだったので、前回の課題に比べれば短時間の作業で済んだ。また、本やテレビなどでライントレースするロボットは知っていたが、今回の課題で初めて、それがどのような仕組みで動いていたか理解することができ、楽しかった。

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