[[2018a/Member]] #contents *課題:空き缶運搬ロボット [#w0f2c59a] ** フィールドの説明 [#t464ee2d] #ref(2018a/Member/mine/Mission3/2018a-mission3.png,50%,コース) -フィールドは課題2で使用した紙を使用する。 -2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。 -空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。 **基本ルール [#kd743856] -競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 -図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 -Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。 -開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 -競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 -途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 **基本得点の計算方法 [#d4930149] -運んだ空き缶の数×3点 -空き缶を積み重ねて置くことができば場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する。 -円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。 -間違った円内に空き缶を置いた場合は、1個につき1点減点。 -間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点 **技術点の計算方法 [#d264d68d] -以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安: +空き缶を探し取りにいくまでの動作 (3点) +空き缶を掴む動作 (3点) +空き缶を運ぶ動作 (2点) +空き缶を置く動作 (2点) +空き缶を積む動作 (3点) +2台のRCXまたはNXT、EV3の連携の良さ(2点) +自立型のロボットとしての形や動作の美しさ、斬新さ(2点) +その他 (3点) *機体 [#yf80c697] #ref(2018a/Member/mine/Mission3/IMG_2864.JPG,50%,機体) 光センサでライントレースを基本として動かせるように二輪と支えを持った三輪車型にした。ギアが浮かないようにストッパーをつけていたが、負荷がかかると稀に取れてしまうことがあったのでもう少し改良が必要だったかもしれない。 #ref(2018a/Member/mine/Mission3/IMG_2865.JPG,50%,コース) 機体は2台を同時に動かしそれらの連携によって缶を動かす方法ではなく2つの核部品を組み合わせて1つの機体を作り完全1台のみでミッションをこなすようにした。 モータを4つ使うため、機体は本体を重ね合わせた形になっている。 アーム部分はミッション2のものをそのまま用いており、クワガタ型である。 #ref(2018a/Member/mine/Mission3/IMG_2866.JPG,50%,機体) なるべくブレが出ないようにタイヤ周りとセンサーとの位置調整を施した。タイヤ間の中心にセンサをつけることにかなり苦労した。 #ref(2018a/Member/mine/Mission3/IMG_2867.JPG,50%,機体) ハサミは缶の摩擦を頼りにしているので輪ゴムをつけるとともに先端にタイヤをつけて確実性を上げた。 #ref(2018a/Member/mine/Mission3/IMG_2868.JPG,50%,機体) 下にある本体がマスター側で、足となるモータとセンサ、ハサミの上げ下げをつかさどっている。 上の本体がスレイブであり、ハサミの開閉のみを担当している。 *作戦 [#k4d6cbd4] #ref(2018a/Member/mine/Mission3/2018a-mission3-1.png,50%,コース) 緑の矢印の順でライントレースをしてXにある缶をYに持っていき、重ねるようにした。 ライントレース途中の小さなカーブ二つ目を通る際に、缶の塔に構造上どうしても当たってしまったので、それを逆に利用して、満点を狙わない代わりに、動作を少ないままに、点数を狙えるようにした。 満点は狙えないのだが、確実に一点以上を出せるようになっている。 予行練習では、最高で6点を出すこともできた。 その後の試行錯誤でも電池残量にあまり影響なく、一定以上の点数を出すことができた。 積み重ねられるかどうかはかなりの運要素であったが、そこを抜きにしても一点以上を狙うことができると踏んでいた。 *プログラム [#h14cdcee] **マスター(ライントレース、ハサミの上げ下げ) [#i35369e3] #define CONN 1 // スレーブの接続番号 #define SIGNALON 11 // ハサミで持ち上げるためのメッセージ #define SIGNALOFF 12 // 缶を落とすためのメッセージ #define llt OnFwd(OUT_A,50); OnRev(OUT_C,30); Wait(1);//大きく左に回る #define lrt OnRev(OUT_A,30); OnFwd(OUT_C,50); Wait(1);//大きく右に回る #define ternleft OnFwd(OUT_A,50); OnRev(OUT_C,10);//左に回る #define ternright OnRev(OUT_A,10); OnFwd(OUT_C,50);//右に回る #define go OnFwd(OUT_A,50); OnFwd(OUT_C,50);//直進する #define back OnRev(OUT_A,50); OnRev(OUT_C,50);//後退する #define trase_R {if(SENSOR_2<36){lrt; n++;} else if(SENSOR_2<50) {go; n=0;} else {llt; n=0;}} //右側トレース #define trase_L {if(SENSOR_2<36){llt; n++;} else if(SENSOR_2<50) {go; n=0;} else {lrt; n=0;}} //左側トレース #define open RotateMotor(OUT_B,25,80); Off(OUT_B);Wait(1000); //ハサミ開く #define close RotateMotor(OUT_B,25,-80); Off(OUT_B);Wait(1000); //ハサミ閉じる #define UP RotateMotor(OUT_C,40,90); Off(OUT_C); Wait(1000); //ハサミ持ち上げ #define DOWN RotateMotor(OUT_C,20,-100);Off(OUT_C); Wait(1000); //ハサミ下げ task main() { SetSensorLowspeed(S1); SetSensorLight(S2); int n=0; while(n<=100) { // H trase_R; } Off(OUT_AC); Wait(1000); OnFwdSync(OUT_AC, 50, 0); Wait(500); Off(OUT_AC); n=0; while(n<=100) { // s2 trase_R; } Off(OUT_AC); Wait(1000); OnFwd(OUT_AC,50); //線をまたぐ Wait(500); n=0; while(n<=90) { trase_L //L字路で止まる } Off(OUT_AC); Wait(1000); RotateMotor(OUT_A, 60, 300); Off(OUT_AC); n=0; while(n<=150) { //十字路で止まる trase_R } Off(OUT_AC); Wait(1000); RotateMotor(OUT_C, 60, 300); Off(OUT_AC); n=0; while(n<=70) { //Fで止まる trase_L } Off(OUT_AC); close; SendRemoteNumber(CONN,MAILBOX1,SIGNALON); //持ち上げる Off(OUT_ABC); Wait(3000); OnRev(OUT_AC,50); //バックで距離を取る Wait(1000); Off(OUT_AC); RotateMotorEx(OUT_AC, 75, 1860, 100, true, false); //振り返る Off(OUT_AC); n=0; while(n<=70) { //Gで止まる trase_L } Off(OUT_AC); RotateMotorEx(OUT_AC, 75, 400, -100, true, false ); Off(OUT_AC); SendRemoteNumber(CONN,MAILBOX1,SIGNALOFF); Off(OUT_ABC); Wait(3000); open; Off(OUT_ABC); Wait(3000); } **スレイブ (ハサミの開閉)[#l110beac] #define CONN 1 // スレーブの接続番号 #define SIGNALON 11 // ハサミで持ち上げるためのメッセージ #define SIGNALOFF 12 // 缶を落とすためのメッセージ #define llt OnFwd(OUT_A,50); OnRev(OUT_C,30); Wait(1);//大きく左に回る #define lrt OnRev(OUT_A,30); OnFwd(OUT_C,50); Wait(1);//大きく右に回る #define ternleft OnFwd(OUT_A,50); OnRev(OUT_C,10);//左に回る #define ternright OnRev(OUT_A,10); OnFwd(OUT_C,50);//右に回る #define go OnFwd(OUT_A,50); OnFwd(OUT_C,50);//直進する #define back OnRev(OUT_A,50); OnRev(OUT_C,50);//後退する #define trase_R {if(SENSOR_2<35){lrt; n++;} else if(SENSOR_2<50) {go; n=0;} else {llt; n=0;}} #define trase_L {if(SENSOR_2<35){llt; n++;} else if(SENSOR_2<50) {go; n=0;} else {lrt; n=0;}} #define open RotateMotor(OUT_B,25,85); Off(OUT_B);Wait(1000); #define close RotateMotor(OUT_B,25,-85); Off(OUT_B);Wait(1000); #define UP RotateMotor(OUT_C,40,90); Off(OUT_C); Wait(1000); #define DOWN RotateMotor(OUT_C,20,-90);Off(OUT_C); Wait(1000); task main () { int msg; // 受け取った値を格納する変数 while (true) { ReceiveRemoteNumber(MAILBOX1,true,msg); // if (msg == SIGNALON) { UP; } if (msg == SIGNALOFF) { DOWN; } } } *結果と反省 [#m4938aad] 本番当日には立ち会うことができなかったのだが、メンバーから話を聞くと散々だったようである。ライントレースの途中でミスをしたり、缶を倒した際の衝撃で下の段の缶も倒れて、積み重ねができなったようだ。練習ではかなりうまくいっていたのだが、本番前の調整に立ち会えなかったため、不完全な状態で本番を迎えてしまった。メンバーにもっと、何処の機構がどうなれば正しいのか、プログラムの段階での調整項目などをもっとしっかり共有するべきであった。今回の反省は、チームメンバーとの協力をもっとしておくべきであったということだ。せっかくのチームであったのだから、意見交換のみならず、プログラムの意味などについても話しておくべきだった。本番で結果を残せなかったことが非常に悔やまれるのだが、多くのことを学ぶ機会とすることができた。