ライントレースを主に指定されたコースについてロボットに指定の動作をさせる.
時間との兼ね合いも考えて.シンプルにミスが起きづらい設計を目指した. 主題がライントレースなので小回りが利く小型の機体がいいと考えた.
赤外線センサを地面スレスレに置くことで狭い範囲で識別することができるようにしました.これによってプログラムを理論に近い挙動で動かすことができ,連続するプログラムを実行する際,初期位置に関係なく目標の位置からのズレを抑えることができた.
カンを掴む機構については四角い枠を上下に動かすだけのシンプルな構造です.はさみ型も考えましたが,挟んだ時にカンが不安定になったり滑り落ちることがあったためこのような形になりました.籠にある程度自由度を持たせていますがカンをつかむ瞬間は地面と平行になるようになっています.ゲージを下す場所も交差点の位置でうまくいくように調整して余計なプログラムを省いた.
この機体も後輪についてミッション1同様2×2で自由度を持たせることによって回転時などにトラブルが起こりにくいようにしました.軸を大きく取ることによって,急カーブ時にも余計なプログラムを書かずとも問題を怒らないようにした.
重量のある本体をブロックで固定するのでは剛性に限界があるので,半ばモーターの上に乗せるような形にし加速度が生じるときの安定性を高めました.
・カンを持ちあげる部分について,ただの四角いゲージでは下部を支えて引きづるような形になり,落とす事故が多発したためゲージの機構についてももう少し議論して,高さをつけるべきであった.
・カンを認識する動作をかなり微調整に頼ったため,失敗することが多かった.確実性の高い方法や,超音波センサを使うべきであった.
・主な移動手段のライントレースについては速度の遅さを除いて良好であった.
#define turnL OnFwd(OUT_A,30); OnFwd(OUT_B,-20): // 左折 #define turnR OnFwd(OUT_A,-20); OnFwd(OUT_B,30); // 右折 #define armUP OnFwd(OUT_C,-20); Wait(1500); Off(OUT_C); // アーム上げ #define armDW OnFwd(OUT_C,20); Wait(1500); Off(OUT_C); // アーム下げ
task main() { SetSensorLight(S2);
long t0 = CurrentTick(); while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnR; } else { turnL; t0 = CurrentTick(); } } //AからBまでライントレース OnFwd(OUT_B,20); Wait(500); Off(OUT_B); //Bで右折 while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnR; } else { turnL; t0 = CurrentTick(); //Jまでライントレース } } Off(OUT_AB); Wait(1000); //Jで一時停止 armDW //空き缶をキャッチ OnFwd(OUT_AB,-20); Wait(500); //Jにもどる repeat(2){ while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnL; } else { turnR; t0 = CurrentTick(); } } OnFwd(OUT_AB,20); Wait(500); } //JからK、KからLを通過 while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnL; } else { turnR; t0 = CurrentTick(); } } //Iまでライントレース OnFwd(OUT_A,20); Wait(500); Off(OUT_A); //Iを左折 while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnL; } else { turnR; t0 = CurrentTick(); } } //Hまでライントレース Off(OUT_AB); Wait(1000); OnFwd(OUT_A,20); Wait(500); Off(OUT_A); //Hで一時停止後左折 while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnL; } else { turnR; t0 = CurrentTick(); } } //Gまでライントレース Off(OUT_AB); Wait(1000); OnFwd(OUT_B,20); Wait(750); Off(OUT_B); //Gで一時停止後右折 while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnR; } else { turnL; t0 = CurrentTick(); } } //Fまでライントレース Off(OUT_AB); Wait(1000); OnFwd(OUT_B,20); Wait(500); Off(OUT_B); //Fで一時停止後右折 while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnR; } else { turnL; t0 = CurrentTick(); } } OnFwd(OUT_AB,20); Wait(500); Off(OUT_AB); //Eまでライントレース後直進 while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnR; } else { turnL; t0 = CurrentTick(); } } Off(OUT_AB); Wait(1000); //Dまでライントレース後一時停止 OnFwd(OUT_A,20); Wait(500); Off(OUT_A); armUP //空き缶を置く OnFwd(OUT_B,20); Wait(500); Off(OUT_B); //Dに戻る while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnL; } else { turnR; t0 = CurrentTick(); } } //Cまでライントレース Off(OUT_AB); Wait(1000); OnFwd(OUT_AB,20); Wait(500); Off(OUT_AB); //Cで一時停止後直進 while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnL; } else { turnR; t0 = CurrentTick(); } } OnFwd(OUT_AB,20); Wait(500); Off(OUT_AB); //Bまでライントレース後直進 while (CurrentTick()-t0 <= 300) { if (SENSOR_2 < 40){ turnL; } else { turnR; t0 = CurrentTick(); } } Off(OUT_AB); //Aで停止
・ライントレースの際白か黒の二択で定義したため動きが小刻みになり,移動速度が異常にそかった. ・超音波センサをうまく利用できればプログラムをかなり簡潔にできたと思う.カンの位置を手動のプログラムで行ったため,今くいかないことが多く調整にもかなりの時間を要した.