- 追加された行はこの色です。
- 削除された行はこの色です。
[[2019a/Member]]
#define t_r OnFwd(OUT_A);OnRev(OUT_C);Wait(60);Off(OUT_AC);ClearTimer(0);
int s;
sub follow_line_left()
{
#contents
*課題 [#z632fddf]
課題については[[2019a/Mission2]]を参照。
私はAを出発しMでシュートをする方のプログラミングを試みた。
*ロボットについて [#xe9271e7]
#ref(2019a/Member/mistral/Mission2/20190719_161618.jpg,20%,コース);
アームでボールを包み込むように運び、最後はアームを開くようにモーターを動かすことで蹴り出すようにした。
#ref(2019a/Member/mistral/Mission2/20190719_161625.jpg,20%,コース);
コースが狭いのでなるべく小型になるようにした。センサーの近くにアームをつけると影になってしまい、光の当たり方でロボットの動きが大きく変わってしまうので前方にセンサー、後方にアームと前後に分けて付けることにした。
*進み方とプログラミング [#m29cea3d]
**コースと進み方 [#d3cf433c]
#ref(2019a/Member/mistral/Mission2/2019a-mission2.png,70%,コース);
AからDまでは線の左側をトレース
**トレースについて [#i30dbfce]
***基本のトレース [#e5a8f494]
光センサーを使って線の境界をトレースするために、光センサーで値の検出を行った。下の画像は左の境界を表している。
#ref(2019a/Member/mistral/Mission2/トレース (2).png,70%,コース);
センサーが示す値が、~
〜33の時 左回転 → 左モーター後退 右モーター前進~
34、35の時 → 左モーター停止 右モーター前進~
36〜39の時 前進 → 左モーター前進 右モーター前進~
40、41の時 → 左モーター前進 右モーター停止~
42〜の時 右回転 → 左モーター前進 右モーター後退~
右側の境界をトレースする場合は、モーターの動きを反転させる。
***交差点のトレース [#l3cdcc51]
交差点の判断はファストタイマーを使い、黒の線上にいる時間で判断することにした。
#ref(2019a/Member/mistral/Mission2/直線 (2).png,70%,コース);
#ref(2019a/Member/mistral/Mission2/交差 (2).png,70%,コース);
黒の上にセンサーが来たときのセンサーの動きである。絵のように交差の場合、黒の上にセンサーがある時間が長い。この時間で交差点を判断する。
#ref(2019a/Member/mistral/Mission2/丸い交差 (2).png,70%,コース);
Gのような丸い交差点では通常の交差点より黒の上にセンサーがある時間が短い。しかし、丸い交差点に時間を合わせてしまうと、通常のトレースに影響が出てしまうことがあるので、グローバル変数を用いて時間を変えられるようにした。直角の交差点では0.22から0.24秒、丸い交差点では0.18秒で今回は設定した。
**プログラミング [#ze0538ab]
はじめに、defineを用い、右折を定義した。
#define t_r OnFwd(OUT_A);OnRev(OUT_C);Wait(60);Off(OUT_AC);ClearTimer(0);//90度 右折
直角の交差点と丸みのある交差点でのファストタイマーの時間を変えるためのグローバル変数を定義する。
int s; //グローバル変数
線の左右の境界をトレースする2種類のサブルーチンと停止後の直進のサブルーチンを定義する。
sub follow_line_left() //線の左側のトレース
{
while(FastTimer(0)<s)
{
if(SENSOR_2>42){OnFwd(OUT_A);OnRev(OUT_C);ClearTimer(0);}
else if(SENSOR_2>40){OnFwd(OUT_A);ClearTimer(0);}
else if(SENSOR_2>36){OnFwd(OUT_AC);ClearTimer(0);}
else if(SENSOR_2>34){OnFwd(OUT_C);ClearTimer(0);}
else{OnFwd(OUT_C);OnRev(OUT_A);}
}
}
sub follow_line_right()
{
}
sub follow_line_right() //線の右側のトレース
{
while(FastTimer(0)<s)
{
{
if(SENSOR_2>42){OnFwd(OUT_C);OnRev(OUT_A);ClearTimer(0);}
else if(SENSOR_2>40){OnFwd(OUT_C);ClearTimer(0);}
else if(SENSOR_2>36){OnFwd(OUT_AC);ClearTimer(0);}
else if(SENSOR_2>34){OnFwd(OUT_A);ClearTimer(0);}
else{OnFwd(OUT_A);OnRev(OUT_C);}
}
}
sub cross_line()
{
}
sub cross_line() //交差点での停止後の直進
{
Off(OUT_AC);Wait(100);
OnFwd(OUT_AC);Wait(20);
ClearTimer(0);
}
task main()
{
s=22;
}
A~D
task main()
{
s=22;
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
follow_line_left();
Off(OUT_AC);Wait(100);
OnFwd(OUT_A);OnRev(OUT_C);Wait(40);
OnFwd(OUT_AC);Wait(20);
ClearTimer(0);
D~G
s=24;
follow_line_right();
Off(OUT_AC);Wait(50);
OnFwd(OUT_AC);Wait(30);
t_r
follow_line_right();
Off(OUT_AC);Wait(50);
OnFwd(OUT_AC);Wait(30);
t_r
OnRev(OUT_AC);Wait(30);Off(OUT_AC);
s=20;
follow_line_right();
Off(OUT_AC);
Wait(100);
G~K
t_r
s=18;
s=18; //丸みのある交差点のため他より短めに設定している
follow_line_right();
cross_line();
follow_line_right();
cross_line();
follow_line_right();
Off(OUT_AC);
OnFwd(OUT_A);OnRev(OUT_C);Wait(50);
OnRev(OUT_AC);Wait(20);
follow_line_right();
Off(OUT_AC);
K~L
OnFwd(OUT_A);OnRev(OUT_C);Wait(50);Off(OUT_AC);
OnRev(OUT_AC);Wait(100);Off(OUT_AC);
OnRev(OUT_B);Wait(10);Off(OUT_B);
L~M
s=23;
ClearTimer(0);
follow_line_right();
cross_line();
follow_line_right();
cross_line();
follow_line_left();
Off(OUT_AC);
OnFwd(OUT_A);OnRev(OUT_C);Wait(110);
M(シューーーーーーーーーーーーーーーーーーーーーーート!!!!!!!!)
OnFwd(OUT_C);OnRev(OUT_A);Wait(50);
Off(OUT_AC);Wait(80);
OnFwd(OUT_B);Wait(10);
Off(OUT_ABC);
}
}
*問題点 [#p35fef67]
-動きがガタガタし過ぎである。
-センサーとアームを逆につけため、K~Lのボールを取りに行く動きがトレースではなくなってしまった。この状態でもトレースを行う方法を考えられれば良かった。
*まとめと感想 [#y774b0c4]
フィールドが狭いこともあり機体を回転させるとセンサーが次の交差に乗ってしまったりして、その調整が大変だった。動きの悪さが目立つプログラムであり、課題が多く残る結果となった。