#author("2020-01-09T22:52:18+09:00","Takehiko","Takehiko")
#author("2020-01-10T00:00:18+09:00","Takehiko","Takehiko")
*課題 [#o9c745d8]

画像の赤線のコースを通って動くロボットを作成する。
#ref(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地点に入る(ゴール)~

*作成したロボット [#s6370ea3]
#ref(robo2a.JPG)

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

*作成したプログラムについて [#l046dc74]


-ライントレース
--光センサー
上記の通り、光センサーを用いて、黒い線をトレースする。~


 #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構文を用いて、センサーで判定した明るさをもとにロボットの進路を決める。このようにしてロボットが黒線(今回私は線の左側とした)をトレースする。
しきい値は以下のように設定した。
#ref(スクリーンショット.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に




 }


}


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

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