課題

画像の赤線のコースを通って動くロボットを作成する。

2019b-mission2a.png

1 A地点から出発
2 J
3 H (直進)
4 I (ボール or キューボイドをつかんでUターン)
5 H (右折)
6 G (一時停止の後、直進)
7 D (右折)
8 E, F 通過
9 G (一時停止の後、直進)
10 C (一時停止の後、左折)
11 B (一時停止)
12 A地点に入る(ゴール)

作成したロボット

robo2a.JPG

光センサーはライントレースに用いられる。超音波センサーでボールを探す。シンプルな機構にするのを心がけた。

作成したプログラムについて

  • ライントレース
    • 光センサー 上記の通り、光センサーを用いて、黒い線をトレースする。
#define turn_l2 OnFwd(OUT_B,30);OnFwd(OUT_C,-30); /左に旋回
#define turn_l1 OnFwd(OUT_B,30); /左に回転
#define go_fwd OnFwd(OUT_BC,30); /直進
#define turn_r1 OnFwd(OUT_C,30); /右に曲がる
#define turn_r2 OnFwd(OUT_B,-30);OnFwd(OUT_C,30); /右に旋回

あらかじめこのようにマクロを作った。次にしきい値を自分で設定し、if構文を用いて、センサーで判定した明るさをもとにロボットの進路を決める。このようにしてロボットが黒線(今回私は線の左側とした)をトレースする。 しきい値は以下のように設定した。

スクリーンショット.png
  • 交差点の判定 交差点は、センサーが黒色を感知し続ける時間の長さで判断する。今回私は、センサーの値が32以下である時間がt=150経過したら、そこを交差点であると判断するようにした。 以上2つを総括したサブルーチン void follow_line は以下のようになる。
void follow_line(long tmin=0, long tmax=10000)
SetSensorLight(S3);
long t0=CurrentTick();
while(CurrentTick()-t0<150){
if(SENSOR_3<32){
turn_l2;
}else if(SENSOR_3<36){
turn_l1; t0=CurrentTick();
}else if(SENSOR_3<40){
go_fwd; t0=CurrentTick();
}else if(SENSOR_3<48){
turn_r1; t0=CurrentTick();
}else{
turn_r2;t0=CurrentTick();
}
}
Off(OUT_BC);

また、交差点で一時停止したのち直進/左折するサブルーチンも作った。

  • 一時停止から直進
    void teishi_fwd (int t)
    {
        Off(OUT_BC);
        Wait(1500);
        go_fwd;
        Wait(t);
        Off(OUT_BC);
    }
  • 一時停止から左折
    void teishi_left(int t)
    {
        Off(OUT_BC);
        Wait(1500);
        turn_l1;
        Wait(t);
        Off(OUT_BC);
    }
  • ボールを探し捕まえる
    ライントレースの動きをしながら、超音波センサーでボールを発見したときには、ボールをキャッチしてUターンの動きに入るのを理想とした。
void fetch_ball (long tmax=3000)
{
SetSensorLowspeed(S2);
while(SensorUS(S2)>=10){
go_fwd;
}
Off(OUT_BC);
Wait(1000);
RotateMotor(OUT_A,30,-60);
OnRev(OUT_BC,70); Wait(500);OnFwd(OUT_C,70); Wait(1000); Off(OUT_BC);
go_fwd;
Wait(1000);
}

  • プログラム全体
task main()
{
go_fwd
Wait(500);/AからJ
follow_line();/JからH
go_fwd
Wait(400);/HからI
fetch_ball();/ボールをキャッチしてuターン
follow_line();/IからH
turn_r1;/Hで右折
follow_line();/HからG
teishi_fwd;/Gで一時停止、のちに直進
follow_line;/GからD
turn_r1;/Dで右折
follow_line;/EからF、FからG
teishi_left;/Cで一時停止、のちに左折
follow_line;/CからB
teishi_fwd;/Bで停止、のちに直進
follow_line;/BからAに
}

*感想 結果うまくはいかなかった。ほかのグループが、黒線の左側と右側、それぞれをたどるプログラムを組んでいたので、そこの差が表れたのかなと思う。次の課題も頑張りたい。


添付ファイル: fileスクリーンショット.png 6件 [詳細] filerobo2a.JPG 3件 [詳細] file2019b-mission2a.png 14件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-01-10 (金) 00:00:18