[[2015a/Member]]
*はじめに [#x9eca22c]
今回の課題は、交差点を識別させることができず、思い通りにロボットを動かせませんでした。
今回の課題は、課題の最後までロボットを動かせませんでした。

*課題について [#df440be5]
下の図のようなコースを各チームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
#ref(./2015a-mission2.png,50%)

私はC→Aの担当をした。
*ロボットについて [#k6511b96]


*プログラム [#t129c874]
**マクロ [#p8f3a693]
 #define hikari 50   //光センサー基準値
 #define SPEED1 55  
 #define SPEED 25
 
 #define turn_left OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);  //左に旋回
 #define TURN_LEFT OnFwd(OUT_B,SPEED);              //左折
 #define go_forward OnFwd(OUT_BC,SPEED1);            //進む
 #define turn_right OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED);  //右に旋回
 #define TURN_RIGHT OnFwd(OUT_C,SPEED);                     //右折
 #define armdown  OnFwd(OUT_A,50);Wait(500);Off(OUT_A);Wait(300);  //アームを降ろす
 #define downtime 10000
 #define THRESHOLD 45
 #define SPEED_H 30
 #define SPEED_L 25
 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
 
 #define STEP 2
 #define go_forward  OnRL(SPEED_H, SPEED_H);
 #define turn_left1  OnRL(SPEED_L, -SPEED_L);  // 左旋回
 #define turn_left0  OnRL(SPEED_L, 0);         // 左折
 #define turn_right0 OnRL(0, SPEED_L);         // 右折
 #define turn_right1 OnRL(-SPEED_L, SPEED_L);  // 右旋回
 #define STEP 1  // 1回の判断で動作させる時間
 #define nMAX 200  // 通常のカーブとして許容できる繰り返しの最大値 (調整する)
 #define short_break Off(OUT_BC); Wait(1000); // 小休止
 #define CROSS_TIME 100  // 交差点通過にかかる時間
 /* 交差点を渡る */
 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
 #define armdown  OnFwd(OUT_A,50);Wait(500);Off(OUT_A);Wait(300);  //アームを降ろす

**線をたどる [#h9820417]
 task main(){
 task main()
 {
   SetSensorLight(S3);
   int nOnline=0; // 続けて黒になった回数 (カウンタ) 
 
    SetSensorLight(S3);
 
    while(true){
 
     if(SENSOR_3<hikari -7){
      turn_left;
     }else{
       if(SENSOR_3<hikari -3){
         TURN_LEFT;
       }else if(SENSOR_3<hikari +3){
         go_forward;
       }else if(SENSOR_3<hikari +10){
         TURN_RIGHT;
       }else{
         turn_right;
        }
   while (true) {
     /* 黒を続けてnMAX回繰り返さない間、通常のライントレースをする */
     while (nOnline < nMAX) {
       if (SENSOR_3 < THRESHOLD-15){
         turn_left1;
         nOnline++;  // カウンタを増やす
       } else {
         if (SENSOR_3 < THRESHOLD-7){
           turn_left0;
         } else if (SENSOR_3 < THRESHOLD+7){
           go_forward;
         } else if (SENSOR_3 < THRESHOLD+15){
           turn_right0;
         } else {
           turn_right1;
         }
         nOnline=0;  // カウンタをリセット
       }
       Wait(STEP);
     }
    }
     short_break; // 小休憩
     turn_right1; Wait(nMAX*STEP);  // 進行方向修正
     cross_line;  // 交差点を渡る
     nOnline=0; //カウンタをリセット
   }
 }

**交差点 [#pd6bdf7f]
 sub cross_line(long t)
 {
  int b=0;
  while(b<CROSS_TIME)
    {
     OnRL(SPEED,SPEED);
     Wait(STEP);
     if(CurrentTick()-t<=downtime+1.0 && downtime<=CurrentTick()-t)
       {
      armdown;
       }
     b++;
    }
 }
*まとめ・反省 [#le0f139d]
まず、どのプログラムがどのような指示をしているのかを完全に理解できませんでした。そのため、交差点の識別やタイマー・カウンターの使用ができませんでした。
 まず、どのプログラムがどのような指示をしているのかを理解するのに時間がかかり、最後までうまくいきませんでした。交差点は何とか渡れるようになりましたが、次の段階のボールをつかみ、運んでシュートするところまではできませんでした。くわしくいうと、ボールをつかむプログラム自体はできたのですが、プログラムにうまく盛り込めませんでした。
 次回の課題はこの課題2の延長のようなので、それまでに理解できるところまではせめて理解しようと思います。

次回の課題はこの課題2の延長のようなので、それまでに理解できるところまではせめて理解しようと思います。



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