A地点を出発し、経路を黒い線にそって動くロボットを作成する 。
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール) 交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。
詳しいコースは2019a/Mission2
今回のロボットは、コースの細かいカーブを曲がりやすくするため、小型化することに努め、縦横の大きさを小さくして、タイやを2つにしました。
下の写真は、ロボット全体の写真になります。
ピンポン球を運ぶアームは、掴むと振動で落としたり、より精密な操作が必要になると判断したため、下の写真のようにピンポン球を囲んで運ぶようにしました。
最後のシュートは、アームをあげ、バックしてから、もう一度アームを下げ押し込むようにします。
下の写真は、ロボットを下から見た写真です。見てわかるように前側にライントレース用の光センサーがあり、左右の車輪用のモーターをくっつけて#reロボットの土台にしています。
用意した定義は、ライントレースの時に使用する。左のタイヤのみ前に回転して右に進む「migi」と右のタイヤのみ前に回転して左に進む「hidari」また、同様の仕組みで右後ろに進む「migiback」、左後ろに進む「hidariback」に加えて、ピンポン球を取るためのアームを上下させるための「amuage」と「amusage」になります。
#define migi OnFwd(OUT_A);Off(OUT_B); #define hidari OnFwd(OUT_B);Off(OUT_A); #define hidariback OnRev(OUT_A);Off(OUT_B); #define migiback OnRev(OUT_B);Off(OUT_A); #define amuage OnFwd(OUT_C);Wait(10); #define amusage OnRev(OUT_C);Wait(10);
次にサブルーチンについて説明します。使ったサブルーチンは、4つです。 1つ目は、線の右側の境界をライントレースしていき、指定した秒数で止まるものです。
int t; sub Line() { SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<t){ if(SENSOR_1<35){migi;} else if(SENSOR_1=35){OnFwd(OUT_AB);} else if(SENSOR_1>35){hidari;} } Off(OUT_AB); }
2つ目は、線の左側の境界をライントレースしていき、交差点を感知すると止まるようになっているものです。交差点の感知は、黒い時左に曲がる行動のみタイマーを0に戻すものをつけていないため、あらかじめ指定したt秒黒いところが続くと止まるようになるのを利用している。しかし止まる時少し左カーブをしてしまうので直行、右折の場合は、そのあと修正が必要になります。
sub Line_kousatenn() { SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=t){ if(SENSOR_1>35){migi;;ClearTimer(0);} else if(SENSOR_1=35){OnFwd(OUT_AB);ClearTimer(0);} else if(SENSOR_1<35){hidari;} } Off(OUT_AB); }
3つ目は、右側のライントレースをバックしてやるものです。これも1つ目と同様に指定した秒数で止まるものです。
sub Line_back() { SetSensor(SENSOR_1,SENSOR_LIGHT); ClearTimer(0); while(FastTimer(0)<=t){ if(SENSOR_1<35){migiback;} else if(SENSOR_1=35){OnRev(OUT_AB);} else if(SENSOR_1>35){hidariback;} } Off(OUT_AB); }
4つ目は、2つ目のサブルーチンによって交差点を感知したあと直行するときに、左側を向いてしまったロボットの方向を右側に回転することで直行できるように戻すためのものです。
sub syuusei() { migi;Wait(28);Off(OUT_AB); }
次からがロボットのタスクメインになります。(1文字進むごとに区切っています)
task main() { t=510; Line();
MからLまで
amusage;
ピンポン球の回収
t=100; Line_back(); OnFwd(OUT_B);Wait(28);
LからKまで
t=28; Line_kousatenn();
Kの交差点感知
t=28; Line_kousatenn();
KからJ交差点感知
t=28; Line_kousatenn(); syuusei();
JからI交差点感知
t=28; Line_kousatenn(); syuusei();
IからH交差点感知
t=28; Line_kousatenn();
HからG交差点感知
t=28; Line_kousatenn();
GからFまで
t=28; Line_kousatenn();
FからEまで
t=28; Line_kousatenn(); syuusei();
EからD交差点感知
t=28; Line_kousatenn(); syuusei();
DからC交差点感知
t=28; Line_kousatenn(); syuusei();
CからB交差点感知
amuage; OnRev(OUT_AB);Wait(20); amusage; OnFwd(OUT_AB);Wait(30); }
ピンポン球シュート
最初の方を時間指定にしてしまったため、序盤のズレによって成功しないことが多々あった。後半は、できる限り修正せず、ライントレースの連続で行動できるように右を走るか左を走るか考えた。序盤のところでは、もう少し安定させるには、1回T字路で止まってから秒数を設定したり、何かサブルーチンを増やすことで安定度が上がるかもしれないと思った。