2018a/Member ライントレース
下の図のようなコースを各チームで作成し,「ミッション」を遂行するためのロボットを作成せよ.
選んだコースは以下の通りである.
1.Aをスタート 2.Bを右折 3.Jで一時停止の後,Yの空き缶をキャッチしてJに戻る 4.JからKに向かい,Kを直進 5.Lを直進 6.Iを左折 7.Hで一時停止の後,左折 8.Gで一時停止の後,右折 9.Fで一時停止の後,右折 10.Eを直進 11.Dで一時停止の後,空き缶をXに置いてDに戻り,Cに向かう 12.Cで一時停止の後,直進 13.Bを直進 14.Aで停止 (一時停止の指定がある場所は,1秒間停止すること)
今回,我々はアームに”クワガタ構造”を取り入れたが,ただ取り入れただけでなく,顎の片側を大きく開くことで機体が左回転をしたときにちょうど手前の顎にはぶつからず,奥の顎にすっぽりハマるように工夫した.また,機体が左回転をしたときにちょうどそこに空き缶が来るようにアームの長さを調整した.アームを閉じても,空き缶の下部のみアームと触れているためバランスが不安定になり,ロボットの移動中にアームから空き缶が外れるというトラブルが生じたため,画像から分かる通りアームの上にブロックを付けた.(我々はこのブロックをウォールマリアと呼んでいた.)
今回我々はライントレースにおいて以下のように三段階の色を光センサーで判別するようにした.
#define rightsenkai OnFwd(OUT_A);OnRev(OUT_C); #define rightmagaru OnFwd(OUT_A);Off(OUT_C); #define leftsenkai OnFwd(OUT_C);OnRev(OUT_A); #define leftmagaru OnFwd(OUT_C);Off(OUT_A); #define sstop Wait(100);
X地点で一秒間停止した後アームを閉じるのと,空き缶を顎に入れるために以下のプログラムを使う.
#define arm_c OnRev(OUT_B);Wait(20);OnFwd(OUT_AC);Wait(10);Off(OUT_AC);leftsenkai;Wait(27);OnFwd(OUT_B);Wait(20);
位置調整のために以下のプログラムを使う.
#define go OnFwd(OUT_AC);Wait(20);Off(OUT_AC);
黒い線の左側をライントレースするときに使った定義は以下の3つである. 場合によって左側をトレースしたほうが回りやすかったり右側をトレースしたほうが回りやすかったりすることがあったため左右両方のライントレースを作成した.
#define Line(t) SetSensor(SENSOR_2,SENSOR_LIGHT);ClearTimer(0);while(FastTimer(0)<=t){if(SENSOR_2>60){rightsenkai;ClearTimer(0);}else if(SENSOR_2>59){rightsenkai;ClearTimer(0);else if(SENSOR_2>57){OnFwd(OUT_AC);ClearTimer(0);else if(SENSOR_2>42){leftmagaru;}}Off(OUT_AC); #define Line1(t) SetSensor(SENSOR_2,SENSOR_LIGHT);ClearTimer(1);while(FastTimer(1)<=t){if(SENSOR_2>60){rightsenkai;ClearTimer(1);}else if(SENSOR_2>59){rightsenkai;ClearTimer(1);}else if(SENSOR_2>57){OnFwd(OUT_AC);ClearTimer(1);}else if(SENSOR_2>42){leftmagaru;}}Off(OUT_AC); #define Line2(t) SetSensor(SENSOR_2,SENSOR_LIGHT);ClearTimer(2);while(FastTimer(2)<=t){if(SENSOR_2>60){rightsenkai;ClearTimer(2);}else if(SENSOR_2>59){rightsenkai;ClearTimer(2);}else if(SENSOR_2>57){OnFwd(OUT_AC);ClearTimer(2);}else if(SENSOR_2>42){leftmagaru;}}Off(OUT_AC);
以下,左側のライントレースである.
#define Line1_Rev(t) SetSensor(SENSOR_2,SENSOR_LIGHT);ClearTimer(1);while(FastTimer(1)<=t){if(SENSOR_2>60){leftsenkai;ClearTimer(1);}else if(SENSOR_2>59){leftsenkai;ClearTimer(1);}else if(SENSOR_2>57){OnFwd(OUT_AC);ClearTimer(1);}else if(SENSOR_2>42){rightmagaru;}}Off(OUT_AC); #define Line2_Rev(t) SetSensor(SENSOR_2,SENSOR_LIGHT);ClearTimer(2);while(FastTimer(2)<=t){if(SENSOR_2>60){leftsenkai;ClearTimer(2);}else if(SENSOR_2>59){leftsenkai;ClearTimer(2);}else if(SENSOR_2>57){OnFwd(OUT_AC);ClearTimer(2);}else if(SENSOR_2>42){rightmagaru;}}Off(OUT_AC);
task main() { Line1_Rev(26) rightmagaru; Wait(100); Off(OUT_AC); leftmagaru; Wait(100); Off(OUT_AC); sstop; arm_c; Off(OUT_AC); leftmagaru; Wait(14); Off(OUT_AC); Line(58)
rightsenkai; Wait(30); Off(OUT_AC); Line1(35) rightsenkai; Wait(37); Off(OUT_AC); Line(35)
leftsenkai; Wait(25); Off(OUT_AC); Line1(35) sstop;
leftsenkai; Wait(25); Off(OUT_AC); Line2(40) leftsenkai; Wait(30); Off(OUT_AC); Line2(40) sstop;
rightsenkai; Wait(75); Off(OUT_AC); Line1_Rev(30) sstop; Line2_Rev(30) go; Line1_Rev(30)
OnFwd(OUT_B); leftsenkai; Wait(90); OnRev(OUT_AC); Wait(40); Off(OUT_B); OnRev(OUT_B); Wait(20); Off(OUT_B);
rightsenkai; Wait(70); Off(OUT_AC); Line2_Rev(40) rightsenkai; Wait(10); Off(OUT_AC); Line1_Rev(25)
leftmagaru; Wait(40); Off(OUT_AC); Line2_Rev(25) }
交差点かどうかの判断はライントレース中の黒の上を移動している時間で行った.我々の班は0,35秒に設定し,それ以上黒が続けば交差点と判断して動作を一時停止するようプログラムした.黒以外の色に入った場合タイマーをクリアすることで黒が続いたときのみ停止することに成功した.
何度も繰り返せば最初から最後まで成功するが,恒常的な成功はできなかった.
我々のグループは元々RIS本体の調子が悪かった等,様々な予想外のトラブルが生じた.書道ロボット以上にプログラミングに時間を要し,難易度も書道ロボット以上であったので,正確なプログラムを製作することはできなかった.機会があれば,より時間をかけて数値を細かく入力し,より成功確率を上げていきたい.