C6ロボコンのページ

robokonn1_Medium.jpg

左が紙パックを受け取る1号。右が紙パックを押し出す2号です。

全体の構想

  • 紙パックは一番手前の3つをカゴに入れることに専念する。他はあきらめる。(最初は全部入れる気だったんですよ)
  • 交差点に対応するため、二つのセンサーでラインをはさむようにライントレースする。
  • 2台のロボを使い、一台は紙パックを運び、もう一台は運ぶマシンに乗せるために積み込みを行う。
  • マシンの大きさに制限(32cmの立方体)があるため、1個ずつ紙パックを運ぶ。
  • 運ぶマシンはベルトコンベアのようなもので紙パックを受け取る。
  • ベルトコンベアを使って、紙パックをカゴの淵の高さまで上げ、コンベアを動かすだけでカゴに落とす。
  • よって、マシン右側のコンベアを斜めにして、積み易くし、左側を淵より高くする。右から積んで左から落とす。
    robokonn3_Medium.jpg
    運ぶマシン(1号)を後ろから見た図

全体の流れ

robocon2005-plane.jpg
  • 1号は最初、本体の右側を紙パックに横付けしています。
  1. 開始と同時に積み込みを開始する。2号が紙パックを押し出し、1号のベルトコンベアに1個載せる。
  2. 1号は道なりにカゴゾーンに向かい、2号は待機する。
  3. カゴゾーン入り口(赤い丸)の所で、180度方向転換し、後退でカゴゾーンに入る。(マシンの左側からしか紙パックをカゴに入れられない構造のため)
  4. 指定の色のカゴの前まで後退し、ベルトコンベアから紙パックを落とす。
  5. 前進してカゴゾーンを抜け、紙パックゾーンへ向かう。
  6. 復路では紙パックゾーンの入り口(青い丸)の所で180度方向転換し、元の向きで初期位置まで後退する。
  7. 2号機にメッセージを送り、2号機が2個目の紙パックを押し出し、また最初から繰り返す。
  • 3個運ぶと終了。

ロボットの特徴、工夫した点

robokonn4_Medium.jpg

やっぱりこのキャタピラを使ったベルトコンベア装置でしょう。

  • 運ぶときも、置くときも安定しています。掴む方式では不安定なのではないかということから考え出しました。
  • 低い位置にある紙パックも回収できるようにと作ったので、2号機の高さを変えれば低い位置の紙パックも乗ります。
  • 実は、説明書のキャタピラと同じ作りになっており、説明書に書いてある基本の構造の応用、組み合わせで複雑な処理をするマシンを作ろうという、壮大(?)な計画だったのです。

プログラム

1号のプログラム(運ぶマシン)

//    作成者:山崎
//    作成日:2006-2-7

#define tuuka 44//ラインを横切る時間1/100秒
#define turn 140//曲がる時間1/100秒
#define usetumae 186//右折前の前進時間1/100秒
#define yoko 30//カゴ、紙パックの横まで移動する時間1/10秒

 sub trace (){                                        //移動するときに常に使用するサブルーチンです。
              while((SENSOR_1 >40) || (SENSOR_3 >40)) //センサーが両方黒になるまで繰り返す
              {
               OnFwd(OUT_A+OUT_B);
               until((SENSOR_1 <40) || (SENSOR_3 <40)); //センサーが両方白なら前進
               if(SENSOR_1 <40)                         //左センサーが黒なら左折
               {
                OnFwd(OUT_B);
                Off(OUT_A);
                Wait(10); //ここにuntilを使わないのは交差点で一時停止させるためです。
               }
               if(SENSOR_3 <40)                        //右センサーが黒なら右折
               {
                OnFwd(OUT_A);
                Off(OUT_B);
                Wait(10);
               }
              }
             }

 sub back () {                                        //traceサブルーチンの後退版です。
              while((SENSOR_1 >40) || (SENSOR_3 >40)) 
              {
               OnRev(OUT_A+OUT_B);
               until((SENSOR_1 <40) || (SENSOR_3 <40)); 
               if(SENSOR_1 <40)                         
               {
                OnRev(OUT_B);
                Off(OUT_A);
                Wait(10); 
               }
               if(SENSOR_3 <40)                        
               {
                OnRev(OUT_A);
                Off(OUT_B);
                Wait(10);
               }
              }
             }

 sub right (){                         //交差点で90度右折するサブルーチンです。
                   OnFwd(OUT_A+OUT_B); //正確に曲がるために少し前進してから曲がります。
                   Wait(usetumae);
                   OnFwd(OUT_A);
                   OnRev(OUT_B);
                   Wait(turn);          //この間に、本体の前に伸びているラインを左センサーがまたぎます。
                   until(SENSOR_1 <40); //ある程度曲がった後、左右のセンサーが右に伸びているラインをはさんだら回転終了
                   Off(OUT_A+OUT_B);
                  }

 sub turn180 (){               //180度回転して真後ろに方向転換します。
                 OnFwd(OUT_A);  //方向転換                  
                 OnRev(OUT_B);
                 Wait(250);     //センサーに前に伸びているラインと右に伸びているラインをまたがせます。
                 until(SENSOR_1 <40); //左センサーが黒になるまで回転。後ろに伸びているラインを左右のセンサーがはさみます。
               }
 
 sub yokoduke (){  //紙パックや、カゴの横まで移動するサブルーチンです。
                  ClearTimer (0); //タイマーを使ってwhileでの繰り返しから抜けるようになっています。
                  while( Timer(0) <= yoko ) 
                 {
                   OnRev(OUT_A+OUT_B);
                   until((SENSOR_1 <40) || (SENSOR_3 <40));
                   if(SENSOR_1 <40)
                   {
                     OnRev(OUT_B);
                     Off(OUT_A);
                     Wait(10);
                   }
                   if(SENSOR_3 <40)
                   {
                     OnRev(OUT_A);
                     Off(OUT_B);
                     Wait(10);
                   }
                 }
              }

 task main ()
{
 SetSensor(SENSOR_1, SENSOR_LIGHT); //左センサー。左右のセンサーでラインをはさんで移動します。
 SetSensor(SENSOR_2, SENSOR_LIGHT); //右センサー
 SetSensor(SENSOR_3, SENSOR_LIGHT); //持った紙パックの色を識別するセンサー
 int i; //持った紙パックの色を表す変数


 repeat(3)        //一番手前の3箱を運べるように3回往復します。(その他の箱はあきらめています。)
  {
   OnFwd(OUT_C);  //2号と同時にスタートし、2号に紙パックを押し出してもらい、1号はベルトコンベアを動かして紙パックを乗せます。
   Wait(300);
   Off(OUT_C);

   trace ();      //最初のT字路まで移動 
   right ();      //T字路右折
   trace ();      //缶ゾーン直前のT字路まで移動
   OnFwd(OUT_B);  //左折(左折する場所はY字路感覚の移動になるため、右折とはプログラムが異なります。)                  
   Wait(turn);    //この間に直進してきたラインをまたがせます。
   until(SENSOR_3 <40); //右センサーが黒になるまで左折
 
   trace ();      //缶ゾーンを進みます。缶ゾーンの終わりの交差点まで続けます。

   turn180 ();  //方向転換して、後退でカゴゾーンに入ります。マシンの左側からしか紙パックを置けないためです。                  
   back ();
   OnRev(OUT_A+OUT_B);
   Wait(tuuka);   //最初の交差点は曲がらず、通過します。

   if(SENSOR_2 <40){i=1;} //持った紙パックの色が黒ならi=1とする。
   if(SENSOR_2 >40){i=3;} //持った紙パックの色が緑か白ならi=3とする。(白の場合はこの下のifで上書きされます。)
   if(SENSOR_2 >50){i=2;} //持った紙パックの色が白ならi=2とする。

   switch (i) //iの値によって動作を分岐します。入れたい色のケースの横にマシンを付け、置きます。
   {
    case 1 : //黒を持っているときはここから後のswitch内の処理をすべて行います。(break文を使っていません)
     back ();
     OnRev(OUT_A+OUT_B); //交差点を曲がらずに通過
     Wait(tuuka);
    case 2 : //白を持っているときはここから後のswitch内の処理をすべて行います。
     back ();
     OnRev(OUT_A+OUT_B);
     Wait(tuuka);
    case 3 : //緑を持っているときはここから処理を行います。
     yukoduke ();//カゴの横まで移動します。
                
    Off(OUT_A+OUT_B);
    OnFwd(OUT_C); //キャタピラを回して、持っている紙パックをケースに落とします。
    Wait(300);
    Off(OUT_C);
   }

   switch (i) //カゴゾーンから前進で抜けます。
   {
    case 1 :
     trace ();
     OnFwd(OUT_A+OUT_B); //交差点を曲がらずに通過
     Wait(tuuka);
    case 2 :
     trace ();
     OnFwd(OUT_A+OUT_B);
     Wait(tuuka);
    case 3 :
     trace ();
     OnFwd(OUT_A+OUT_B);
     Wait(tuuka);
   }
   
   trace ();      //缶ゾーンを進みます。

   right ();      //缶ゾーン後のT字路を右折します。
   OnFwd(OUT_B);  //左折                  
   Wait(turn);    //この間に直進してきたラインをまたがせます。
   until(SENSOR_3 <40); //右センサーが黒になるまで左折 
   turn180 (); //方向転換。右側からしか紙パックを乗せられないため、方向をスタート時の向きにします。
   back ();
   OnRev(OUT_A+OUT_B);
   Wait(tuuka);   //最初の交差点は曲がらず、通過します。
   yokoduke ()//紙パックの横まで移動します。 
   
   SendMessage(1); //2号に紙パックを押し出すようにメッセージを送ります。
  }
 }

2号のプログラム(積むマシン)

#define push 85
task main ()
{
   OnFwd(OUT_A); //紙パックを押し出します。この間、1号はベルトコンベアを回して受け取ります。
   Wait(push);
   Off(OUT_A);
   Message() = 0;
  while (true)    {
   if(Message() == 1)//2回目からはメッセージを受け取ると押し出します。
   {
   OnFwd(OUT_A);
   Wait(push);
   Off(OUT_A);
   Message() = 0;
   }
  }
}

結果

robokonn2_Medium.jpg

お!順調!順調! この後、順調にライン外へ逃亡して行きました(逝きました)とさ。めでたしめでたし・・・??

難しかった点

  • 高さが違う紙パックを積み込む方法を考えるのが大変だった。
    紙パックの位置が違うので
  • 取り入れた紙パックをそのまま維持すことが大変だった。
    紙パックをコンベアが上手く巻きこんでいってくれないので
  • 紙パックゾーンから缶ゾーンへ行く手前のT字路をマシンに認識させるのが十字路より難しく、本番でもここで失敗してしまった。
    認識させるプログラムがなかなか思いつかなかったので
  • 紙パックの色の識別をするためにはキャタピラの端まで紙パックを移動させることが必要だったが、うまく乗らなかったり途中で止まったりして苦労した。
    紙パックとマシンの間を少し離してあり、離さないとラインからセンサーが外れてしまうので

解決するために試した策(難しかった点の項目に対応した順序で書いてあります。)

  • アームを付けて位置の低いパックも高いパックも1台で積み込み、運ぼうとした。
    アームが巨大になるうえ、マシンが複雑になるため、確実な高い位置の紙パックのみに絞り、2台目による積み込み策に変更した。
  • コンベアの角度を緩やかになるよう、調整をやり続けた。
    これで紙パックが上手く巻きこめるようになったが、剛性が悪く、たまに角度が変わり、失敗することがあった。
  • T字路ではライントレースをさせ続け、マシンの向きが変わるのを待って、T字路を認識させるようにした。
    ライントレースは毎回微妙にマシンの向きが異なるので、予期せぬ失敗があってラインから外れることがあった。(本番もここで失敗)
  • コンベアの上の紙パックの色を識別する光センサーが紙パックに反応するまでコンベアを動かし、紙パックを積むようにした。
    部屋の明かりで誤動作したり、黒の紙パックを認識しづらいので没。コンベアを動かす時間は固定にした。

反省点

  • チーム内の作業をもっと分担して時間を有効に使えればよかった。
  • 構造はシンプルだが、サイズが巨大なので、移動の制御が大変になってしまった。
  • 早いうちにカゴに入れる紙パックを3つに絞ればよかった。
  • 複雑に考えすぎたところがあり時間を無駄にしてしまったかなと思った。もっとストレートに考えればよかったのかもしれない。
  • もっと計画的に準備ができればよかったと思う。
  • 期末テスト後で集中力が切れていたのが明らかだったと思う。

ロボコンの感想

  • 課題よりも複雑な作業になって、チーム全体としての技術力というもが大事だとわかった。
  • 思うようにいかないことが多く、大変だということはわかっていたが改めて実感させられた。
  • 時間の都合上準備不足であった点は否めないが、なかなかうまくいかず残念であった。

この授業全体を通しての感想

  • チームワークが大事なのはわかっていたが、技術力も同じように大事だとわかった。
  • 思い通りにいかないことがあるなど大変なことがあったけど、そのたび新しいことを学ぶことができたりととても良い勉強になったと思いました。
  • 課題が難しく苦労したが、ロボコンの準備をする上で結構役に立ったのかもしれない。

今後の受講生に残したい一言

  • チーム内で連絡をしっかりとり、全員が仕組みを完全に理解しながら進めて行きましょう。
  • 一人で作業すると気がつかない事があるので、二人以上で確認しながら進めましょう。
  • ロボコンに向けての準備の計画を事前にグループ内でしっかりと決めておかないと後々かなり苦労します。

コメントはこちらへ

  • 要点は非常にすばらしく見やすくまとまっていますね! あとはHOW(どんな風に)などを具体的に、どのように難しくどんなことを試したのか考えたのか、WHY(なぜ)の部分を補足的に箇条書きの下に文章で書くとよいでしょう。 -- まいける(TA) 2006-02-17 (金) 05:24:08
  • コメントありがとうございます。難しかった点に理由の説明をつけ、どのような解決策をしたのかを載せました。 -- 山崎? 2006-02-18 (土) 20:25:27

上へ  C6のTOPへ

tya1 0 &counter([total|today|yesterday]);

添付ファイル: filerobokonn2_Medium.jpg 265件 [詳細] filerobokonn4_Medium.jpg 298件 [詳細] filerobokonn3_Medium.jpg 267件 [詳細] filerobocon2005-plane.jpg 254件 [詳細] filerobokonn1_Medium.jpg 253件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-02-18 (土) 20:25:28