*メンバー紹介 [#f73dc71c]
-花岡佳太 工学部機械システム工学科 
-市川大騎 繊維学部機械ロボット学系 

*課題 [#icc3e4e6]

[目標]

-ライントレースをしてゴールを目指す。
-コースの途中にある空き缶を掴み目標の位置に運ぶ。

[図]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2013a%2FMission1&src=robotics-2013a-mission1.jpg


*ロボット紹介 [#of9c4bdd]

-極力使うパーツを減らして、ライントレースの際の光センサーの支障にならないようにしました。
-歯車を利用してモーターの回転方法を変更しました。最初はモーターを横にして使っていたが、縦方向で使うことで、アームを取り付けやすくなった。※写真1.2

&ref(2013a/Member/free/Mission1/3.JPG,480×640,写真1);

-アーム部分は缶に合うように設計したが、ライントレースの最中に缶を離してしまったり、少しでも缶との距離が合わないと上手く挟めないという事態になってしまったので、アームを二本にするなどの工夫が必要だった。

&ref(2013a/Member/free/Mission1/2.JPG,640×480,写真2);

*プログラムの概要(反時計周り) [#v9ba94d7]

.好拭璽箸ら7.5秒後、アームを閉じて缶を掴む。

△修里泙泪薀ぅ鵐肇譟璽垢鮃圓ぁ26秒後トレースする位置の変更

36秒後再び位置の変更

い發55秒後以降に交差点にぶつかった場合、向きを180度回転した後缶を置く。

ゥ薀ぅ鵐肇譟璽垢砲茲螢粥璽襪惴かう。

*プログラム [#t51bb992]

 #define white1 39
 #define white2 45
 #define black1 60
 #define black2 65
 #define go_forward OnFwd(OUT_BC,40)
 #define turn_left2 OnFwd(OUT_C,40);Off(OUT_B)
 #define turn_left1 OnFwd(OUT_C,40);OnRev(OUT_B,30)
 #define turn_right2 OnFwd(OUT_B,40);Off(OUT_C)
 #define turn_right1 OnFwd(OUT_B,40);OnRev(OUT_C,20)
 #define STEP 1
 #define nMAX 180
 #define short_break Off(OUT_BC);Wait(1000);


 task main ()
 {
    SetSensorLight(S3);
    int nOnline=0;
    long t0 = CurrentTick();
    int n=0;

    while (CurrentTick()-t0 <= 7500) {
    while (CurrentTick()-t0 <= 7500) {  /スタートから7.5秒までライントレース

        if (SENSOR_3 < white1) {
            turn_left1;
        } else if (SENSOR_3 < white2) {
            turn_left2;
        } else if (SENSOR_3 < black1) {
            go_forward;
        } else if (SENSOR_3 < black2) {
            turn_right2;
        } else {
            turn_right1;
        }
       Wait(STEP);
    }
       OnFwd(OUT_A,50);Wait(800);Off(OUT_A);
       OnFwd(OUT_A,50);Wait(800);Off(OUT_A); / 7.5秒に達したらアームで缶を掴む



    while (CurrentTick()-t0 <= 26000) {
    while (CurrentTick()-t0 <= 26000) {  / スタートから26秒になるまで再びライントレース

        while(nOnline < nMAX && CurrentTick()-t0 <= 26000) {
            if (SENSOR_3 < white1) {
            turn_left1;
            nOnline++;
      } else {
          if (SENSOR_3 < white2) {
            turn_left2;
        } else if (SENSOR_3 < black1) {
            go_forward;
        } else if (SENSOR_3 < black2) {
            turn_right2;
        } else {
            turn_right1;
          }
        nOnline=0;
        }
       Wait(STEP);
    }
    turn_right2;Wait(nMAX*STEP);
    OnFwd(OUT_BC,30);Wait(200);
    nOnline=0;
    OnFwd(OUT_BC,30);Wait(200);  / 0.2秒だけ前進する事によりトレースする線の左右の反転(※)
    nOnline=0;   / カウンターのリセット
  }turn_right1;Wait(100);


    while (CurrentTick()-t0 <= 36000) {
&ref(2013a/Member/free/Mission1/6.jpg,819×460,写真3);

        while(nOnline < nMAX && CurrentTick()-t0 <= 36000) {
 (※)について
 上の図は黄色の線がロボットの軌跡である。
 上のプログラムでは赤い丸で囲まれた辺りに来た時に斜めに前進させることによって
 線の右側を通っていたロボットを線の左側に移動させる。
 そうする事で交差点を渡る際に鋭角な交差点を通る事ができる。
 また、赤丸が2つあるのは、この後のプログラムにもこの動作が行われるからである。
 その箇所を(※2)とする

    while (CurrentTick()-t0 <= 36000) { / スタートから36秒後までライントレース

        while(nOnline < nMAX && CurrentTick()-t0 <= 36000) { /36秒経った場合次のプログラムに移る
            if (SENSOR_3 < white1) {
            turn_right1;
            nOnline++;
      } else {
          if (SENSOR_3 < white2) {
            turn_right2;
        } else if (SENSOR_3 < black1) {
            go_forward;
        } else if (SENSOR_3 < black2) {
            turn_left2;
        } else {
            turn_left1;
          }
        nOnline=0;
        }
       Wait(STEP);
    }
    turn_left2;Wait(nMAX*STEP);
    OnFwd(OUT_BC,30);Wait(200);
    OnFwd(OUT_BC,30);Wait(200); /前進させることによりトレースする線の反転(※2)
    nOnline=0;
  }turn_left1;Wait(200);


    while (CurrentTick()-t0 <= 55000) {

        while(nOnline < nMAX && CurrentTick()-t0 <= 55000) {
            if (SENSOR_3 < white1) {
            turn_left1;
            nOnline++;
      } else {
          if (SENSOR_3 < white2) {
            turn_left2;
        } else if (SENSOR_3 < black1) {
            go_forward;
        } else if (SENSOR_3 < black2) {
            turn_right2;
        } else {
            turn_right1;
          }
        nOnline=0;
        }
       Wait(STEP);
    }
    turn_right2;Wait(nMAX*STEP);
    OnFwd(OUT_BC,30);Wait(200);
    nOnline=0;
  }


    while (n<2) {

        while(nOnline < nMAX && n<2) {
        while(nOnline < nMAX && n<2) { /もし2回目の交差点を感知した場合後ろに下がる動作を行う
            if (SENSOR_3 < white1) {
            turn_left1;
            nOnline++;
      } else {
          if (SENSOR_3 < white2) {
            turn_left2;
        } else if (SENSOR_3 < black1) {
            go_forward;
        } else if (SENSOR_3 < black2) {
            turn_right2;
        } else {
            turn_right1;
          }
        nOnline=0;
        }
       Wait(STEP);
    }
    turn_right2;Wait(nMAX*STEP);
    OnRev(OUT_BC,30);Wait(200);
    OnRev(OUT_BC,30);Wait(200); /後ろに下がる
    nOnline=0;n++;
  }
    OnRev(OUT_BC,50);Wait(500);OnFwd(OUT_C,50);OnRev(OUT_B,50);Wait(300);
    OnFwd(OUT_C,50);OnRev(OUT_B,50);until(SENSOR_3 < 50);
    long t1 = CurrentTick();
    OnFwd(OUT_C,50);OnRev(OUT_B,50);until(SENSOR_3 < 50);  / 上の2行によってロボットはUターンする
    long t1 = CurrentTick(); / &#12959;ここからt0からt1のタイマーに切り替え

      while (CurrentTick()-t1 <= 1800) {

        if (SENSOR_3 < white1) {
            turn_right1;
        } else if (SENSOR_3 < white2) {
            turn_right2;
        } else if (SENSOR_3 < black1) {
            go_forward;
        } else if (SENSOR_3 < black2) {
            turn_left2;
        } else {
            turn_left1;
        }
       Wait(STEP);
    }
    turn_left1;Wait(270);Off(OUT_BC);OnRev(OUT_A,50);Wait(300);Off(OUT_A);
    OnRev(OUT_BC,50);Wait(600);OnFwd(OUT_B,50);OnRev(OUT_C,50);Wait(300);
    OnFwd(OUT_B,50);OnRev(OUT_C,50);until(SENSOR_3 < 50);
    long t2 = CurrentTick();
    long t2 = CurrentTick();  / 上の3行のプログラムによってUターンをしたロボットが定位置まで進み缶を置いてuターンする
                / &#12959;ここからはt1からt2にタイマーを変更

        while (CurrentTick()-t2 <= 3900) {

        if (SENSOR_3 < white1) 
 {
            turn_left1;
        } else if (SENSOR_3 < white2) {
            turn_left2;
        } else if (SENSOR_3 < black1) {
            go_forward;
        } else if (SENSOR_3 < black2) {
            turn_right2;
        } else {
            turn_right1;
        }
       Wait(STEP);
    }
    Off(OUT_BC);
    Off(OUT_BC); /ゴールしたためプログラムの終了
 }

*感想 [#o11c00ca]

・今回の課題を通じて、最初は上手くライントレースしなかったため、パワーを落として動かすことで正確なトレースができるようになった。

・発表の際には、今まで上手くいっていたのに、本番では急に失敗してしまい、タイマーでの操作の難しさを実感した。

・交差点での失敗が多かったため、もう少し改良すべきであった。



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