2019b/Member/Takehiko/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
*課題 [#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に
}
*感想
結果うまくはいかなかった。ほかのグループが、黒線の左側と右側、それぞれをたどるプログラムを組んでいたので、そこの差が表れたのかなと思う。次の課題も頑張りたい。
終了行:
*課題 [#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に
}
*感想
結果うまくはいかなかった。ほかのグループが、黒線の左側と右側、それぞれをたどるプログラムを組んでいたので、そこの差が表れたのかなと思う。次の課題も頑張りたい。
ページ名: