2007a/ロボコン

★☆最終課題:ロボットコンテスト☆★




目次


メンバー紹介

課題(ロボコン)

 今回の課題は、最終課題、ロボコンのロボット&プログラミングの作成です。
 8月4日に行うロボティクス入門ゼミのロボコンに向けて、各グループで課題を作ります。

課題:紙パック収集ロボット

課題内容

 紙パックを収集して所定の位置にできるだけ高く積み上げる。

コース

robocon-2007a-field.gif

その他

黒線の交差している場所に置いてある紙パックを持ち、真ん中の円の中に運ぶ。
制限時間は2分30秒。開始2分で紙パックが10個以上積み上がっていれば、30秒延長。
スタートはどこからでもよい。
開始時点で、ロボットは3個以下。

課題の詳しい内容はロボコンのページを参照してください。 →ロボコンのページ

ロボコン日記

 1、7月26日:ロボティクス入門ゼミの最後の授業
 2、8月1日 :夏休み中1回目のロボット作成
 3、8月2日 :2回目の集合 今日は朝からです。
 4、8月3日 :明日は本番 ロボット完成なるか

ロボット

完成型

ロボットの最終形態です。

robo2.JPG
←正面から 


 横から→
robo1.JPG
 →後ろから
robo3.JPG

詳細

完成したロボットを細かくパーツに分けて説明

タイヤ

毎度おなじみ、移動手段には2種類のタイヤを2つずつ組み合わせています。

roller3.jpgroller2.jpg→拡大→roller1.jpg


→詳細に戻る

アーム

このアーム↓で紙パックを掴み、上下にスライドさせ持ち上げます。

arm5.JPG
←正面から 


 横から→
arm6.JPG


→詳細に戻る

スライド部分

左の2つを噛み合わせて、アームの上下を行うスライドの部分(右図)になります。

slide2.JPGslide-arm.jpg→→→slide1.JPG


→詳細に戻る

収容部(下)

最初の段階(左図)では、紙パックが斜めになってしまい入らなかったので
入り口を広げて入りやすいようにしました(右図)。

ko2.jpg→→→ko1.JPG


→詳細に戻る

収容部(上)

最初の段階(2つの右図)から形は変わりませんが、補強・軽量のため改良を加えました。

ko2-3.jpgko2-4.JPG→→→ko2-1.JPGko2-2.JPG


→詳細に戻る

タッチセンサー

ただ左図の様に押すだけではタッチセンサーが作動しなかったため(紙パックの重量がかなり小さかった)
先生のアドバイスによりてこの原理を利用して改めてタッチセンサーを作成(右図)。

touch3.JPG→→→touch1.JPGtouch2.JPG


→詳細に戻る

光センサー

ライントレースのために光センサーを装着。
最初と少しだけ位置はうごきましたが、ほぼ変更なし。

 light.JPG 


→詳細に戻る

プログラム

3個積み用のプログラム

#define line 40                             //ライン認識の閾値
#define turn_left OnFwd(OUT_C);Off(OUT_A);  //左に方向修正
#define turn_right OnFwd(OUT_A);Off(OUT_C); //右に方向修正
#define go_straight OnFwd(OUT_A+OUT_C);     //直進
#define back OnRev(OUT_A+OUT_C);            //後退
#define get 1                               //通信機能のためのサブルーチン
#define end 2
#define set 3
#define put 4
#define end_2 5
int through ;                               //中心の円との接点を抜けるために使う変数
int box ;                                   //積んだ箱を中心に置く際に使う変数
task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);

   SetPower(OUT_A+OUT_C,7);

   ClearMessage();
   box = 0;

   while(true)
   {
      while((Message() == 0)||(Message() == end))
      {
         through = 0 ;
         if((SENSOR_1 >= line)&&(SENSOR_2 >= line)&&(SENSOR_3 >= line))
         {
            go_straight;                            //直進
         }
         if((SENSOR_1 <= line)&&(SENSOR_2 <= line))
         {
            go_straight;                            //直進
         }
         if(SENSOR_1 <= line)
         {
            turn_right;                             //右に修正
         }
         if((SENSOR_2 <= line)&&(SENSOR_3 >= line))
         {
            turn_left;                              //左に修正
         }
         if((SENSOR_1 >= line)&&(SENSOR_2 >= line)&&(SENSOR_3 <= line))
         {
            through = 1 ;
            if(through == 1)                        //円と格子の接点部分を通過させる
            {
               OnFwd(OUT_A+OUT_C);                  //一定距離直進
               Wait(150);
               if(SENSOR_1 <= line)                 //左に寄った場合
               {
                  turn_right;                         //右に修正
               }
               if((SENSOR_1 >= line)&&(SENSOR_2 <= line))   //右に寄った場合
               {
                  turn_left;                                  //左に修正
               }
               through = 0 ;                        //式の終了
            }
         }
      }
      if((Message() == get)||(Message() == end))    //箱を積み込む間のプログラム
      {
         Off(OUT_A+OUT_C);
         until(Message() == end);
         ClearMessage();
      }
      if((Message() == set)||(Message() == end_2))  //箱を中心に戻すためのプログラム
      {
         box ++;                                    //中心に戻る際のルートを変更
         if((box == 1)||(box == 2))                 //1と2の場合のルート
         {
            OnFwd(OUT_C);
            OnRev(OUT_A);
            Wait(150);
            go_straight;
            Wait(250);
            Off(OUT_A+OUT_C);
         }
         SendMessage(put);                          //メッセージ送信
         until(Message() == end_2);
         back;
         Wait(100);
         Off(OUT_A+OUT_C);
         if(box == 1)                               //1のルート
         {
            OnFwd(OUT_A);
            OnRev(OUT_C);
            Wait(90);
            go_straight;
            ClearMessage();
         }
         if(box == 2)                               //2のルート
         {
            Off(OUT_A+OUT_C);
            Wait(200);
            ClearMessage();
         }
      }
   }
}
#define get 1                               //通信機能のためのサブルーチン
#define end 2
#define set 3
#define put 4
#define end_2 5
#define t_a 100
#define t_b 200
int box ;                                   //積んだ箱の数をカウントする変数
sub up()                                    //箱を積み上げるサブルーチン
{
   OnFwd(OUT_A);
   Wait(t_a);
   OnFwd(OUT_B+OUT_C);
   Wait(t_b);
}
task main()
{
   SetSensor(SENSOR_1,SENSOR_TOUCH);
   
   SetPower(OUT_A,7);
   SetPower(OUT_B+OUT_C,6);
   
   ClearMessage();
   box = 0;
  
   while(true){
      if(SENSOR_1==1){                               //タッチセンサが反応
         SendMessage(get);                           //メッセージ送信
         box ++;                                     //箱をカウント
       if((box == 1)||(box == 4)){                   //箱積み1個目
          up();
          SendMessage(end);
       }
       if((box == 2)||(box == 5)){                   //箱積み2個目
            Wait(100);
            Off(OUT_B+OUT_C);
            Wait(150);
            OnRev(OUT_A);
            Wait(t_a);
            Off(OUT_A);
            Wait(250);
            up();
            SendMessage(end);
         }
         if((box == 3)||(box == 6)){                //箱積み3個目
            SendMessage(set);
            until(Message() == put);
            Wait(100);
            Off(OUT_B+OUT_C);
            Wait(100);
            OnRev(OUT_A);
            Wait(t_a);
            Off(OUT_A);
            SendMessage(end_2);
         }
      }
   }
}

2個積み用のプログラム

(3個積みのプログラムとほぼ同じプログラムですので、説明は割愛させていただきます。)

#define line 40
#define turn_left OnFwd(OUT_C);Off(OUT_A);
#define turn_right OnFwd(OUT_A);Off(OUT_C);
#define go_straight OnFwd(OUT_A+OUT_C);
#define back OnRev(OUT_A+OUT_C);
#define get 1
#define end 2
#define set 3
#define put 4
#define end_2 5
int through ;
int box ;
sub t_c()
{
   OnFwd(OUT_C);
   OnRev(OUT_A);
   Wait(150);
   go_straight;
   Wait(250);
   Off(OUT_A+OUT_C);
}
task main()
{
   SetSensor(SENSOR_1,SENSOR_LIGHT);
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   SetSensor(SENSOR_3,SENSOR_LIGHT);

   SetPower(OUT_A+OUT_C,7);

   ClearMessage();
   box = 0;

   while(true)
   {
      if((Message() == 0)||(Message() == end))
      {
         through = 0 ;
         if((SENSOR_1 >= line)&&(SENSOR_2 >= line)&&(SENSOR_3 >= line))
         {
            go_straight;
         }
         if((SENSOR_1 <= line)&&(SENSOR_2 <= line))
         {
            go_straight;
         }
         if(SENSOR_1 <= line)
         {
            turn_right;
         }
         if((SENSOR_2 <= line)&&(SENSOR_3 >= line))
         {
            turn_left;
         }
         if((SENSOR_1 >= line)&&(SENSOR_2 >= line)&&(SENSOR_3 <= line))
         {
            through = 1 ;
            if(through == 1)
            {
               OnFwd(OUT_A+OUT_C);
               Wait(150);
               if(SENSOR_1 <= line)
               {
                  turn_right;
               }
               if((SENSOR_1 >= line)&&(SENSOR_2 <= line))
               {
                  turn_left;
                  through = 0 ;
               }
            }
         }
      }
      if(Message() == get)
      {
         Off(OUT_A+OUT_C);
         until(Message() == end);
         ClearMessage();
      }
      if(Message() == set)
      {
         OnFwd(OUT_C);
         OnRev(OUT_A);
         Wait(150);
         go_straight;
         Wait(250);
         Off(OUT_A+OUT_C);
         box ++;
         SendMessage(put);
         Off(OUT_A+OUT_C);
         until(Message() == end_2);
      }
      if(Message() == end_2)
      {
         back;
         Wait(100);
         Off(OUT_A+OUT_C);
         if((box == 1)||(box == 2)||(box == 3))
         {
            OnFwd(OUT_A);
            OnRev(OUT_C);
            Wait(90);
            go_straight;
            ClearMessage();
         }
         if(box == 4)
         {
            Off(OUT_A+OUT_C);
            Wait(200);
            ClearMessage();
         }
      }
   }
}
#define get 1
#define end 2
#define set 3
#define put 4
#define end_2 5
#define t_a 100
#define t_b 200
int box ;
int siki ;
sub up()
{
   OnFwd(OUT_A);
   Wait(t_a);
   OnFwd(OUT_B+OUT_C);
   Wait(t_b);
}
task main()
{
   SetSensor(SENSOR_1,SENSOR_TOUCH);
   
   SetPower(OUT_A,7);
   SetPower(OUT_B+OUT_C,4);
   
   ClearMessage();
   box = 0;
   siki = 0;
   
   while(true)
   {
      if((SENSOR_1==1)&&(siki == 0))
      {
         SendMessage(get);
         box ++;
         if(box == 1)
         {
            up();
            SendMessage(end);
         }
         if(box == 2)
         {
            SendMessage(set);
            siki = 1;
         }
      }
      if(siki == 1)
      {
         OnFwd(OUT_A);
         until(Message() == put);
         Wait(100);
         Off(OUT_B+OUT_C);
         Wait(100);
         OnRev(OUT_A);
         Wait(t_a);
         Off(OUT_A);
         SendMessage(end_2);
         box = 0;
         siki = 0;
      }
   }
}

ロボコン

ロボットの動き

自分たちで決めたスタート地点から出発。
  ↓
紙パックを掴み、持ち上げ、持ち上げた下に紙パックを入れ、
上にある紙パックを離し、下の紙パックをまた掴み持ち上げる。(2回繰り返す)
  ↓
方向転換をして円に向かい、円の中に紙パックを下ろす。

field.jpg→→field2.jpg→→field3.jpg

………という予定でしたが、タッチセンサーが作動しなかったり、強度が足りなかっりして失敗してしまいました。

結果

A1A2A3A4A5A6A7A8A9A10ave基本合計順位
A714131415131615121313.9013.97


紙パック運びは成功せず、基本点は残念なことになってしまいました。
けれど技術点は高めで、他のチームに評価されていい線はいっていたと感じました。
→全体の結果へ

感想

●和久田 成治 (切り込み隊長)
今回はみんなで集まる時間の調整などチームが動くにおいてのことを決めたりなどしかできず、マシンでも漠然としたアイデアしか出せずとあまりチームの役に立てるようなことができなかったように感じます。でもそんな中でもめげず、自分のできる仕事を見つけてなんとかチームの役に立てるようにと頑張った次第であります。今回の授業を通してレゴというものは奥が深いなぁと改めて思いました。
●新井田 宏 (スーパーエース)
今回のプログラムのメインを担当していたのですが、マシン調整の方に色々と気を取られてしまい、しっかりとしたプログラムを完成させることができませんでした。メンバーの方々、申し訳ありませんでした。
しかし、今回のロボット作成とHP作成は、今までロボコンの講義で得た知識を総動員して作った最高の出来だったと思います。
同じグループだった皆さん、今までどうもありがとうございました。
●藤田 裕介 (ベンチ)
今回はマシンの作成が思った以上にはかどらなかったため、プログラミングの調整がうまくできませんでした。そのため結局パックを積み上げることができず、残念な結果となってしまいました。しかし今回作ったマシンには班員全員の知恵が詰まっているため、これまで作ったマシンのどれよりもよくできていると思いました。
●荒川 舞 (マネージャー)
結果は残念なことになってしまいましたが、いいロボットができたと思いました。
もう少し時間があったら…と悔しいけれど思ってしまいます。
最後の最後まで学ぶことがあって、改めてレゴは奥が深いと感じました。


添付ファイル: filefield3.jpg 194件 [詳細] filefield2.jpg 169件 [詳細] filefield.jpg 177件 [詳細] fileroller3.jpg 179件 [詳細] fileroller2.jpg 173件 [詳細] fileroller1.jpg 188件 [詳細] filelight.JPG 197件 [詳細] filetouch2.JPG 188件 [詳細] filetouch1.JPG 191件 [詳細] filetouch3.JPG 195件 [詳細] fileko2-4.JPG 172件 [詳細] fileko2-3.jpg 184件 [詳細] fileko2-2.JPG 193件 [詳細] fileko2-1.JPG 190件 [詳細] fileko2.jpg 183件 [詳細] fileko1.JPG 191件 [詳細] fileslide2.JPG 179件 [詳細] fileslide-arm.jpg 189件 [詳細] fileslide1.JPG 220件 [詳細] filebody.jpg 221件 [詳細] filebody1-1.jpg 140件 [詳細] filebody2.JPG 140件 [詳細] filebody1.JPG 143件 [詳細] filerobo3.JPG 134件 [詳細] filearm8.JPG 150件 [詳細] filearm7.JPG 151件 [詳細] filearm4.JPG 150件 [詳細] filearm6.JPG 160件 [詳細] filearm5.JPG 144件 [詳細] filerobo1.JPG 157件 [詳細] filerobo2.JPG 131件 [詳細] filerobocon-2007a-field.gif 133件 [詳細] file070726_1901~03.jpg 162件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-08-18 (土) 20:19:04