ロボコン †内容 †基本ルール †●4段に積まれた空き缶を運びだし、ゴールに入れる。 ●競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 ●2隅のコーナー(30cm四方)からスタートする。 ●競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 ●途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 基本得点の計算方法 †●緑の空き缶を1個ゴールに運べば4点。 ●黒い空き缶(最上の空き缶)を運べば8点 ●空き缶を場外に出してしまった場合は一個につきマイナス1点。 フィールドの説明 †フィールドは約160cm×110cm 空き缶が積み上げられている場所を中心に半径10cm,20cm,30cmの円が黒い線で描かれてる 黒い線の太さは約25mm ロボット製作 †概形を考える †ロボットの台数 †今回は2台のロボットを使う、あるいは2セットのキットを使って1つのロボットを使う2通りの方法が選べるが、2台で分業させると、連携させる必要がある。 しかし、それが難しく、1台に機能をまとめた方がパーツ、スペース面で自由度が広がる等のメリットがあることから、1台に機能を集約にすることにした。 缶の運び方 †初めは4つ一緒に運ぶことを考えたが、全高があまりにも高くなり過ぎ、アームの強度、サイズから信頼性に問題があるように思えた。掴む前に接触することによる缶の転倒、パーツの破損、運搬中の缶の脱落などが起きた場合、缶の後の回収が困難になるからである。 次に考えたのは、大型アームで壁を越えて缶を掴み、アームをゴールまで直接持っていく方法。この問題点は、缶とゴールの間の壁の配置が、当初定められてなかったこと、正確に缶を掴めそうになかったこと、アームが重くなりすぎること。面白い発想だったが実現性に乏しかったため廃案に。 ルールでは黒缶(一番上の缶)をゴールに入れると8点、緑をゴールに入れると4点。 だから、倒さずに上部の高得点の二缶を確実に狙って点を稼ぐ方針にした。 アーム制作 †アーム部分の機構は大きく分けて2つ キットにあるパーツを合わせて組んでみたところ、どうしてもアームの上下幅は缶1個分しか得られなかったため、より多くの缶を1度に掴めるよう、アームを2つにして組んでみた センサー類 †まず、必要なセンサーと数を考えてみた 問題となったのは、後半の2つである まず缶をどう探知するか?これは当初タッチセンサーを壁以上の高さの位置に配置し、缶に触れて探知する予定であったが、実際試したところセンサーが感知できる前に衝撃で缶が倒れてしまうことが判明したため、光センサーにて缶の存在を探知することにした もうひとつはGOALを探知するセンサーだが、こちらはコースの壁とGOALの囲いの高さの違いに着目し、壁用とGOAL用の2つのタッチセンサーを高さを変えて配置し、どちらにぶつかったのかを判別できるようにした 車体製作 †今回のロボは2台分のパーツを使ったためとても大きくなることと、センサーやモーターを大量に使ったためにRCXを2台使うということがネックだった プログラム †動力 †#define infrared 42 // 赤外線センサーの明るさ調整 メインタスク用にライントレースのプログラムをあらかじめ組んどきました! task line_checks() { while(true) { if (SENSOR_1 >infrared) //センサー1が明るいと判断して、 { if (SENSOR_3 >infrared) //センサー3も明るいと判断したら、 { { OnFwd(OUT_A+OUT_C); //まっすぐ進む。 } } else //センサー1が明るくセンサー3が暗かったら { Off(OUT_C); //右にカーブ。 OnFwd(OUT_A); } } else //センサー1が暗く、 { if(SENSOR_3>infrared) //センサー3が明るかったら { OnFwd(OUT_C); Off(OUT_A); //左にカーブ。 } } } } task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); // 赤外線センサーセット SetSensor(SENSOR_3,SENSOR_LIGHT); // 赤外線センサーセット SetSensor(SENSOR_2,SENSOR_TOUCH); // タッチセンサーセット OnFwd(OUT_A+OUT_C);Wait(160);Off(OUT_A+OUT_B); OnFwd(OUT_A);OnRev(OUT_C);Wait(30); OnFwd(OUT_A+OUT_C); until ((SENSOR_1 < infrared ) && (SENSOR_3 < infrared)); Off(OUT_A+OUT_C); OnFwd(OUT_C);OnRev(OUT_A);Wait(60); PlaySound(SOUND_CLICK) ; start line_checks; until (SENSOR_2 == 1); PlaySound(SOUND_CLICK) ; stop line_checks; PlaySound(SOUND_CLICK) ; OnRev(OUT_A+OUT_C);Wait(40);Off(OUT_A+OUT_C); OnRev(OUT_C);OnFwd(OUT_A);Wait(125); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); until(SENSOR_2 == 1); Off(OUT_A+OUT_C); OnRev(OUT_A+OUT_C);Wait(40);Off(OUT_A+OUT_C);Wait(50); Off(OUT_A+OUT_C);Wait(100); OnRev(OUT_A);OnFwd(OUT_C);Wait(28);//kanmukau Off(OUT_A+OUT_C); int n; n=0; while(n<1) { if (SENSOR_1 >infrared) //センサー1が明るいと判断して、 { if (SENSOR_3 >infrared) //センサー3も明るいと判断したら、 { { OnRev(OUT_A+OUT_C); } } else { Off(OUT_C); //右にカーブ。 OnRev(OUT_A); } } else { if(SENSOR_3>infrared) { OnRev(OUT_C); Off(OUT_A); } else{Off(OUT_A+OUT_C);Wait(30); n=n+1; OnRev(OUT_A+OUT_C);Wait(55); } } } Off(OUT_A+OUT_C);Wait(1000);PlaySound(SOUND_FAST_UP) ; OnRev(OUT_A); OnFwd(OUT_C); Wait(110); OnFwd(OUT_A+OUT_C); until (SENSOR_2 == 1); PlaySound(SOUND_CLICK) ; Off(OUT_A+OUT_C);Wait(50); OnRev(OUT_A+OUT_C);Wait(50); OnFwd(OUT_C);OnRev(OUT_A);Wait(125); Off(OUT_A+OUT_C);Wait(50); OnFwd(OUT_A+OUT_C);Wait(310);//en OnFwd(OUT_A+OUT_C); until ((SENSOR_1 < infrared ) && (SENSOR_3 < infrared)); Off(OUT_A+OUT_C);Wait(50); OnRev(OUT_A);OnFwd(OUT_C);Wait(125); PlaySound(SOUND_CLICK) ; start line_checks; until (SENSOR_2 == 1); PlaySound(SOUND_CLICK) ; stop line_checks; PlaySound(SOUND_CLICK) ; OnRev(OUT_A+OUT_C);Wait(40);Off(OUT_A+OUT_C); OnFwd(OUT_C);OnRev(OUT_A);Wait(125); OnRev(OUT_A+OUT_C);Wait(250);Off(OUT_A+OUT_C); } 改善すべき点 †今回のロボのそもそもの発想、2つの缶を確実にという時点で既に妥協であったと思う 反省 †@ロボコンとテスト週間が重なっていたとはいえ時間にもっとゆとりを持つべきだった。(汗) @チームの団結力に欠けていた。 @なにがともあれ、4位という好成績を残せたのでよかった。 @ロボコンに集中しすぎたため、皆、写真撮影に気づかずHPがうまく作れなかった。(痛) 感想 †これまでのことを言葉で表すならば「楽しかった」の一言に尽きると思います コメントをどうぞ †
|