[[2018a/Member]] *課題3[#r414c566] #ref(2018a-mission3.png) 基本ルール -2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。 -競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。 -図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。 -Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。 -開始の合図から5秒以内にスタートボタンを押す作業を完了すること。 -競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。 -途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。 基本得点の計算方法 -運んだ空き缶の数×3点 -空き缶を積み重ねて置くことができば場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する。 -円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。 -間違った円内に空き缶を置いた場合は、1個につき1点減点。 -間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点 技術点の計算方法 -以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全ての-チーム(5チーム)が20点満点で採点し、その平均点を求める。 得点の目安: -空き缶を探し取りにいくまでの動作 (3点) -空き缶を掴む動作 (3点) -空き缶を運ぶ動作 (2点) -空き缶を置く動作 (2点) -空き缶を積む動作 (3点) -2台のRCXまたはNXT、EV3の連携の良さ(2点) -自立型のロボットとしての形や動作の美しさ、斬新さ(2点) -その他 (3点) *ロボット [#y87afe7f] **ロボットの構造 [#w076fa4c] #ref(yoko.jpg) #ref(hidari.jpg) 横側から -NXT同士をつなぐため、横側から補強してとれないようにしている。 #ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=E9505BD3-A340-40BF-980F-86D22183A7D7.jpeg&refer=2018a%2FMember%2Fhaya%2FMission3) #ref(sita.jpg) 下側から -ギアでタイやが真ん中に来るようにしている。 -前部分に赤外線センサーを取り付けることで、ライトトレースができるようにしてある。 #ref(syoumen.jpg) 正面から -ギアを使って、重いハサミを持ち上げている。 #ref(usiro.jpg) 後ろから -NXTの本体を上下に2つ重ね、上にハサミとハサミを上下させるモーター、下に赤外線センサーと左右のタイヤを動かすモーターを設置した。 **ロボットの工夫した点 [#t10f449c] -ハサミに小さなタイヤ、ゴムをつけることで空き缶をつかんだときに滑らないようにした。 -ハサミを上下させるモーターにギアをつけることで、重いモーターとハサミを持ち上げられるようにした。 -タイヤを重心付近にすることで、ロボットの揺れが大きくならないようにした。 -NXTの本体を縦に2つつなげることによって二段目の空き缶をちょうどつかめる位置にハサミが来るようにした。 *プログラム [#jcc08893] **戦略 [#c6753242] Y側の2段目の空き缶をハサミでたたき落とし、X側の2段目の空き缶をY側に運ぶことで、確実に6点を取りに行こうとした。 **マスター側のプログラム [#k8a53ed5] #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); } **スレイブ側のプログラム [#j26ed415] #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; } } } *プログラムの工夫した点 [#z9a35e5e] (前提)「Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ」というルールを(Aタイプの空き缶を円X内に、Bタイプの空き缶を円Y内に運ぶ)というように間違って解釈してしまった。 -マスターとスレイブにプログラムを分けることで操作できるモーターの数を多くした。 -空き缶の近くまでライトトレースすることで空き缶の位置を認識できるようにした。 -ライトトレースで空き缶の位置を認識させるため、超音波センサーなどの複雑な機器を使わずにすむようにした。 -満点を狙わずに1,2段目を確実に入れられるようにプログラムした。 -円Y内の1.2段目の空き缶をハサミでたたき落とすことによって、円X内の2段目の空き缶を円Y内の1段目の空き缶の上にのせられるようにした。 *結果 [#u9d81417] 下から2番目だった。つまり、とても悪かった。空き缶は1つも枠内に入らず、技術点もほとんどもらえなかった。 *反省点 [#c674a10e] ロボットもプログラムも発想は悪くなかったと思う。その代わり、反省しなければならない点が3つある。 1、ルールを読み間違えないようにする。どれだけ頑張っても、頑張る方向が間違っていれば、何の意味もない。 2、全員でロボットを作り、全員でプログラムを作る。ロボットとプログラムを作る人を完全に分けてしまったせいで、担当の人がいないと、調整も満足にできないようなことになってしまう。 3、ロボットやプログラムの工夫点を他人に上手に説明する技術を得る。総合点は、技術点に大きく依存する。下から2番の順位だったのは、技術点がとても低かったことが、一番の理由だ。評価をするのはあくまで人間なので、うまく心をつかむ説明をすることで、技術点をもっと稼げたかもしれない。