[[2009b]] //CENTER:只今作成中 目次 #contents *チーム [#l02624f3] **チーム名 [#y49c64f3] 株式会社 とだ **メンバー [#ud8d069a] その壱 とだ~ その弐 なかみゅう~ その参 SHIMA~ *ロボコン競技内容 [#x6401341] **課題:玉入れロボット[#s59b9347] ピンポン玉をできるだけたくさん所定の場所に運ぶ **フィールドの説明 [#l42d3efc] #ref(field4.jpg,right,around) ・フィールドは約160cm×110cm~ ・18個のピンポン玉はフィールドの中央にある、2x4の角材(長さ40cm)2本にはさ まれた正方形の領域にあり、領域のこの角材が置かれていない辺には500mlの紙パックが並べられている~ ・紙パックはすべての面に白あるいは緑色の画用紙がはられている~ ・目的地の長方形は19mm×19mmの角材で仕切られていている~ ・黒い線の太さは約25mm~ #ref(field_all.jpg,left,around,50%) パックは緑もしくは白の直方体である。フィールドの中央にあるオレンジの丸はピンポン玉である。 ~ #ref(field_center.jpg,left,around,50%) #Clear **ルール[#xb98a5cb] ***基本ルール [#c9877109] ・単独の競技(1回)および対戦の競技(リーグ戦、計2回の対戦)の合計点で争う~ ・スタート時は「スタート地点」の内部以外に接していないこと~ ・スタート時のロボットは2個を越えないこと(スタート後はいくつに分裂してもかまわない)~ ・開始の合図から5秒以内にRCXのスタートボタンを押す作業を完了すること~ ・競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない~ ・途中でうまく動かなくなった場合、1回限り再スタートすることができる~ ・競技時間終了までにもとのスタート地点にもどらなければならない(リーグ戦では戻らなくてもよい)~ ・競技時間は3分とする。ただし審判が、競技続行不能と判断した場合は途中で終了する ***基本得点の計算方法 (単独競技) [#q6f70ec7] ・ボール1個あたり2点で計算する。~ ・ボーナス点として5個入れるごとに5点追加~ ・時間内(3分)にスタート地点にもどらないと-4点(ただしRCXを搭載するロボットの一部でも戻っていれば -2点)~ ・最高で51点~ ***基本得点の計算方法 (リーグ戦) [#la84423e] ・ゴールに入れたボールの数で競い、勝ったチームは10点、引き分けの時は5点、負けたチームは0点とする。~ ・さらにゴールに入れたボール1個あたり1点を加点する~ ・競技終了後、ゴールの内部にロボットが触れていれば-1点~ ・最高で20点~ ***技術点の計算方法 [#oe26404f] 以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について全てのチーム(3チーム)+TAが20点満点で採点し平均点を求める。~ 得点の目安 ・紙パックの処理 (3点)~ ・ボールの収集 (3点)~ ・ボールの運搬 (3点)~ ・ボールのシュート (3点)~ ・2台のRCXの連携 (3点)~ ・その他 (5点)~ *ロボットの作成 [#xac09bd4] **方針 [#j6aa403e] 効率よくパックをどかし、ピンポン球を運搬できるロボットを製作する。 **製作に移る前に [#r72a29d2] 初め、一つの大きなロボットを製作するつもりでした(下図参照)が、ピンポン球を収集することが困難であったため、パックをどかすロボットとピンポン球を収集するロボットの2台を製作することとなった。 #ref(1_robo_f.jpg,left,around,50%) #ref(1_robo_r.jpg,left,around,50%) #Clear **ピンポン球収集ロボット [#u6632eb3] ***構造と仕組み [#i95dc0b5] 収集ロボットの構造は、ロボットの中央(左右のタイヤの間)にキャタピラが備え付けられていて、キャタピラは、ピンポン玉の上面と接するような高さに設置されている。~ #ref(syuusyuu.jpg,around,120%) #Clear また、キャタピラの先端にはピンポン玉を回収しやすくするためのアームが設置されていて、このアームは、ピンポン玉をゴールに排出する際にピンポン玉を持ち上げるのに役立つ。排出時は、アームとキャタピラに加え、ゴールを囲む木枠も利用する。なお、ピンポン玉は最高6個回収できる。~ #ref(haisyutu.jpg,center,around,120%) #Clear 車体には、光センサーと回転センサーの両方が設置されて、移動する時に利用する。~ 車体の移動速度は、ギアの組み合わせの関係で結構速いので、先手をとることも可能である。 ***改良前の作品 [#u8e14c08] 改良前の作品には、移動手段として光センサーではなく、タッチセンサーが取り付けられていたが、この場合、移動にずれが生じると修正することが困難であったため光センサーになった。~ 移動のずれは、左右のホイールのモーターの回転数が多少違うため、まっすぐに進もうとすると、どちらか左右に少しずつ曲がってしまうことにより発生する。タッチセンサーで修正しようとすると、壁もしくは障害物に当たらないと修正できない。しかも、実際に実行しようとすると、たいして修正できなかった。~ しかし、光センサーだと、黒いラインがフィールド上に敷きめぐらされているため、修正されやすくなる。なお、光センサーは、下の図でわかるように車体前面に左右対称に取り付けられている。 #ref(2_robo_f.jpg,around,left,50%) #ref(2_robo_r.jpg,around,right,50%) #Clear ↑正面 ↑右側 #Clear #ref(2_robo_t.jpg,around,left,50%) #Clear ↑タッチセンサーのアップ ***完成 [#n216b881] 完成したものは、全長約30cmという巨大なものになった。改良前の作品では、タッチセンサーが取り付けられていたが、完成したロボでは、タイヤの軸より少し前に光センサーが左右1個ずつ取り付けられている。 #ref(3_robo_f.jpg,around,left,50%) #ref(3_robo_r.jpg,around,right,50%) #Clear ↑正面 ↑右側 #Clear #ref(3_robo_b.jpg,around,left,50%) #ref(3_robo_d.jpg,around,right,50%) #Clear ↑背後 ↑下から #Clear 下からの図をみると光センサーがわかりやすい。~ NQC本体が車体の真ん中より右寄りなのは、車体のバランスをとるためである。こうしないとまっすぐ走行させようとするとやや左にそれる。~ 下の図は、ピンポン球を実際に取る姿を再現したものである。図は、改良前の作品であるが、とる姿はほぼ変化がないので気にしないでください。~ #ref(2_robo_f_p.jpg,around,left,50%) #ref(2_robo_r_p.jpg,around,right,50%) #Clear ↑正面 ↑右側~ 下図はNQCを外した時に上から見えるピンポン玉収集の姿である。~ #ref(2_robo_u_p.jpg,around,center,50%) #Clear ***工夫した点・苦労した点など [#u29ed85b] 工夫した点は、車体のタイヤをやや前方に取り付けることにより、ロボットが回転運動した時も、収集したピンポン玉を逃しにくくしてある点である(瞬間中心の関係)。~ #ref(kuhuu2.jpg,around,120%) #Clear また、前方のアームの長さも床に届かないような高さにし、左右のアームの間隔は少し緩めに設置されているので、ピンポン玉が詰まった際にアームが多少広がり、アームにかかった無理な力を逃がし、アームは回転し続けます。~ #ref(kuhuu1.jpg,around,120%) #Clear さらに、アームとキャタピラの回転は連動していて、一つのモーターで回転します。~ 前方のクローは、ゴールにピンポン玉を入れる時、ピンポン玉を入れやすくする役割を担っている。 ***問題点 [#mb65bd46] ・車体が大きすぎるため回転運動させようとすると、周辺の障害物にあたり回転が困難である。~ ・アームが少し短いため、ピンポン玉収集があまりうまくいかない。(前進しながらなら回収しやすい)~ ・ピンポン玉を回収する関係上、光センサーの幅がやや広めなので、ライントレーサーがうまくいかないこともある。 ***プログラム [#y4a54e69] #define T 40 //明るさの識別値 #define go_forward OnFwd(OUT_A+OUT_C); //前進プログラム #define go_back OnRev(OUT_A+OUT_C); //後進プログラム #define turn_right OnFwd(OUT_A);OnRev(OUT_C); //右旋回プログラム #define turn_left OnRev(OUT_A);OnFwd(OUT_C); //左旋回プログラム #define end Off(OUT_A+OUT_C); //停止のプログラム #define cs ClearSensor(SENSOR_2); //センサー2をリセット #define rs1 -25 //part1を後進するための回転数 #define rs2 47 //part3を前進するための回転数の1 #define rs3 -25 //part4を後進するための回転数の2 #define rs4 58 //part4を前進するための回転数の1 #define rr1 12 //反転するための回転数 #define rr2 3 //少し右旋回するための回転数 #define rr3 5 //45°右旋回するための回転数 #define rl1 -4 //少し左旋回するための回転数 #define rl2 -14 //part4で左旋回するための回転数 #define arm1 OnFwd(OUT_B); //アーム(ピンポン玉回収) #define arm2 OnRev(OUT_B);Wait(1000);Float(OUT_B); //アーム(ピンポン玉排出) task main () { SetPriority(1); SetSensor(SENSOR_1,SENSOR_LIGHT); //SENSOR1は光センサー SetSensor(SENSOR_2, SENSOR_ROTATION); //SENSOR2は回転センサー SetSensor(SENSOR_3,SENSOR_LIGHT); //SENSOR3は光センサー int n; //nは変数 n=0; //初めnは0 Wait(2000); //20秒間待機(part1開始) cs;go_back;until(SENSOR_2<=rs1); //少し後進 cs;turn_right;until(SENSOR_2>=rr1); //車体を反転(part1終了) repeat(5) //以下のプログラムを5回繰り返す(part2〜part5開始) { cs;turn_right;until(SENSOR_2>=rr2); //少し右旋回(part2開始) go_forward;Wait(10);end; //少し前進 cs;turn_right;until(SENSOR_2>=rr2); //少し右旋回 arm1; //ピンポン玉収集開始 repeat(3) //以下のプログラムを3回繰り返す { go_forward;Wait(10);end; //少し前進 go_back;Wait(10);end; //少し後進 } Off(OUT_B); //アーム停止 cs;turn_left;until(SENSOR_2<=rl1); //少し左旋回 go_back;Wait(10);end; //少し後進 cs;turn_left;until(SENSOR_2<=rl1); //少し左旋回(part2終了) start follow_line_1;until(SENSOR_2>=rs2); //ライントレースの1開始(part3開始) stop follow_line_1; start follow_line_2;until(SENSOR_3>T); //ライントレースの2へ切り替え stop follow_line_2; cs;turn_right;until(SENSOR_2>=rr3); //45°右旋回 cs;go_forward;until(SENSOR_2>=rs3); //ゴールまで前進 arm2; //ピンポン玉排出開始(part3終了) cs;go_back;until(SENSOR_2<=-rs3); //後進(part4開始) cs;turn_left;until(SENSOR_2<=rl2); //左旋回 start follow_line_1;until(SENSOR_2>=rs4); //ライントレースの1開始 stop follow_line_1; cs;turn_right;until(SENSOR_2>=rr1); //車体を反転(part4終了) n=n+1; turn_right;until(SENSOR_2>=rr);Off(OUT_A+OUT_C); //右へセンサー2がrl以下になるまで旋回 go_forward;Wait(20);Off(OUT_A+OUT_C); //少し前進 ClearSensor(SENSOR_2); //part2始まり turn_right;until(SENSOR_2>=rr2);Off(OUT_A+OUT_C); //右へセンサー2がrl以下になるまで旋回 arm1; //アームを起動 repeat(2) { ClearSensor(SENSOR_2); go_forward;until(SENSOR_2>=rs2_2);Off(OUT_A+OUT_C); //センサー2がrs2_2以上になるまで前進 Wait(200); ClearSensor(SENSOR_2); go_back;until(SENSOR_2<=-rs2_2);Off(OUT_A+OUT_C); Wait(200); } //part2終わり //part6開始 go_back;until(SENSOR_2<=rs6);Off(OUT_A+OUT_C); //センサー2が-rs2_1以下になるまで後進 turn_left;Wait(25);Off(OUT_A+OUT_C); //少し左旋回 Float(OUT_B); //アーム停止 //part6終了 ClearSensor(SENSOR_2); //part7開始 turn_left;until(SENSOR_2<=rl);Off(OUT_A+OUT_C); //センサー2がrl以下になるまで左旋回 go_back;Wait(100);Off(OUT_A+OUT_C); //少し後退 ClearSensor(SENSOR_2); turn_left;until(SENSOR_2<=rl);Off(OUT_A+OUT_C); //センサー2がrl以下になるまで左旋回 start follow_line_forward;until((SENSOR_2>=rs7)&&(SENSOR_3>THRESHOLD)); stop follow_line_forward;Off(OUT_A+OUT_C); //T字まで手前まで前進 start follow_line_forward_2;until(SENSOR_3<THRESHOLD); stop follow_line_forward_2;Off(OUT_A+OUT_C); //T字路まで前進 //part7終了 ClearSensor(SENSOR_2); turn_right;until(SENSOR_2>=rr8);Off(OUT_A+OUT_C); //センサー2がrr以上になるまで右旋回 ClearSensor(SENSOR_2); go_forward;Wait(300);Off(OUT_A+OUT_C); //センサー2がrs8以上になるまで前進 PlaySound(2);Wait(100);arm2; //ピンポン玉排出 //part8終了 ClearSensor(SENSOR_2); //part10開始 go_back;until(SENSOR_2<=-rs8);Off(OUT_A+OUT_C); //センサー2が-rs8以下になるまで前進 ClearSensor(SENSOR_2); turn_left;until(SENSOR_2<=rl);Off(OUT_A+OUT_C); //センサー2がrl以下になるまで左旋回 go_back;Wait(50);Off(OUT_A+OUT_C); //少し後進 start follow_line_back;until(SENSOR_2>=rs10);stop follow_line_back;Off(OUT_A+OUT_C); //センサー2がrs10以上になるまで後進 //part10終了 } } task follow_line_forward() //ラインに沿って前進するプログラム { while(true) { if(SENSOR_1>THRESHOLD) //左側のセンサーが白で { if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら {Off(OUT_A+OUT_C);go_forward;}//直進する else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら {Off(OUT_A+OUT_C);turn_right;}//右折する } else if(SENSOR_1<THRESHOLD) //左側のセンサーが黒で { if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら {Off(OUT_A+OUT_C);turn_left;} //左折する else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら {Off(OUT_A+OUT_C);go_forward;}//直進する。 } } } task follow_line_back() //ラインに沿って後進するプログラム { while(true) { if(SENSOR_1>THRESHOLD) //左側のセンサーが白で { if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら {Off(OUT_A+OUT_C);go_back;} //後進 else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら {Off(OUT_A+OUT_C);turn_left;} //左旋回 } else if(SENSOR_1<THRESHOLD) //左側のセンサーが黒で { if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら {Off(OUT_A+OUT_C);turn_right;}//右旋回 else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら {Off(OUT_A+OUT_C);go_back;} //後進 } } } task follow_line_forward_2() //ラインに沿って前進するプログラム { while(true) { if(SENSOR_3>THRESHOLD) //右側のセンサーが白で { if(SENSOR_1>THRESHOLD) //かつ左側のセンサーが白なら {Off(OUT_A+OUT_C);OnFwd(OUT_C);}//右折する else if(SENSOR_1<THRESHOLD) //かつ左側のセンサーが黒なら {Off(OUT_A+OUT_C);OnFwd(OUT_A);}//左折する } else if(SENSOR_1<THRESHOLD) //左側のセンサーが黒で { } } } task follow_line_back_2() //ラインに沿って後進するプログラム { while(true) { if(SENSOR_1>THRESHOLD) //左側のセンサーが白で { if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら {Off(OUT_A+OUT_C);go_back;} //後進 else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら {Off(OUT_A+OUT_C);turn_left;} //左旋回 } else if(SENSOR_1<THRESHOLD) //左側のセンサーが黒で { if(SENSOR_3>THRESHOLD) //かつ右側のセンサーが白なら {Off(OUT_A+OUT_C);turn_right;}//右旋回 else if(SENSOR_3<THRESHOLD) //かつ右側のセンサーが黒なら {Off(OUT_A+OUT_C);go_back;} //後進 } } } **パックを排除するロボット [#x175aadf] ***構造と仕組み [#i95dc0b5] このロボットの構造は、他のグループと同様にタッチセンサーが備わったバンパーと上から下ろされるアームでパックをはさみ、パックを移動させます。~ パックは、3個程度までなら回収できます。~ 移動には、光センサーのみが使用されます。 ***完成 [#n216b881] ***工夫した点・苦労した点など [#u29ed85b] ***問題点 [#mb65bd46] ***プログラム [#y4a54e69] *感想 [#jad47c94] *コメント [#me0d2489] #comment