#contents *今回の課題:空き缶収集&積み上げロボット [#m7fac15a] 2台のロボットで空き缶を収集し、ゴールに空き缶になるべく高く積み上げる #ref(./route.JPG,100%,コース図) 今回の課題は班員を役割分担して、この課題の攻略を図りました。 -yunagi 積み上げロボ制作担当 -uirin 空き缶回収ロボの制作とプログラミング担当←僕です 空き缶収集ロボの制作とプログラミング担当←僕です -mato 積み上げロボのプログラミング担当 -ryois 空き缶回収ロボの制作とプログラミング担当 空き缶収集ロボの制作とプログラミング担当 *ロボとプログラムの紹介(空き缶回収ロボ) [#ee581a9b] *ロボとプログラムの紹介(空き缶収集ロボ) [#ee581a9b] **ロボの説明 [#d33c5a68] #ref(./robo3.jpg,40%,空き缶回収ロボ) #ref(./robo3.jpg,40%,空き缶収集ロボ) このロボットは空き缶積み上げロボットのために空き缶を持ってきてあげるためのロボットです。腕には一本の空き缶が入るようになっています。積み上げロボの構造上、二本ずつしか積み上げられないのでこちらが一本ずつ持っていく形になりました。 **プログラム [#wa687ff8] 今回このロボのプログラミングは、課題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); } *ロボとプログラムの紹介(空き缶積み上げロボ) [#rb39df51] **ロボの説明 [#l9206f7d] #ref(./robo4.jpg,80%,空き缶積み上げロボ) こちらのロボの構造などの詳しい説明はyunagiのページをみてください。 **プログラム [#jec8ca89] こちらのロボのプログラムの詳しい説明は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(); } *課題2、ロボコンを行った感想・反省点 [#e3ac4de4] 今回は二台のロボを使って缶を積み上げてゴールに置くというものだったが、二台に分けてやろうとするとどうしても二台の間で動きが合わないなどの問題を生じ、それを合わせていく方法を考えるのが大変だった。通信機能を使ってやろうともしたが、上手く通信してくれず、最終的に時間を計って合わせる感じになってしまった。 ロボコンでも僕らが作った回収ロボが全く役に立たず、すごく悔しかった。作ってる過程でロボコンの実際に行われる環境を配慮出来てなったのが悪かったのかなと感じた。 この授業でロボットの制御というのが思っていたよりもシビアなんだなと感じ、今後自分がそういう分野のことをやっていくんだなと思うと、とても大変そうだが、楽しそうだなとも思った。今回の失敗を忘れずに今後のロボット制御を行っていきたい。