[[2012b/Member]] #contents *メンバー [#j4b177c9] -j-abc&br; -vocalist *課題1の説明 [#c33ef1d9] + スタート地点から出発し、スタート地点外のすぐ近くに置かれたピンポン玉をつかむ。 + ピンポン玉をつかんだら速やかにスタート地点の境界の黒線に戻り、そこから黒線に沿って動いてゴール地点を目指す。ただしT字路では、直進、右折、左折を正しく判断させること。また、曲線部中央の障害物に接触しないようにすること。 + ゴール地点に到達したら、ゴールエリア外からピンポン玉をゴールにシュートする。 ただし、どうしてもエリア外からのシュートが難しい場合は、エリア内からシュートした後、エリアから出てもよい。 CENTER:&ref(2012b/Member/j-abc/Mission1/kadai1_course.png,100%,課題1のコース); *ロボットの説明 [#c67ef93e] CENTER:&ref(2012b/Member/j-abc/Mission1/robot.jpg,70%,どこかで見たことあるような・・・); **全体について [#i19e9438] &ref(2012b/Member/j-abc/Mission1/robot_wide.jpg,50%,ギリギリセーフ); &ref(2012b/Member/j-abc/Mission1/robot_balance.jpg,50%,ずれてるよ〜); +ロボット本体はmindstormsに付属されていた説明書の初期状態から大幅に改造を行い、 ポールにギリギリではあるが接触しない程度の小型化を行った。 +本体をロボットの中心に置きそこの横にアームを取り付けるとアーム側にロボットが傾きバランスが悪くなったので、本体を少しずらすことでロボットのバランスをとった。&br; (赤ラインがロボットの中心である) **ライトセンサについて [#t9a8d198] &ref(2012b/Member/j-abc/Mission1/robot_sensor.jpg,50%,ロボットの裏側); -ライトセンサを車軸に近づけることで、より正確にロボットがラインの位置を把握できるようにした。 **アーム(シュート機構)について [#d90a30b8] ***ボールのロック [#e770f713] &ref(2012b/Member/j-abc/Mission1/robot_lock1.jpg,50%,矢印の方向に動いて);→ &ref(2012b/Member/j-abc/Mission1/robot_lock2.jpg,50%,ボールをロック); -青の矢印の方向に回ることで、バーが赤の矢印の方向に動きボールをロックする。 ***ボールのシュート [#ed3a66c8] &ref(2012b/Member/j-abc/Mission1/robot_shoot1.jpg,50%,矢印の方向に動いて);→ &ref(2012b/Member/j-abc/Mission1/robot_shoot2.jpg,50%,こうなって);→ &ref(2012b/Member/j-abc/Mission1/robot_shoot3.jpg,50%,こーなって);→ &ref(2012b/Member/j-abc/Mission1/robot_shoot4.jpg,50%,シュート!!); -青の矢印の方向に回ることで、バーが赤の矢印の方向に動きボールをシュートする。 *プログラムの説明 [#ecbd6e15] **プログラム [#x95fe75b] #define THRESHOLD 47 // 閾値 #define SPEED_H 50 // 通常時の速度 #define SPEED_L 30 // 旋回時の速度 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H, SPEED_H); // 前進する #define turn_left1 OnRL(SPEED_L, -SPEED_L); // 左旋回する #define turn_left0 OnRL(SPEED_L, 0); // 左折する #define turn_right0 OnRL(0, SPEED_L); // 右折する #define turn_right1 OnRL(-SPEED_L, SPEED_L); // 右旋回する #define STEP 1 // 1回の判断で動作させる時間 #define nMAX 250 //通常のカーブとして認識できる回数のの最大値 #define short_break Off(OUT_BC); Wait(100); // 少し止まる #define CROSS_TIME 600 // 交差点を渡る時間 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; //T字路を渡る #define shoot_back OnRL(-SPEED_L,-SPEED_L);Wait(CROSS_TIME);short_break; //シュート位置の調整のための後退 #define ball_lock OnFwd(OUT_A,-40);Wait(500) //ボールをロックする #define shoot_ball OnFwd(OUT_A,70);Wait(1); //ボールをシュートする task main() { SetSensorLight(S3); int black_count=0; // 続けて黒になった回数 (カウンタ) int cross_count=0; // T字路を認識した回数 long startTime; // 競技が始まった時間 long cross1Time; // 1回目のT字路を認識し渡り終わった時間 startTime = CurrentTick(); //競技が始まった時間を記録させる go_forward //ボールの位置まで前進する Wait(500); Off(OUT_BC); ball_lock; //ボールをロックする Off(OUT_A); turn_right0;Wait(1500); //ラインに戻るように右折する Off(OUT_BC); while (cross_count < 2) { while(CurrentTick() - startTime < 12000){ // 競技が始まってから12秒間T字路を認識せず進む if (SENSOR_3 < THRESHOLD-12) { // センサーの値が35より低いとき左に旋回 turn_left1; } else { if (SENSOR_3 < THRESHOLD-7) { // センサーの値が36〜39の場合、左に旋回 turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { // センサーの値が41〜53の場合、前進する go_forward; } else if (SENSOR_3 < THRESHOLD+15) { // センサーの値が54〜61の場合、右旋回する turn_right1; } else { // どの条件にも合わない場合右旋回する turn_right1; } Wait(STEP); } while ((black_count < nMAX)&&(cross_count < 1)){ // T字路を認識するプログラムで動く if (SENSOR_3 < THRESHOLD-12) { turn_left1; black_count++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-7) { turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right1; } else { turn_right1; } black_count=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 turn_right1; Wait(nMAX*STEP); // 進行方向修正 cross_line; // 交差点を渡る cross_count++; // T字路を認識したカウンターを1増やす black_count=0; // カウンタをリセット cross1Time = CurrentTick(); // 1回目のT字路を渡り終わった時間を記録する while (CurrentTick() - cross1Time < 16000){ // T字路を渡ってから16秒間T字路を認識せず進む if(SENSOR_3 < THRESHOLD-12) { turn_left1; black_count++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-7) { turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right1; } else { turn_right1; } black_count=0; // カウンタをリセット } Wait(STEP); } while (black_count < nMAX){ // T字路を認識するプログラムで進む if (SENSOR_3 < THRESHOLD-12) { turn_left1; black_count++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-7) { turn_left1; } else if (SENSOR_3 < THRESHOLD+7) { go_forward; } else if (SENSOR_3 < THRESHOLD+15) { turn_right1; } else { turn_right1; } black_count=0; // カウンタをリセット } Wait(STEP); } short_break; // 小休憩 turn_right1; Wait(nMAX*STEP); // 進行方向修正 cross_line; // 交差点を渡る cross_count++; black_count=0; //カウンタをリセット if(cross_count == 2){short_break; // 2回目のT字路を認識したらシュートする shoot_back; shoot_ball; Off(OUT_BC); } } } **プログラムの説明 [#z7109826] &ref(2012b/Member/j-abc/Mission1/kadai1_course2.png,70%,コースの説明その壱); &ref(2012b/Member/j-abc/Mission1/kadai1_course3.png,70%,コースの説明その弐);&br; このプログラムは左図の赤い矢印のようにラインの左側をトレースを行うプログラムである。&br; &br; ボールをとりに行く&br; ↓&br; 橙1の区間では青1のT字路を渡らないように、青1を通過するまでの間(12秒)T字路を無視するプログラムで進む。&br; ↓&br; 黄1区間では緑1のT字路を渡るように、T字路を認識させるプログラムで進む。また、このT字路を渡り終わった時にT字路を認識したカウンターを1増やす。&br; ↓&br; 橙2の区間では青2の直角をT字路と誤認識しないように、青2を通過するまでの間(16秒)T字路を無視するプログラムで進む。&br; ↓&br; 黄2区間では緑2のT字路を認識させるように、T字路を認識させるプログラムで進む。そして、T字路と認識したところで再びT字路を認識したカウンターを1増やす。&br; ↓&br; T字路を認識したカウンターが2になったところで、ボールをシュート +ボールをとりに行く&br; +橙1の区間では青1のT字路を渡らないように、青1を通過するまでの間(12秒)T字路を無視するプログラムで進む。&br; +黄1区間では緑1のT字路を渡るように、T字路を認識させるプログラムで進む。また、このT字路を渡り終わった時にT字路を認識したカウンターを1増やす。&br; +橙2の区間では青2の直角をT字路と誤認識しないように、青2を通過するまでの間(16秒)T字路を無視するプログラムで進む。&br; +黄2区間では緑2のT字路を認識させるように、T字路を認識させるプログラムで進む。そして、T字路と認識したところで再びT字路を認識したカウンターを1増やす。&br; +T字路を認識したカウンターが2になったところで、ボールをシュート *感想 [#wf94abbb] 初めは簡単に課題をクリアできると思っていたけれど、実際に課題に取り組んでみるとロボット自体を大幅に改良する必要があり、アームの構造を考え形にすることは思っていたよりかなり難しかった。プログラムも考えは思いついたもののそれを実際にプログラムとして書くことはなかなかできなくとても苦労した。プログラムが書けた後もライトセンサの値など調整をする必要があり課題をクリアするのには時間がかかった。しかし、相方とうまく時間を合わし協力して課題に取り組むことができたので無事課題をクリアでき満足のいくロボットを作ることができた。 上手くいかないところもあったが、自分が思っていた通りにロボットが動いた時はとてもう嬉しく、達成感がすごくあった。 次の課題も上手くいくように頑張ろうと思う。