今回我々が挑むロボコンの課題はhttp://yakushi.shinshu-u.ac.jp/robotics/?2008b%2F%A5%ED%A5%DC%A5%B3%A5%F3 である。期末テストで単位が危ないなか私たち三人の戦いは始まった。
まず考えられる空き缶の取り方は
前者の利点は今回のロボコンでは時間無制限であるので何回でも取り直しが可能なのと、ロボットが大きくならないのでステージ内を細かく動くことができること、また複数個展開できることが考えられます。しかし、ロボット同士の連携やステージが複雑なことを考えるとデメリットの方が大きいと思われたので我々は後者の四つ 一気に持っていくことロボットを作る方針で制作を進めていきました。
ドライブベース担当しました、零崎です。車体をなるべく低くして、かつタイヤを大きく間をとった形にしギアを大きくかませ移動するスピードをわざと押さえました。これにより空き缶へのアプローチの際の誤差を減らそうという試みでした。
アーム担当はY田。四つ一気に持っていけるよう安定性+高さの要求を見事にクリア。本人曰くエ○ンゲリオン初号機の足をイメージだそうです。接地面積をふやし摩擦をあげ、一番下と一番上にはタイヤを装着し少ないパーツでアームを完成させることができました。
この男がいなければロボコンとか絶対むりだったであろう、いつもは雲の上にいる(はず)の絶対神。上昇機構の歯車の噛み合わせに奮闘を続けた。
こちらがマシン全体図。かなりでかくてそして重い。今大会最重量だったらしく他を圧倒するほど。ただしでかすぎてコースにつまる・・・
こちらはドライブベース正面画像。これがマシン全体の重量を支えることになるので一本の長いブロックを多用した
こちらはドライブベースの横からの画像。ギアを大きくしてゆっくり動きかつ重い全体を支えながら走れる用にがっちりした造りに
こちらがアーム。ごちゃごちゃした見た目とは裏腹にかなりの精度を誇ります。
こちらはRCXの連携のためのひと工夫。反射板を設置することで向かい合っていなくても通信が可能に。これにより様々な場所にRCXを設置可能となる
こちらは回転センサー。ドライブベースの右後輪に取り付けられる。これがわがチームのプログラムの最大のかなめとなる
モータ、センサについては以下の端子に接続してあります。
RCX(1)
A端子 → モータ:タイヤ(正回転:前進,逆回転:後進) B端子 → 使用せず C端子 → モータ:タイヤ(正回転:前進,逆回転:後進)
1端子 → 回転センサ(前進:値=正、後進:値=負) 2端子 → 光センサ(左){未使用} 3端子 → 光センサ(右){未使用}
RCX(2)
A端子 → モータ:アーム(正回転:開く,逆回転:閉じる) B端子 → 使用せず C端子 → モータ:上下機構{未使用}
1端子 → アームのタッチセンサ{未使用} 2端子 → 使用せず 3端子 → 使用せず
これが我々のマシンの作戦ルートです(途中微調整をして若干異なりますが)。時間がなかったため、光センサなどを使用せず、 タイヤと直結した回転センサを駆使して缶、そしてゴールまで行こうと 思いましたが、その結果、初期位置が最も重要となりました。
赤線:往路 青線:復路
RCX(1)のプログラム
void move_fwd(int t){ //前進する関数:回転センサの値が入力された値 //(t)以上になったら止まる ClearSensor(SENSOR_1); OnFwd(OUT_A + OUT_C); until(SENSOR_1 >= t); Off(OUT_A + OUT_C); } void move_rev(int t){ //後進する関数:回転センサの値が入力された値 //の負の値(-t)以下になったら止まる ClearSensor(SENSOR_1); OnRev(OUT_A + OUT_C); until(SENSOR_1 <= -t); Off(OUT_A + OUT_C); } void move_rig(int t){ //右折する関数:回転センサの値が入力された値 //の負の値(-t)以下になったら止まる ClearSensor(SENSOR_1); OnFwd(OUT_A); OnRev(OUT_C); until(SENSOR_1 <= -t); Off(OUT_A + OUT_C); } void move_lef(int t){ //左折する関数回転センサの値が入力された値 //(t)以上になったら止まる ClearSensor(SENSOR_1); OnFwd(OUT_C); OnRev(OUT_A); until(SENSOR_1 >= t); Off(OUT_A + OUT_C); } task main(){ SetSensor(SENSOR_1,SENSOR_ROTATION); ClearMessage(); move_fwd(24); //前進 move_lef(13); //左折 move_fwd(30); //前進 move_rig(20); //右折 move_fwd(36); //前進 move_lef(8); //左折 move_fwd(25); //前進 move_lef(20); //左折 move_fwd(18); //前進 move_rig(7); //右折 SendMessage(1); //RCX(2)にメッセージ(値:1)を送る until(Message() == 3); //RCX(2)からメッセージ(値:3)を送られるまで待機 ClearMessage(); move_fwd(10); //前進 SendMessage(5); //RCX(2)にメッセージ(値:5)を送る until(Message() == 7); //RCX(2)からメッセージ(値:7)を送られるまで待機 ClearMessage(); move_rev(12); //後進 move_lef(6); //左折 move_rev(15); //後進 move_rig(6); //右折 move_rev(5); //後進 move_rig(7); //右折 move_rev(4); //後進 move_rig(7); //右折 move_rev(25); //後進 move_rig(9); //右折 move_rev(33); //後進 move_lef(20); //左折 move_rev(15); //後進 move_lef(20); //左折 move_fwd(30); //前進 SendMessage(9); //RCX(2)にメッセージ(値:9)を送る }
RCX(2)のプログラム
task main(){ ClearMessage(); until (Message() == 1); //RCX(1)からメッセージ(値:1)を送られるまで待機 ClearMessage(); OnFwd(OUT_A); //アームを開く Wait(90); Off(OUT_A); SendMessage(3); //RCX(1)にメッセージ(値:3)を送る ClearMessage(); until(Message() == 5); //RCX(1)からメッセージ(値:5)を送られるまで待機 ClearMessage(); OnRev(OUT_A); //アームを閉じる Wait(85); Off(OUT_A); SendMessage(7); //RCX(1)にメッセージ(値:7)を送る until(Message() == 9); //RCX(1)からメッセージ(値:9)を送られるまで待機 ClearMessage(); OnFwd(OUT_A); //アームを開く Wait(90); Off(OUT_A); }
缶が少しかぶりますが・・・ご了承ください
この間8秒もウィリーをした!!
会場は大いに盛り上がりましたが、結局缶には触れられず・・・
しかしこのパフォーマンスのおかげで
点数は10.4でなんと5位!!!!!
このような反省点が上がりました。これから先に役立てていきたいと思います!