課題について

2017a-mission2.png

今回の課題は図のようなコースを下の2つの経路のうちどちらかを選択しその経路を辿っていくというものであった。自分はE地点直進コースを選択した。

E地点直進コース

◦Aスタート

◦E直進

◦F(SOUND_UP)

◦Q一時停止(SOUND_DOWN)&左折

◦R直進(SOUND_UP)

◦S左折(SOUND_UP)

◦G(SOUND_UP)

◦H(SOUND_UP)

◦T一時停止(SOUND_DOWN)&直進

◦T一時停止(SOUND_DOWN)&直進

◦R一時停止(SOUND_DOWN)&左折

◦S直進(SOUND_UP)

◦P左折(SOUND_UP)

◦E一時停止(SOUND_DOWN)&左折

◦A停止(SOUND_DOWN)

E地点右折コース

E地点右折コース

◦E右折(SOUND_UP)

◦P一時停止(SOUND_DOWN)&左折

◦Q(SOUND_UP)&直進

◦R(SOUND_UP)&左折

◦T一時停止(SOUND_DOWN)&直進

◦T一時停止(SOUND_DOWN)&直進

◦H(SOUND_UP)

◦G(SOUND_UP)

◦S一時停止(SOUND_DOWN)&左折

◦P直進(SOUND_UP)

◦Q左折(SOUND_UP)

◦F(SOUND_UP)

◦E直進

◦A停止(SOUND_DOWN)

ロボットについて

ロボット全体

車体改.jpg

ロボット自体は説明書に載っている基本的な形の車体とした。また、右車輪をCへ、左車輪をBへと接続し、光センサーは1番へと接続した。

工夫した点

工夫改.jpg

急なカーブを曲がることが出来るように光センサーをできるだけ車体に近づけた。

プログラム

光センサーがとても黒い(39以下)と判断した場合、右車輪を後退し、左車輪を前進させ、左旋回する。同様に、少し黒い(45以下)と判断した場合、左折し、ちょうどよいくらいの灰色(52以下)だと判断した場合、直進し、少し白い(55以下)だと判断した場合、右折し、とても白い(55より大きい)と判断した場合右旋回する。これらの動作を繰り返すことにより線の左側をライントレース(run)する。(課題の図を見ればわかる通り、E地点直進コースは基本的に線の左端のみライントレースしていけば課題はクリアできる。)交差点はタイマーリセット(t0=CurrentTick)してから設定した時間(tmax=180)以上左折または左旋回を行った場合交差点だとみなすこととした。この180は色々と計測を繰り返した結果ちょうどよい(ちょうど90°くらい曲がる)と判断したものです。しかしこれではG地点からH地点にかけての半径4の急カーブも左折または左旋回を連続して続けるため交差点だとみなしてしまうので、そこは一度交差点だとみなしてからもう一度直線に戻るまで左折しもう一度ライントレースすることで解決した。(急カーブを曲がれるように光センサーを出来るだけ車体に近づけたがほとんど意味が無かった。)

定義

#define tmax 180
#define goS OnFwd(OUT_BC,100);//直進
#define turnL OnFwd(OUT_C,100);//左折
#define turnR OnFwd(OUT_B,100);//右折
#define spinL OnFwd(OUT_C,200);OnFwd(OUT_B,-200);//左旋回
#define spinR OnFwd(OUT_B,200);OnFwd(OUT_C,-200);//右旋回
#define run   while(CurrentTick()-t0<tmax){\
    if(SENSOR_1<=39){\
        spinR;\
        t0 = CurrentTick();\
         }else if(SENSOR_1<=45){\
        turnR;\
        t0 = CurrentTick();\
         }else if(SENSOR_1<=52){\
        goS;\
        t0 = CurrentTick();\
         }else if(SENSOR_1<=55){\
        turnL;\
         }else{\
        spinL;\
           }\
      }\
    Off(OUT_BC);
#define traverse Wait(1000);turnL;Wait(200);PlaySound(SOUND_DOWN);t0 = CurrentTick();//交差点
#define ignore turnR;Wait(200);PlaySound(SOUND_UP);Off(OUT_BC);t0 = CurrentTick();//T字路等を無視して直進
#define corner turnL;Wait(200);PlaySound(SOUND_UP);Off(OUT_BC);t0 = CurrentTick();//角
#define tightturn  spinL;Wait(350);Off(OUT_BC);turnL;Wait(300);//急カーブ
#define goal turnR;Wait(200);Off(OUT_BC);//ゴール

メインタスク

task main()
{
   SetSensorLight(S1);//光センサーを定義
   long t0 = CurrentTick();//時間を定義
   run;
   corner;//F地点
    run;
    traverse;//Q地点
    run;
    ignore;//R地点
    run;
    corner;//S地点
    run;
    corner;//G地点
    run;
    tightturn;
    run;
    corner;//H地点
    run;
    traverse;//T地点
    run;
    traverse;//T地点
    run;
    traverse;//R地点
    run;
    ignore;//S地点
    run;
    corner;//P地点
    run;
    corner;//E地点
    run;
    goal;//A地点
}

感想

前回と比べて自分で考えなければいけないことが多くなり、どのようにすればうまくいくかなどなかなか自分で考えることが出来ず、とても苦労した。具体的に言えば、T字路をどのようにして無視して直進すべきか、急カーブのところで、どうしても左折が続きタイマーリセットがされずに停止してしまうのをいかにすべきかということに悩まされた。次回はもっと柔軟な思考を出来るようにし、もっと早く完成させたい。また、たまにうまくいかないときがあるから、そういうところも分析できるようにしたい。


添付ファイル: file車体改.jpg 190件 [詳細] file工夫改.jpg 212件 [詳細] file車体.jpg 111件 [詳細] file工夫.jpg 92件 [詳細] file2017a-mission2.png 195件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-26 (水) 21:18:37