目次
ピンポン玉または青と赤のボールを運搬して、所定の容器の中に入れる。
フィールドの説明 フィールドは課題2で使用した紙を使用する。 生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方に玉を2個入れる。 残りの2個の玉は課題2と同じ位置に置く。その際、ゴムタイヤやプレートの上に置いてもよい。 プラ容器には色をつけたり文字や記号を書いてもよい。 プラ容器は両面テープ等でフィールドに固定してもよい。 2枚の紙の境界にはそれぞれ幅1cm、合計2cmの黒線を描いてもよい。
基本ルール
競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域~内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。
開始の合図から5秒以内にスタートボタンを押す作業を完了すること。
競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。
途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。
競技終了後、ロボットが、ゴールのプラ容器に触れていてはいけない。
競技終了後、もともと玉が入っていたプラ容器が、ゴールのプラ容器に触れていてはいけない。
基本得点の計算方法
プラ容器内の玉を1個運べば8点。二つとも運べば20点。
L地点とL'地点の玉をどちらか1個運べば4点、2個とも運べば12点。
競技終了後、ゴールのプラ容器が完全に円から出しまった場合、もとの基本点の1/4を減点。
競技終了後、ゴールのプラ容器の半分以上が円から出ていれば、もとの基本点の3/4を減点。
競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
競技終了後、ゴールのプラ容器にもとのプラ容器が触れていれば、もとの基本点の1/2を減点。
競技終了後、ゴールのプラ容器にロボットが触れていれば、もとの基本点の1/4を減点。
技術点の計算方法
以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチー~玉を探し取りにいくまでの動作 (3点)
玉を掴む動作 (3点)
玉をを運ぶ動作 (2点)
玉を容器の中に入れる動作 (2点)
2台のRIS、NXT、EV3の連携の良さ(2点)
自立型のロボットとしての形や動作の美しさ、斬新さ(2点)
その他 (3点)
今回作ったロボットはこちらです。
私たちのグループは二つのロボットに分けるのではなく、一体型のロボットの作った。一つのNXTの本体はタイヤを動かし、前後左右の動きを可能にそして、もう片方のNXTは、アームの部分を動かし、上下の動きを可能にする。二つのNXTはBluetoothで通信している。
アームの機構はこのようになっている。
ボールをとるために、輪ゴムを利用した。ボールを上から二本の輪ゴムで挟み上にあげるというものである。
このようにしてボールをつかんでいき、ボールがお互いに押し合って、上に上がって、溜まっていく。
溜まっていったボールは、黒い棒の開け閉めによって、ボールをとどめておいたり、出したりできるようにした。
センサーの位置は下のようになった
光センサーはタイヤよりも前の位置につけた。当初、光センサーの位置はタイヤよりも後ろについていたが、それだと色の認識の判断が遅れ、ライントレースができるときとできない時があったため、タイヤよりも前につけることにした。
今回はNXTを二つ使っているので、片方をマスター、もう一方をスレーブとしてBluetoothで通信している。スレーブ側のプログラムは「アームを上げる」、「アームを下げる」、「扉を開ける」、「扉を閉める」の四つの操作を行う。コースとしては右側のマップのB→C→D→E→F→Gとライントレースをしていき、箱の中のふたつをとり、残りの二つをとるという、作戦である。
プログラム名はTAI(S1)
task main() { OnRev(OUT_C,50); Wait(5000); Off(OUT_C); SendResponseNumber(MAILBOX1,11); //マスター側にアームを上げた終わったことを伝える }
プログラム名はTAI(S2)
task main() { OnFwd(OUT_C,30); Wait(3000); Off(OUT_C); SendResponseNumber(MAILBOX1,12); //マスター側にアームを下げた終わったことを伝える }
プログラム名はTAI(S3)
task main() { OnFwd(OUT_B,30); Wait(3000); Off(OUT_B); SendResponseNumber(MAILBOX2,13); //マスター側に扉を開けたことを伝える }
プログラム名はTAI(S4)
task main() { OnRev(OUT_B,50); Wait(5000); Off(OUT_B); SendResponseNumber(MAILBOX2,14); //マスター側に扉を閉めたことを伝える }
#define BL 40 #define WH 47 #define HB 32 #define HW 55 #define left OnFwd(OUT_B,45);OnRev(OUT_C,40); //左旋回 #define right OnFwd(OUT_C,45);OnRev(OUT_B,40); //右旋回 #define lefts OnFwd(OUT_B,38);OnFwd(OUT_C,25); //左に曲がる #define rights OnFwd(OUT_C,38);OnFwd(OUT_B,25); //右に曲がる #define CONN 1 //Bluetoothの接続番号
ライントレースのプログラムは以下のようになる。
sub hidari() { SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<=250){ if(SENSOR_3>HW){ right; //白なら右旋回 t0=CurrentTick(); //時間をリセット }else if(SENSOR_3>WH){ rights; //灰白なら右に曲がる t0=CurrentTick(); }else if(SENSOR_3>BL){ OnFwd(OUT_BC,30); //灰色なら直進 t0=CurrentTick(); }else if(SENSOR_3>HB){ lefts; //灰黒なら左に曲がる t0=CurrentTick(); }else{ left; //黒なら左旋回 } } Off(OUT_BC); }
交差点横断のプログラムは次のようになる。
sub oudann() { right; Wait(300); Off(OUT_BC); OnFwd(OUT_BC,30); Wait(500); Off(OUT_BC); }
直角のところのライントレースは次のようになる。なお、このプログラムは箱の前で止まるようになっている。
sub magari() { SetSensorLight(S3); int nOnline=0; while(nOnline<4600){ //4.6秒以下の間はwhile内を実行する if(SENSOR_3>HW){ right; nOnline++; }else if(SENSOR_3>WH){ rights; }else if(SENSOR_3>BL){ OnFwd(OUT_BC,30); }else if(SENSOR_3>HB){ lefts; }else{ left; } } Off(OUT_BC); }
sub arm_up() { int msg; until(BluetoothStatus(1)==NO_ERR); RemoteStartProgram(1,"TAI(S1).rxe"); //TAI(S1)を行うようにスレーブ側に命令 while(msg !=11){ ReceiveRemoteNumber(MAILBOX1,true,msg); } Wait(2000); //スレーブ側から応答があるまで待機 }
sub arm_down() { int msg; until(BluetoothStatus(1)==NO_ERR); RemoteStartProgram(1,"TAI(S2).rxe"); //TAI(S2)を行うようにスレーブ側に命令 while(msg !=12){ ReceiveRemoteNumber(MAILBOX1,true,msg); } Wait(2000); }
sub arm_open() { int msg; until(BluetoothStatus(1)==NO_ERR); RemoteStartProgram(1,"TAI(S3).rxe"); //TAI(S3)を行うようにスレーブ側に命令 while(msg !=13){ ReceiveRemoteNumber(MAILBOX2,true,msg); } Wait(2000); }
sub arm_close() { int msg; until(BluetoothStatus(1)==NO_ERR); RemoteStartProgram(1,"TAI(S4).rxe"); //TAI(S4)を行うようにスレーブ側に命令 while(msg !=14){ ReceiveRemoteNumber(MAILBOX2,true,msg); } Wait(2000); }
task main() { hidari(); oudann(); magari(); arm_up(); OnFwd(OUT_BC,30); Wait(300); Off(OUT_BC); arm_down(); arm_close(); left; Wait(1500); Off(OUT_BC); OnFwd(OUT_BC,30); Wait(2000); Off(OUT_BC); arm_up(); arm_down(); left; Wait(2500); Off(OUT_BC); OnFwd(OUT_BC,40); Wait(5000); Off(OUT_BC); hidari(); oudann(); hidari(); oudann(); hidari(); arm_up(); arm_open(); }
発表ではボールを一個もとることができず、悔しい結果となってしまった。電池はとても重要だ。