[[2006a/MemberOnly/進行状況C]]
*ロボコン大会のページ (缶を転がして所定の位置まで運ぶ) [#yd6f7d73]
**制作者 [#t2e49820]
たかくん

ほたる

サルバカ

子供の頃から神童

二等兵

ツノハラ

**ロボットの紹介 [#w7acf935]





**モーターとセンサーの役割 [#efcfabdd]
モーターは3つ使い、そのうち2つはタイヤに使った。残りの1つは缶にかぶせる囲いを上げたり下げたりするものに使った。

黒い線上を走るとき、ライントレースをせずに、それぞれ格子の一辺を走る長さを測って走らせることにした。

また、タッチセンサーも使っており、2つ使って感度を上げ、そうして、缶が転がってきたときにロボットにぶつかったら囲いを下ろす仕組みとした。



**プログラムの概要 [#p1c93f79]
***缶を受け渡す側のロボット(前半) [#e1a264f6]




***缶を受け取る側のロボット(後半) [#wc549b9c]
まず、転がってきた缶をタッチセンサーで感知したら、缶を閉じ込める囲いを下ろす。次に、時間で計った分だけ走らせて、缶を運ぶ。そして、缶を入れるゴールの手前まできたら、囲いを上げ、そのまま缶を押していき、木の塀にぶつかっても、そのまま缶を押して缶を押し出して、ゴールに入れる。


**プログラム [#jc971973]
 void turn_right(int t)
 {
    OnFwd(OUT_A);
    OnRev(OUT_C);
    Wait(t);
 }

 void turn_left(int u)
 {
    OnFwd(OUT_C);
    OnRev(OUT_A);
    Wait(u);
 }

 void go_straight(int v)
 {
    OnFwd(OUT_A+OUT_C);
    Wait(v);
 }

 void back(int w)
 {
    OnRev(OUT_A+OUT_C);
    Wait(w);
 }

 int time;
 int time_1;

 task main()
 {
   
    SetSensor(SENSOR_1,SENSOR_LIGHT);
    SetSensor(SENSOR_2,SENSOR_TOUCH);
    SetSensor(SENSOR_3,SENSOR_LIGHT);
    SetPower(OUT_A,5);
    SetPower(OUT_C,7);
   
    ClearMessage();
    until(Message()!=0);
   
    ClearTimer(1);
    OnFwd(OUT_A+OUT_C);
    until(SENSOR_2==1);
    OnRev(OUT_B);
    Wait(30);
    Off(OUT_A+OUT_B+OUT_C);
    time_1=FastTimer(1);
    back(time_1);
   
    ClearTimer(0);
    OnRev(OUT_A+OUT_C);
    until(SENSOR_1<40&&SENSOR_3<40);
    time=FastTimer(0);
    turn_left(400/4);
    back(100+time);
    turn_right(400/4);
    Off(OUT_A+OUT_B+OUT_C);
    Wait(200);
    OnFwd(OUT_B);
    Wait(40);
    Off(OUT_B);
    go_straight(200);
    OnRev(OUT_A+OUT_C);
    until(SENSOR_1<40&&SENSOR_3<40);
    turn_left(380/4);
    go_straight(90+time);
    turn_right(380/4);
    go_straight(50);
    OnFwd(OUT_A+OUT_C);
    until(SENSOR_1<40&&SENSOR_3<40);
    Off(OUT_A+OUT_B+OUT_C);
   
    SendMessage(2);
    Wait(400);
 } 

**缶を受け取る方のプログラム(後半) [#v4087dad]

 #define TURN_TIME 467  
 #define STR10_TIME  62

 task main()
 {
 SetPower(OUT_A,5);
 SetPower(OUT_C,7);
 SetPower(OUT_B,1);
 SetSensor(SENSOR_1,SENSOR_LIGHT);
 SetSensor(SENSOR_3,SENSOR_LIGHT);

 OnFwd(OUT_A+OUT_C);
 until (SENSOR_1 < 36&&SENSOR_3<36);
 Off(OUT_A+OUT_C);

 OnFwd(OUT_C);
 OnRev(OUT_A);
 Wait(80);



 OnFwd(OUT_A+OUT_C);
 Wait(155);
 Off(OUT_A+OUT_C);

 OnFwd(OUT_C);
 OnRev(OUT_A);
 Wait(100);



 OnFwd(OUT_A+ OUT_C);
 Wait(STR10_TIME*3);
 Off(OUT_A+OUT_C);

 OnFwd(OUT_B);
 Wait(130);
 Off(OUT_B);

 OnRev(OUT_A+OUT_C);
 Wait(STR10_TIME*3);
 Off(OUT_A+OUT_C);

 OnFwd(OUT_C);
 OnRev(OUT_A);
 Wait(100);

 OnFwd(OUT_A+OUT_C);
 Wait(STR10_TIME*3);


 OnFwd(OUT_A);
 OnRev(OUT_C);
 Wait(100);

 OnFwd(OUT_A+ OUT_C);
 Wait(STR10_TIME*5);
 Off(OUT_A+OUT_C);

 OnRev(OUT_B);
 Wait(260);
 Off(OUT_B);


 SendMessage(1);
 Wait(500);
 ClearMessage();
 until(Message()!=2);
 Wait(700);
 start main;
 }









**工夫した点、苦労した点 [#v61ccbd8]
缶を最後押し出すとき、どのようにして木の塀を越えるか

これは、ロボットが塀にぶつかった時にロボットが上に押し出されたことから考えて、斜めの傾斜のついたブロックをロボットの前方につけた。そしてロボットが塀にぶつかったときに、さらにロボットが缶を押し出すと、缶が傾斜を上り、そうして塀を乗り越える。これは、限られたモーターを使って缶を上げたり閉じ込めたりしなければならないというときに、ロボットを作るときにおいて、工夫して解決した点であった。

黒い線上を走らせるときに、どのようにしてラインとレースをさせるか

ここでは、今までの、1本の線上をライントレースさせるものとは違い、いくつもの線が交差し、交点上を旋回したり、直進したりしなければならないということが問題であった。最初は、ライントレースでやろうと思い、まず、1つのライトセンサーによってライントレースしようとした。しかし、1つのライトセンサーでやったのでは、やはり黒い線上の境界線上しか走らず、交点という、黒い所の固まりを処理することは難しいという結論になった。そこで、ライトセンサー2つでやることになった。これで、その考え方とは、2つのライトセンサーが、黒い線を挟む形で進んでいくものとした。つまり、黒い線上の脇の白いところをセンサーは進んでいくということにした。そこで、黒い線上に向かって左側のセンサーが乗っていたら、白いところに戻したいということで、左に旋回し、右側のセンサーが黒い線上に乗っていたら、右に旋回するというようにした。さらに、線の交点では、それまで白いところを走っていたセンサーが、黒いとろに乗るため、そこで、2つのセンサーが黒いところに乗ったらという条件で、そのときに、旋回や、直進をすることとした。そうして、最初の格子の一辺を走ったまでの時間を変数で定義した上で、記憶し、その時間だけ格子単位でまたライントレースさせていくこととした。
しかしここで問題があった。それは、ifで条件としてやったが、どうしても条件が重なってしまって、うまく行動しないのである。黒い線上に来たら左に旋回し、または右に旋回しというようにしていて、さらに、両方のセンサーが黒いところにきたら、一方方向に旋回させるなどというようにしてあった。つまりここで、交点のところで条件が重複し、左旋回と右旋回が連続しておこり、結果的に直進するか、一方方向に旋回するかわからなくなってしまうのである。これより、右のセンサーが今度は白い線上に来たら左旋回するというようにしても問題がある。それは、ともにともに白いところにセンサーがきたときに直進するというようにしていたが、その条件と今度は重複し、うまく行動しないのである。
そこで、もしかしたらずれることはあるかもしれないが、簡単で、確実な、時間を計って走らせることにした。格子の一辺を走るのにかかる時間を缶を持ったときと、持たないときとでそれぞれ調べ、その分だけ走らせることにした。

缶を閉じ込める囲いをどのようにして作るか

缶がロボットに比べて大きいため、それを囲むような大きな囲いを作るのは大変だった。モーターも残り一つしかないため、それで多くの動きもできないため、缶を持ち上げたり、運んだり、缶を引き寄せて持ったり、最後に缶を下ろしたりということが難しかった。そこで、囲いを下ろして缶を閉じ込めるというだけの動きをして、さらに、最後ゴールに押し込むという動作は、モーターを使わずにやることにした。

缶を閉じ込めるときにはどのようにして囲いを下ろすか

これは、プログラムの話である。ここでは、一見簡単なように思えて、難しかった。缶がタッチセンサーに当たって、反応しても、そこで缶はバウンドし、前方へと缶がいってしまう。囲いが下ろすのが遅くて、囲いの中に缶が入らなくなってしまう。そこで、囲いを上げたままにして、缶が転がってきたら、こちらも前進していく。そして、缶がタッチセンサーに当たったら、前進と同時進行で囲いを下ろし、下ろしきったらまた線上を走っていくものとした。これで缶が跳ね返ってはなれていくものを追いかけるようにしながら囲いを下ろすようにした。


**コメントをどうぞ [#nef49f3f]
#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS