[[2012b/Member]]~ &size(18){目次}; #contents *課題1[#ka48748d] #ref(2012b/Member/naotoxu/Mission1/2012b-mission1.png,100%,課題1コース図) ※2012年度後期/課題ページの図を使いました。 図のようなコースを各自で作成した上で、次のような動作をするロボットを作成せよ。 +スタート地点から出発し、スタート地点外のすぐ近くに置かれたピンポン玉をつかむ。 +ピンポン玉をつかんだら速やかにスタート地点の境界の黒線に戻り、そこから黒線に沿って動いてゴール地点を目指す。ただしT字路では、直進、右折、左折を正しく判断させること。また、曲線部中央の障害物に接触しないようにすること。 +ゴール地点に到達したら、ゴールエリア外からピンポン玉をゴールにシュートする。 ただし、どうしてもエリア外からのシュートが難しい場合は、エリア内からシュートした後、エリアから出てもよい。 *メンバー [#pde98dde] -naotoxu このページの作成者。機械システム工学科 -candle 頼れる相方。情報工学科 *ロボットの説明 [#v98318c4] -作っていく過程などは記録していなかったので、本番に走ったロボットのみの説明 #ref(2012b/Member/naotoxu/Mission1/zentai.jpeg,80%,上からの写真) 本番用のロボット、名前はない。 横幅を抑え、大きさもコンパクトにした。 光センサーは、より車軸に近づけ誤差を少なくした。 写真を見て分かるようにピンポン玉をつかんで離す動きしかできない。つまり、シュートは自らゴールに入る形になった・・・。 #ref(2012b/Member/naotoxu/Mission1/hasami1.jpeg,60%,ピンポン玉をつかむ機構1) #ref(2012b/Member/naotoxu/Mission1/hasami2.jpeg,60%,ピンポン玉をつかむ機構2) ピンポン玉をつかむ機構。 モーターの動力をゴムで歯車に伝えそれに応じて動く、という簡単な機構。 次は車体の後ろにある補助輪。 滑らかに曲がるためには地味に重要なパーツ。 #ref(2012b/Member/naotoxu/Mission1/hojorin.jpeg,80%,補助輪) パッと見てどうなっているかわからないので~ これを、 #ref(2012b/Member/naotoxu/Mission1/hojorin_kaisetu.png,wrap,60%,補助輪解説) ブロックの上の部分が360度回転するので平面内なら自由自在に移動できる。 最後に横からの写真 #ref(2012b/Member/naotoxu/Mission1/yoko.jpeg,80%,横からの写真) 両側から本体を固定し、安定度を増した。 *プログラムの説明 [#d55bb747] **本番で使ったプログラム [#u450a4f7] -プログラムの概要 前半に急カーブの数が一定量を越えたら交差点渡りモードになり、交差点を渡り終えたら再び急カーブの数を数え、それが一定量を越えるとシュートモードになるというプログラム #define THRESHOLD 42 //しきい値、調節してこの値になった #define HIPOWER 7 //直線用のパワー #define LOWPOWER 2 //カーブ用のパワー #define set_power_H SetPower(OUT_AC,HIPOWER); //直線用のパワーをモーターにセット #define set_power_L SetPower(OUT_AC,LOWPOWER); //カーブ用のパワーをセット #define go_forward set_power_H; OnFwd(OUT_AC); //直進 #define turn_left1 set_power_L; OnRev(OUT_A); OnFwd(OUT_C); //左旋回 #define turn_left0 set_power_L; Off(OUT_A); OnFwd(OUT_C); //左折 #define turn_right0 set_power_L; OnFwd(OUT_A); Off(OUT_C); //右折 #define turn_right1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); //右旋回 #define STEP 1 //1回の判断で動作させる時間(これは1/100秒) #define n0MAX 15 //通常のカーブとして許容できる繰り返しの最大値 #define n1AMAX 2 //コース前半の急なカーブの最大値 #define n1BMAX 4 //コース後半の急なカーブの最大値 #define n1AMAX 2 //コース前半の急なカーブと判断される回数 #define n1BMAX 4 //コース後半の急なカーブと判断される回数 #define short_break Off(OUT_AC); Wait(100); //小休止 #define CROSS_TIME 20 //交差点を渡る時間 /* 交差点を渡る */ #define cross_line set_power_L; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break; /* ピンポン玉をつかむ */ #define catch_ball set_power_L; Wait(300); OnRev(OUT_B);\ Wait(50); Off(OUT_B);OnFwd(OUT_AC); Wait(100); OnFwd(OUT_B);\ Wait(50); Off(OUT_B); OnRev(OUT_AC); Wait(20); Off(OUT_AC); Wait(100); /* ピンポン玉をゴールにねじ込む */ #define kick_ball OnFwd(OUT_AC); OnRev(OUT_B);\ Wait(150); Off(OUT_B); OnRev(OUT_AC); Wait(150); Off(OUT_AC); #define first_time 400 //交差点を認識する時間 task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); //光センサーをセット int n0nline=0; //続けて黒になった回数(カウンタ) int n1nline=0; //急カーブの回数 catch_ball; while(n1nline < n1AMAX) //急なカーブが2回あるまで{}の中を繰り返す(n1AMAXは2なので) { while(n0nline < n0MAX) //急なカーブがあるまで繰り返す { if (SENSOR_2 < THRESHOLD -4){ turn_left1; n0nline++;} //より暗いとき左旋回してカウンタを1増やす else if (SENSOR_2 < THRESHOLD -2){ turn_left0; } //暗いとき左折 else if (SENSOR_2 < THRESHOLD +2){ go_forward; } //中間のとき直進 else if (SENSOR_2 < THRESHOLD +4){ turn_right0; } //明るいとき右折 else { turn_right1; } //より明るいとき右旋回 Wait(STEP); } PlaySound(SOUND_UP); //急なカーブの度に高い音を1回鳴らす n0nline=0; //カウンタをリセット n1nline++; //急なカーブの数をカウント } n1nline=0; ClearTimer(0); //タイマーをリセットして開始 while(FastTimer(0) <= first_time) //交差点を渡りきるまで繰り返す { while(n0nline < n0MAX) { if (SENSOR_2 < THRESHOLD -4){ turn_left1; n0nline++; } else if (SENSOR_2 < THRESHOLD -2){ turn_left0; } else if (SENSOR_2 < THRESHOLD +2){ go_forward; } else if (SENSOR_2 < THRESHOLD +4){ turn_right0; } else { turn_right1; } Wait(STEP); } short_break; //小休止 turn_right1; Wait(n0MAX*STEP); //進行方向修正 cross_line; //交差点を渡る n0nline=0; //カウンタをリセット } n0nline=0; while((FastTimer(0) > first_time)&&(n1nline <n1BMAX)) //急なカーブが4回あるまで(最後のT字路を含む)繰り返す { while(n0nline < n0MAX) { if (SENSOR_2 < THRESHOLD -4){ turn_left1; n0nline++; } else if (SENSOR_2 < THRESHOLD -2){ turn_left0; } else if (SENSOR_2 < THRESHOLD +2){ go_forward; } else if (SENSOR_2 < THRESHOLD +4){ turn_right0; } else { turn_right1; } Wait(STEP); } n1nline++; n0nline=0; PlaySound(SOUND_DOWN); //急なカーブがある度に低い音を鳴らす } short_break; turn_right1; Wait(n0MAX*STEP); Off(OUT_AC); //方向転換 kick_ball; //シュート } -このプログラムでは急なカーブをロボットが判断するかどうかが不安定だった。 -n0MAXの値を何回も入れて試し、大きい値だと急なカーブに入っても急なカーブであると判断されないので、調節した。 -最後のシュートはピンポン玉を蹴るのではなく、押し込む形になった。 *まとめ [#fc3b8df3] **工夫した点 [#c2019c55] -本番用のコースをきれいに書いた。(割とどうでもいい) -ロボットをコンパクトにしようと心がけ、機構もシンプルに仕上げた。 -いろんな値を入れる際に時間をかけてふさわしい値を探した。特に、しきい値は急カーブを曲がるときにうまくいかなかったため光センサーの値を見ながら調節をした。 -急なカーブの度に音を鳴らしてわかりやすくした。 **反省点 [#ub84444a] -一番はシュートをしていないこと、機構がうまくいかなかった。もともとは歯車の軸に棒をつけて軸が回る動きに合わせてピンポン玉を打つ機構だったが、打つ力が足りなくてだめだった。 -パーツを作る担当を明確に分けなかった点。 -プログラムは改善すべき点がたくさんあった。特に急カーブの判定は、よりゆっくりやるようにしてタイマーをもっとうまく使うべきだった。 **感想 [#y3b80752] -はじめてロボットとプログラムを自分で作って、戸惑うことが多々あった。 -だが、やっていると楽しさもわかってきてもう少し時間をかければよかったと思った。 -プログラムや機構にいたらない点が多かったのでこの経験を次の課題に生かして、より精度の高いものを作れれば、と思った。