目次 #contents *課題 [#y8345716] ○2台のロボットで紙コップを収集し、同じ番号の書かれている紙コップに重ねる~ ○ルール~ ◦競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。~ ◦図の右上のスタートエリアからスタートする(課題1と同じ)。接地している部分がスタートエリア内に入って入ればよい。~ ◦図の左半分にある紙コップを集めて、それぞれ右半分にある同じ番号の紙コップに重ねる。~ ◦右半分の紙コップは10cm内の移動は認める~ ◦開始の合図から5秒以内にスタートボタンを押す作業を完了すること。~ ◦競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。~ ◦途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 :基本得点の計算方法~ ◦同じ番号の紙コップに重ねることができれば、1組で10点~ ◦番号が1違いの紙コップに重ねれば、1組で2点~ ◦番号が2違いの紙コップに重ねれば、1組で0点~ ◦最終的な紙コップの位置が10cm以上動いた場合は、その1組の点数を半分にする~ *メンバー [#a7bd6338] 秋山和哉(ayusaka)~ 岩佐暁史(kanzaki)~ 藤岡芳弥(fuji)~ *ロボット [#v57f11ea] 全体像~ &ref(image-01.jpg);~ センサー部分。ライントレース用、コップの判断用と写真の様に2つつけた~ &ref(image-02.jpg);~ コップを掴む機構。これに押しはめて持ち上げる。上についている突起に押し当ててはずす。~ &ref(image-03.jpg);~ 掴む部分を上下させる機構。ギザギザの部分を歯車で駆け上がる。~ &ref(image-04.jpg);~ 補助部分。前方につけてコップの位置を調整する~ &ref(image-05.jpg);~ コップを掴んだ様子~ &ref(image-06.jpg);~ *プログラム [#a9b65eea] #define HIPOWER 1 //直線用のパワー #define LOWPOWER 3 //カーブ用のパワー #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 SIGNALON 13 #define cross set_power_H; OnFwd(OUT_AC);Wait(20); //交差点を渡る #define c1 if (SENSOR_3 < 37) {Off(OUT_AC); SendMessage(SIGNALON);Wait(80);} //黒い紙コップを見つけたらメッセージを送る。 task main() { SetSensor(SENSOR_2,SENSOR_LIGHT); //光センサーセット SetSensor(SENSOR_3,SENSOR_LIGHT); int nl=0; int cc=0; go_forward; Wait(460); turn_left1; Wait(140); go_forward; Wait(280); ここまでのプログラムで図のA地点まで来ます。ここA地点にある紙コップをとりあえずAとBの間にある交差点まで押していきます。 ClearTimer(0); while (true) { while ((nl < 5) ||(FastTimer(0)<500)){ if (SENSOR_2 < 37) { //濃い黒を感知したら turn_left1; nl++; } else if (SENSOR_2 < 41) { //薄い黒を感知したら turn_left0; nl=0; } else if (SENSOR_2 < 45) { //灰色を感知したら go_forward; nl=0; } else if (SENSOR_2 < 50) { //薄い白を感知したら turn_right0; } else { //濃い白を感知したら turn_right1; nl=0; } Wait(1); } 上記のプログラムがライントレースです。 光センサーにより明るさを測って、明度の値により左右に曲がらせてライン上を進みます。 交差点は左旋回の回数を計ることで判別します。左旋回の回数はnlというカウンターで 計ります。上記の動作は一回あたり1/100秒間行われます。つまり連続で左旋回が行われて nlが加算されていった場合、nlが5になるのにかかる時間は0.5秒として考えることができます。 右旋回が0.5秒以上行われない限りは通常であると判断しライントレースを続けます。 turn_right1; Wait(35); cross; cc++; if (cc == 1) { go_forward; Wait(50); c1; OnRev(OUT_AC); Wait(150); turn_left1; Wait(40); go_forward; Wait(280); c1; OnRev(OUT_AC); Wait(500); turn_left1; Wait(100); go_forward; Wait(200); c1; OnRev(OUT_AC); Wait(100); 交差点を通った後A地点にあった紙コップの色を判断して次にB地点に向かい紙コップの色を判断し最後にC地点の紙コップに向かい紙コップの色を判断します。その中から黒色だったものをつかみます。 turn_left1; Wait(330); go_forward; Wait(1000); C地点から1地点まで紙コップを運びます } } } 未完成ですがここまでしかできませんでした。予定ではこのまま左のフィールドに戻り灰色の紙コップをつかんで2の地点へ行き、また戻って白の紙コップをつかみ3の地点へ行く予定でした。 ↑ コップを掴むプログラム † #define SIGNALON 13 task main () { ClearMessage(); while (true) { until (Message() == SIGNALON); OnFwd(OUT_AC); Wait(30); OnRev(OUT_AC); Wait(30); Off(OUT_AC); } } *工夫した点 [#jac4db70] ロボットがどう紙コップを掴むのか、そして離すのかを考えるのが一番大変だった。~どのようにしても結局上下する必要があると考えたのでギザギザのパーツを歯車で駆け上がるようにした。~この際滑り落ちてしまわないようにかなりきつめに作った。~また掴んでから完全に上がってしまわないようにして、そこからさらに上げることで上の突起に当てて紙コップを外せるようにした。 ロボットがどう紙コップを掴むのか、そして離すのかを考えるのが一番大変だった。~ どのようにしても結局上下する必要があると考えたのでギザギザのパーツを歯車で駆け上がるようにした。~この際滑り落ちてしまわないようにかなりきつめに作った。~また掴んでから完全に上がってしまわないようにして、そこからさらに上げることで上の突起に当てて紙コップを外せるようにした。 ロボットがどう紙コップを掴むのか、そして離すのかを考えるのが一番大変だった~どのようにしても結局上下する必要があると考えたのでギザギザのパーツを歯車で駆け上がるようにした~この際滑り落ちてしまわないようにかなりきつめに作った~また掴んでから完全に上がってしまわないようにして、そこからさらに上げることで上の突起に当てて紙コップを外せるようにした。 *感想、工夫した点 [#jac4db70] ロボットがどう紙コップを掴むのか、そして離すのかを考えるのが一番大変だった。どのようにしても結局上下する必要があると考えたのでギザギザのパーツを歯車で駆け上がるようにした。この際滑り落ちてしまわないようにかなりきつめに作った。また掴んでから完全に上がってしまわないようにして、そこからさらに上げることで上の突起に当てて紙コップを外せるようにした。 ロボットを作るのが大変だった。そもそも考え方が間違っているのか、というような場面が沢山あって何度も作り変えた。