2台のロボットで空き缶を収集し、ゴールに空き缶になるべく高く積み上げる
今回の課題は班員を役割分担して、この課題の攻略を図りました。
このロボットは空き缶積み上げロボットのために空き缶を持ってきてあげるためのロボットです。腕には一本の空き缶が入るようになっています。積み上げロボの構造上、二本ずつしか積み上げられないのでこちらが一本ずつ持っていく形になりました。
今回このロボのプログラミングは、課題1でやったライントレースのプログラムをその場その場で活用していく形になった。ただ自分たちでやった時と、本番で行った時とではしきい値が変わったのか、上手く動くことが出来なかった。再チャレンジの際、その点を上手く改良したかったが、失敗してしまった。どの環境下でも対応出来るようなロボを作れなかったのが残念だった。
#define THRESHOLD 40 //しきい値 #define HIPOWER 3 #define LOWPOWER 2 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward set_power_H; OnFwd(OUT_AC); //前進 #define turn_left1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); //左旋回 #define turn_left0 set_power_L; OnFwd(OUT_C); Off(OUT_A); //左折 #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); //右旋回 #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); //右折 #define time0 800 #define time1 700 #define time3 4000
sub turn1() { OnFwd(OUT_A); Wait(250); Off(OUT_A); }
sub line1() { if (SENSOR_2 < THRESHOLD -5) { turn_right1; } else if (SENSOR_2 < THRESHOLD -3) { turn_right0; } else if (SENSOR_2 < THRESHOLD +3) { go_forward; } else if (SENSOR_2 < THRESHOLD +5) { turn_left0; } else { turn_left1; } }
sub line2() { if (SENSOR_2 < THRESHOLD +0) { turn_right1; } else if (SENSOR_2 < THRESHOLD +3) { turn_right0; } else if (SENSOR_2 < THRESHOLD +5) { go_forward; } else if (SENSOR_2 < THRESHOLD +7) { turn_left0; } else { turn_left1; } }
sub uturn() { OnRev(OUT_AC); Wait(150); OnFwd(OUT_A); OnRev(OUT_C); Wait(100);}
sub line3() { if (SENSOR_2 < THRESHOLD +0) { turn_left1; } else if (SENSOR_2 < THRESHOLD +3) { turn_left0; } else if (SENSOR_2 < THRESHOLD +5) { go_forward; } else if (SENSOR_2 < THRESHOLD +7) { turn_right0; } else { turn_right1; } }
task main () { SetSensor(SENSOR_2,SENSOR_LIGHT); turn1(); //最初にターン ClearTimer(0); while (FastTimer(0) <= time0) { line1(); } //time0が終わるまでline1を実行 ClearTimer(0); while (FastTimer(0) <= time1) { line2(); } //time1が終わるまでline2を実行 uturn(); //空き缶を運び終わり、Uターン ClearTimer(0); while (FastTimer(0) <= time3) { line3(); } //time3が終わるまでline3を実行 OnRev(OUT_AC); Wait(150); //空き缶を置いて後退 Off(OUT_AC); }
こちらのロボの構造などの詳しい説明はyunagiのページをみてください。
こちらのロボのプログラムの詳しい説明はmatoのページをみてください。
#define THRESHOLD 50 #define HIPOWER 2 #define LOWPOWER 1 #define set_power_H SetPower(OUT_AC,HIPOWER); #define set_power_L SetPower(OUT_AC,LOWPOWER); #define go_forward(t) set_power_H; OnFwd(OUT_A); Wait(t); Off(OUT_A); #define go_back(t) set_power_L; OnRev(OUT_A); Wait(t); Off(OUT_A); #define turn_right2 set_power_L; OnRev(OUT_C); OnFwd(OUT_A); #define can_hold(t)set_power_L; OnFwd(OUT_C); Wait(t); #define can_up(t) set_power_L; OnFwd(OUT_B); Wait(t); Off(OUT_B); #define can_down(t) set_power_L; OnRev(OUT_B); Wait(t); Off(OUT_B); #define can_rerease(t) set_power_L; OnRev(OUT_C); Wait(t); Off(OUT_C); #define time1 1700 sub can_stack() { can_hold(100); go_back(30); go_forward(50); can_up(700); go_forward(200); can_down(200); can_rerease(60); go_back(1000); } task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); go_forward(600); Wait(3000); can_stack(); }
今回は二台のロボを使って缶を積み上げてゴールに置くというものだったが、二台に分けてやろうとするとどうしても二台の間で動きが合わないなどの問題を生じ、それを合わせていく方法を考えるのが大変だった。通信機能を使ってやろうともしたが、上手く通信してくれず、最終的に時間を計って合わせる感じになってしまった。
ロボコンでも僕らが作った回収ロボが全く役に立たず、すごく悔しかった。作ってる過程でロボコンの実際に行われる環境を配慮出来てなったのが悪かったのかなと感じた。
この授業でロボットの制御というのが思っていたよりもシビアなんだなと感じ、今後自分がそういう分野のことをやっていくんだなと思うと、とても大変そうだが、楽しそうだなとも思った。今回の失敗を忘れずに今後のロボット制御を行っていきたい。