今回の課題は上の画像のコースをA地点からB地点まで黒い線に沿って走るロボットの作成である。
また画像の黄色の点のピンポン玉をとり、B地点のゴールに入れる。
途中、三叉路と交差点で2秒間停止し直進することが課題となる。
車型の本体にツメのついたかごが前方にあるロボットである。
ボールをかごに入れ、回り続けるツメでつかむことでボールを運ぶ。
この時ボールをつかんでもツメは回り続けているので、モーターに負荷をかけないようにギアを輪ゴムにしている。
また、ギアを調節してツメの速さをゆっくりにしたことと、かごの奥行を広くとったことでどのタイミングでボールに近づいてもボールを取り逃がさないようにしてある。
ツメの形を鉤のようにしているのもボールをしっかり掴むための工夫である。
前方に付けるよりもセンサーが正しく反応するのではないかと考え、光センサーを中心あたりに付けた。
#define THRESHOLD 45 //ライトセンサーの基準値を45に設定 #define MOVE_TIME 45 #define go_straight OnFwd(OUT_AC);ClearTimer(0); //直進 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);ClearTimer(0); //右旋回して軌道修正 #define turn_left OnFwd(OUT_C);OnRev(OUT_A); //左旋回 #define short_break Off(OUT_AC);Wait(200);ClearTimer(0); //交差点で小休止 #define cross_line OnFwd(OUT_AC);Wait(30);ClearTimer(0); //交差点を渡る task main() { OnFwd(OUT_ABC); //スタートからラインまで直進しツメを回す Wait(100); Off(OUT_AC); SetSensor(SENSOR_1,SENSOR_LIGHT); //端子1にライトセンサー CiearTimer(0); repeat(3){ //以下の{}内を3回繰り返す while(FastTimer(0)<=MOVE_TIME){ //左旋回の時間が0.45以下の間繰り返す if(SENSOR_2<THRESHOLD-4){ //黒線の時、 turn_left; //左に軌道修正 }else if(SENSOR_2<THRESHOLD){ //境界付近の時、 go_straight; //直進 }else if(SENSOR_2<THRESHOLD+10){ //白線の時、 turn_right; //右に軌道修正 } Wait(1); //0.01秒続ける } short_break; //小休止し、 turn_right; //車体の向きを戻し、 Wait(MOVE_TIME); cross_line; //交差点を渡る } Off(OUT_AC); OnRev(OUT_AC); //後退し、 Wait(50); Off(OUT_AC); OnRev(OUT_B); //ツメを逆回転させてボールを出し、 Wait(100); OnFwd(OUT_AC); //直進してゴールに入れる、 Wait(50); Off(OUT_ABC); }
カウンターではなくタイマーを使った。
左旋回の時以外はタイマーをリセットするようにしてある。
タイマーがリセットされない時間が0.45秒を超える(左旋回が0.45秒を超える)と交差点と認識して小休止と横断を行う。
交差点判定の左旋回の時間は、交差点とカーブを認識するように調節を重ねた。今回一番大変だった点である。
三叉路と交差点がゴール前を含めて3つあるので、交差点判定を3回繰り返してシュートするプログラムを作った。
色の判定は3段階で問題なくスムーズにいったので5段階は作らなかった。
45をセンサーの基準として41以下は黒線、45以上は白線と認識している。
ツメを逆回転させるだけではうまくシュートできないことがあるので、車体を前進させることで押し込むようにシュートさせている。
今回の課題はセンサーの判定によって動くロボットなので、交差点とカーブをいかに正しく判定させるかが難しかった。
車体の入射角度によってはうまく交差点と判断しなかったり、急なカーブを交差点と判断してしまったりと問題が多かった。
そこでカウンターではなくタイマーを使ったところうまくいくようになった。
改善点としてうまくボールを取れないことがあったことがあげられる。
ツメを回すことによりボールを掴むため、ツメが丁度前方にいってしまうとボールに当たって失敗してしまう。
奥行とツメのスピードを抑えたことで成功率を上げたが、失敗を全てカバーできなかったのは改善したい。