フィールドの説明
基本ルール
基本得点の計算方法
技術点の計算方法
以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について全てのチーム(自チームを含む7チーム)が10点満点で採点し、その平均点を求める。得点の目安:
作戦1:積まれたまま三つ同時に運び、振り分ける。→断念
作戦2:一つずつ物を判別し、確実に振り分ける。→断念
作戦3:ロボを二台にして、役割を決めて振り分ける。これが最終的な作戦でした。
ロボットが完成するまでには、様々な試行錯誤が行なわれました。
作戦1 まず初めに、私たちは缶と牛乳パックを積まれているまま一度に三つ運べるロボットを作ろうと試みました。しかし、一度に三つすべてを掴む確率が悪いということで、そのロボットの製作は断念しました。
作戦2 次に考えたロボットは、缶と牛乳パックを光センサーで見分けて、一つずつ確実に運べるロボットでした。アームにタイヤを利用し、そのアームで物を左右から挟み取るロボットにした。さらに、物を掴んだら、もう一つのモーターでアームを上に持ち上げられるようにして、最後の籠に入れる際の段差をもろともしないロボットを作り出した。
↑これが缶と牛乳パックを両方掴むことが可能なアーム。タイヤを利用したことで、物をつかんだ後に落とさないように工夫した。
ここまでで出来たロボットがこちらです。
この後、私たちは、RCXを二つ利用して、缶か牛乳パックかを見分ける光センサーの他に、ライントレースをするための光センサーと、積んである缶がどこにあるか、また、壁に当たった時の為のタッチセンサーを取り付けようと試みました。しかし、それ以前に、アームを上下させることがあまりに困難であったので、このロボットでも缶を確実に運べないという結論に至った。そこで一からロボットを作り直すことが決定したが、ロボコンまで残り二日、正直行き詰った。
作戦3 最終的に考えたのが、ロボットを二つ作り、一つは牛乳パック専用ロボット、もう一つが缶専用ロボットにすることです。
牛乳パック専用ロボットは、物をつかんで運ぶのではなく、ロボットの前方に囲いを設けて、そこに入れて押しながら運ぶといったロボットにしました。
↑囲いに注目!!このスペースに牛乳パックを入れて運ぶ。
また、缶専用ロボットは缶しか入らないネットを前方に設けたロボットにしました。
↑缶しか取ることが出来なく形作ったアーム。
前の項目で述べてきたように、苦労して出来上がったロボットがこちらです↓
牛乳パックを籠に入れるときに持ち上げられるように、ロボット前方に一つキャタピラを付けた。
ここでさらに工夫したことがあります。まずこちらの写真をご覧下さい。
キャタピラの赤く囲ってある部分に注目してください。最初はキャタピラの角度を垂直に近いくらに取り付けたが、試しにやってみたところ、牛乳パックが分別スペースに入らないことがあったので、キャタピラの角度を初めより鋭角にして、牛乳パックが分別スペースに入りやすくなるようにした。このことで、牛乳パックを運ぶ際の安定性もアップした。
また、牛乳パックを運ぶ際の囲いが長いブロック一本が一対だけで、ロボットが壁にぶつかったときにすぐ壊れてしまうから補強しました。
↑缶を取るアームの上げ下げが非常に早かったので、その動作を遅くするために、モーターからの力が直接行かないようにしました。
#define go_straight(t) OnFwd(OUT_A+OUT_C);Wait(t);Off (OUT_A+OUT_C); //進む #define back(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //バック #define turn_right(t) OnRev(OUT_C);OnFwd(OUT_A);Wait(t);Off(OUT_A+OUT_C); //右に曲がる #define turn_left(t) OnRev(OUT_A);OnFwd(OUT_C);Wait (t);Off(OUT_A+OUT_C); //左に曲がる #define THRESHOLD 40 #define run_time 80 #define Do 523 //音階の周波数を定義する #define Do_s 554 #define Re 587 #define Re_s 622 #define Mi 659 #define Fa 698 #define Fa_s 740 #define Sol 784 #define Sol_s 831 #define La 880 #define La_s 932 #define Si 988 #define Do_up 1047 #define Re_up 1175 task play_music() //大塚愛の『さくらんぼ』の音楽を演奏する { while (true) { PlayTone(La,15);Wait(20); PlayTone(Si,15);Wait(20); PlayTone(La,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(Sol,50);Wait(60); PlayTone(Si,25);Wait(30); PlayTone(Re_up,25);Wait(30); PlayTone(Fa_s,15);Wait(20); PlayTone(Fa_s,50);Wait(55); PlayTone(Sol,50);Wait(55); PlayTone(Sol,15);Wait(20); PlayTone(Fa_s,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(Si,25);Wait(30); PlayTone(Re,15);Wait(20); PlayTone(Re,50);Wait(55); PlayTone(Mi,25);Wait(30); PlayTone(Sol,25);Wait(30); PlayTone(Fa_s,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(La,15);Wait(20); PlayTone(Re,15);Wait(20); PlayTone(Si,25);Wait(30); PlayTone(Fa_s,15);Wait(20); PlayTone(Sol,25);Wait(30); PlayTone(Re,15);Wait(20); PlayTone(Do,25);Wait(30); PlayTone(Re,25);Wait(30); PlayTone(Mi,25);Wait(30); PlayTone(Sol,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(Fa_s,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(La,15);Wait(20); PlayTone(La,15);Wait(20); PlayTone(La,15);Wait(20); PlayTone(Si,15);Wait(20); PlayTone(La,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(Sol,50);Wait(55); PlayTone(Si,15);Wait(20); PlayTone(Re_up,25);Wait(30); PlayTone(Fa_s,15);Wait(20); PlayTone(Fa_s,50);Wait(55); PlayTone(Sol,50);Wait(55); PlayTone(Sol,15);Wait(20); PlayTone(Fa_s,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(Si,25);Wait(30); PlayTone(Re,15);Wait(20); PlayTone(Re,50);Wait(55); PlayTone(Mi,25);Wait(30); PlayTone(Sol,25);Wait(30); PlayTone(Fa_s,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(La,15);Wait(20); PlayTone(Re,15);Wait(20); PlayTone(Si,25);Wait(30); PlayTone(Do_up,25);Wait(30); PlayTone(Si,25);Wait(30); PlayTone(La,25);Wait(30); PlayTone(Mi,25);Wait(30); PlayTone(Sol,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(Fa_s,15);Wait(20); PlayTone(Sol,15);Wait(20); PlayTone(La,15);Wait(20); PlayTone(Fa_s,15);Wait(20); PlayTone(Sol,25);Wait(30); Wait(50); } } task main() { start play_music; SetSensor(SENSOR_1,SENSOR_LIGHT); //センサー1が光センサーと定義 SetSensor(SENSOR_3,SENSOR_LIGHT); //センサー3が光センサーと定義 go_straight(170); turn_left(85); go_straight(585); turn_left(90); go_straight(80); turn_left(95); OnFwd(OUT_B); go_straight(1100); //1個目の箱を入れる動作 if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD)) {OnFwd(OUT_C);OnRev(OUT_A);} ClearTimer(0); while(Timer(0)<=run_time) {if(SENSOR_1<THRESHOLD) {OnFwd(OUT_A); Off(OUT_C);} if(SENSOR_3<THRESHOLD) {OnFwd(OUT_C); Off(OUT_A);}} //黒い線に沿って進むプログラム repeat(2) {Off(OUT_B); back(450); turn_right(180); go_straight(500); turn_right(100); go_straight(50); turn_right(90); OnFwd(OUT_B); go_straight(1200); //右側 right Off(OUT_B); back(400); turn_right(180); go_straight(600); turn_left(100); go_straight(50); turn_left(100); OnFwd(OUT_B); go_straight(1200); //右側 left back(200); turn_right(90); turn_left(90); go_straight(150); //左側に移動 Off(OUT_B); back(450); turn_left(180); go_straight(500); turn_right(100); go_straight(50); turn_right(90); OnFwd(OUT_B); go_straight(1200); //左側 right Off(OUT_B); back(400); turn_right(180); go_straight(600); turn_left(100); go_straight(50); turn_left(100); OnFwd(OUT_B); go_straight(1200);} //左側 left }
task main() { SetSensor(SENSOR_2,SENSOR_TOUCH); //タッチセンサーを定義 Wait(1250); //待ち時間 while(true) {OnFwd(OUT_A+OUT_C); //前進 until (SENSOR_2 ==1); //タッチセンサーが反応 OnRev(OUT_A+OUT_C); //後進 Wait(30); OnFwd(OUT_C);OnRev(OUT_A); //右折 Wait(140); OnFwd(OUT_A+OUT_C); //前進 until(SENSOR_2 ==1); //タッチセンサーが反応 OnRev(OUT_A+OUT_C); //後進 Wait(90); OnFwd(OUT_A+OUT_C); //前進 until(SENSOR_2 ==1); //タッチセンサーが反応 OnRev(OUT_A+OUT_C); //後進 Wait(30); OnFwd(OUT_B); //アームをあげる Wait(80); Off(OUT_B); OnFwd(OUT_A);OnRev(OUT_C); //反転 Wait(180); OnFwd(OUT_A+OUT_C); //前進 until(SENSOR_2 == 1); //タッチセンサーが反応 Off(OUT_A+OUT_C); OnRev(OUT_B); //アームをさげる Wait(85); OnFwd(OUT_B); //アームをあげる Wait(80); Off(OUT_B); OnRev(OUT_A+OUT_C); //後進 Wait(20); OnFwd(OUT_A); //反転 Wait(175); OnRev(OUT_B); //アームをさげる Wait(85); Off(OUT_B); } }
アームをやわらかくしたため、接触したときなど破損しにくくなっている。そして、アームの後ろにタッチセンサーがあるので、アームが曲がることによりセンサーが反応しやすくなっている。
運ぶものを壁におしてアームに乗せるというプログラムにしてるため、缶以外は運ぶことが出来ない。この特徴を利用して缶専用のロボットになった。
最初に待ち時間を設けたため、仲間のロボットとの接触を避けた。もし接触しても、タッチセンサーがついているため避けることが出来る。
アームが少しでも浮いているとタッチセンサーに接触せず、センサーが反応しなかった。これを解決するために、アームの上げ下げの時間の調節を何度も行った。
このアームは、缶がアームの真ん中に来ないと運ぶことができない。これを解決しようといろいろなことを試してみたが、解決することができなかった。
結果は4位でした。本番はロボットを動かし始める位置がとても重要で、一回目はリスタートした。しかし二回目はうまくいき、三点をゲットすることができました。ロボコンのときのようすです↓
ロボコンのテーマは分別ロボットということだったが、なかなかうまく分別は出来なかった。プログラムで分別するのではなく、缶なら缶しか運べないロボットを作って分別したことは工夫したと思う。もっと缶や牛乳パックを分別したかったが、本番で牛乳パックが分別スペースに入ったときはとても嬉しかったです。
最後に、ロボコンを頑張ってくれたロボット達ありがとう。お疲れ様でした。
そして、ロボットを共に完成させたグループのみんなもありがとう。本当にお疲れ様でした。