program&comment
#define zigzag OnFwd(OUT_B); Off(OUT_A); Wait(60); OnFwd(OUT_A); Off(OUT_B); Wait(55); #define turn_right OnFwd(OUT_B); OnRev(OUT_A); #define turn_left OnFwd(OUT_A); OnRev(OUT_B); #define go_straight OnFwd(OUT_A+OUT_B); #define back OnRev(OUT_A+OUT_B); void search(){//目的の紙パックを探す go_straight; Wait(200); while(true){ while(SENSOR_2<=42){ OnFwd(OUT_C); Wait(30); Off(OUT_C);//アームを開く zigzag; if(SENSOR_2<34){//黒のとき OnFwd(OUT_C); Wait(30); Off(OUT_C); back; Wait(30); turn_left; Wait(5); } } if(SENSOR_2>42){//緑か白のとき OnRev(OUT_C); //紙パックをつかむ turn_left; Wait(70); if(SENSOR_2>40)break;//紙パックをつかみ損ねたときはもう一度探す } } } task main(){ SetSensor(SENSOR_2, SENSOR_LIGHT); SetPower(OUT_A, 7); SetPower(OUT_B, 3); OnRev(OUT_C);//アームを閉じる go_straight; Wait(130); OnFwd(OUT_C); Wait(30); Off(OUT_C);//アームを閉じる while(SENSOR_2<42){//目的の紙パックを探す zigzag; } go_straight; Wait(50); OnRev(OUT_C);//紙パックをつかむ turn_right; Wait(300);//台のところまで戻る go_straight; Wait(600); turn_right; Wait(97); go_straight; Wait(320); turn_right; Wait(110); go_straight; Wait(400); OnFwd(OUT_C);//紙パックをはなす back; Wait(50); turn_right; Wait(100); while(true){ search(); go_straight; Wait(500); turn_right; Wait(95); go_straight; Wait(320); turn_right; Wait(100); go_straight; Wait(400); OnFwd(OUT_C); back; Wait(50); turn_right; Wait(60); } }
目的の紙パックを探すまでは良かったのですが、台で待機しているロボットのところまでピンポイントで戻ってくるのがなかなか大変で、Timerを使ったり、通信を使ったりと試行錯誤しましたが、全部失敗し、結局秒数でやりました(…紙パックや相手の機械にあたって進路がずれる可能性があるからやめた方が良いと先生からご指摘いただいたにもかかわらず)。で、当日は紙パックをつかんで回転するあたりで何かにひっかかったらしく、相手の陣地まで行ってしばらく妨害した後、まったく違う方向に行きました。せめてこっちに戻ってきてほしかった…。直前まで待機ロボットに改良を加えていた32班の方々、それを活かせなくてごめんなさい
さて、プログラムのほうですが、待機しているロボットが紙パックを持ち上げる速度の関係上、なるべく早く紙パックを持ち帰る必要があったので、1回目と2回目以降で動きが異なります。2回目以降に使われている関数searchでは、黒の紙パックを避け、白か緑の紙パックをつかみ損ねたときは再び探す動作に戻ります。