[[2013b/MemberOnly/進行状況]]

*ロボットの説明 [#e4166b5c]
自分たちのグループは缶を集めるロボットと、缶を積み上げるロボットに分かれる作戦にしました。
ロボットを2つに分けたので使えるモーターの数が限られていて、1つのロボットに使えるモーターは3つで、タイヤを動かすために2つ使うため、残りの1つでそれぞれの作業をする必要があるためかなり厳しいものになりました。
-運搬用ロボット
#ref(2013b/Member/matsuro/Mission2/F1000234.JPG,80%,運搬用)
--始めの頃は1回目のロボコンの時に使ったロボットをベースに作ろうと思ったのですが、もう一方のロボットの都合によって運搬用のロボットで缶を抑える必要があるので、そのためにモーターを使うことにしました。
--缶の上を押すとた倒れてしまうため、低い位置を押すように作ったのですが、モーターを取り付ける向きが縦方向だったので固定するのに苦労しました。
#ref(2013b/Member/matsuro/Mission2/F1000233.JPG,80%,押し出し機構1)
#ref(2013b/Member/matsuro/Mission2/F1000232.JPG,80%,押し出し機構2)
--光センサーを使って缶を掴んだかを判断させようとしたのですが、初めはセンサーを前向きにつけていたため、周りの環境の光が影響してか、値が不安定だったため、ハサミの先端にハサミの内側を向くようにつけて缶が当たると数値が上がるのを利用して判断できるようにしました。
-積み上げ用ロボット
#ref(2013b/Member/matsuro/Mission2/F1000237.JPG,80%,積み上げ用)
モーターの数が3つと限られていて、移動、缶の積み上げをしなければならないため、移動には資料にあったモーター1つで移動できる機構を使い、缶を持ち上げることにモーターを2つ使えるようにした。
#ref(2013b/Member/matsuro/Mission2/F1000236.JPG,80%,積み上げ用)
#ref(2013b/Member/matsuro/Mission2/F1000235.JPG,80%,積み上げ用)
缶を前後から挟み込み、大きい方のタイヤを使って缶を持ち上げ、運搬用ロボットがその下に次の缶を差し入れる。
*プログラム [#q5785006]
-運搬用
運搬用のプログラムは基本的には課題1で使用したライントレースプログラムを利用し、サブルーチンで数種類のラインとレースを部品化し、簡略化を図った。また、変数を使用しn=0の時はライントレースに入るまでのプログラム、n=1〜9の時は下の図のn=1〜5の缶を取りに行くプログラムにするつもりでした。(5までしかないのは左の2つを積み上げ用ロボットがゴール位置まで移動する際に運び、運搬用で残りを運ぶ予定で、まずはライン上にある缶を運ぼうとしていたからです。)
#ref(2013b/Member/matsuro/Mission2/robocon2013b.png,80%,缶の配置)
#ref(2013b/Member/matsuro/Mission2/robocon2013b_1.png,80%,缶の配置)

 #define WHITE 46
 #define BLACK 40
 #define CATCH 47
 #define On 11
 #define power SetPower(OUT_AC,1);
 #define go_forward power;OnFwd(OUT_AC);
 #define go_back power;OnRev(OUT_AC);
 #define LEFT power;OnRev(OUT_A);OnFwd(OUT_C);
 #define left power;Off(OUT_A);OnFwd(OUT_C);
 #define RIGHT power;OnFwd(OUT_A);OnRev(OUT_C);
 #define right power;OnFwd(OUT_A);Off(OUT_C);
 #define PUSH power;OnFwd(OUT_B);Wait(21);Off(OUT_B);SendMessage(On);Wait(1000);OnRev(OUT_B);Wait(21);Float(OUT_B);
次のサブルーチンはラインの右側を交差点などは関係なしにトレースするプログラムです。
 sub trace1_R(){                           //ライントレース(右側)
        if (SENSOR_1 < BLACK){
                 RIGHT;
         } else if (SENSOR_1 < BLACK +2){
                 right;
         } else if (SENSOR_1 > WHITE -2){
                 left;
         } else if (SENSOR_1 > WHITE){
                 LEFT;
           }
   }
次のサブルーチンはラインの左側を交差点などは関係なしにトレースするプログラムです。
 sub trace1_L(){                           //ライントレース(左側)
       if (SENSOR_1 < BLACK){
                 LEFT;
         } else if (SENSOR_1 < BLACK +2){
                 left;
         } else if (SENSOR_1 > WHITE -2){
                 right;
         } else if (SENSOR_1 > WHITE){
                 RIGHT;
           }
   }
次のサブルーチンはラインの右側を交差点は横断するプログラムです。
 sub trace2_R(){                            //交差点判断(右側)
         while (FastTimer(0) < 25){
    if (SENSOR_1 < BLACK){
       RIGHT;
    }else if (SENSOR_1 < BLACK +2){
       ClearTimer(0);
       right;
    }else if (SENSOR_1 > WHITE -2){
       ClearTimer(0);
       left;
    }else if (SENSOR_1 > WHITE){
       ClearTimer(0);
       LEFT;
    }else{
       ClearTimer(0);
       go_forward;
     }
  }
右に回りながら0.25秒黒と判断していたら交差点とみなして横断する。
 if(FastTimer(0) >= 25){
   ClearTimer(0);
   LEFT;
   Wait(40);
   go_forward;
   Wait(20);
   Off(OUT_AC);
   ClearTimer(0);
  }
 }
次のサブルーチンはラインの左側を交差点は横断するプログラムです
 sub trace2_L(){                            //交差点判断(左側)
         while (FastTimer(0) < 25){
    if (SENSOR_1 < BLACK){
       LEFT;
    }else if (SENSOR_1 < BLACK +2){
       ClearTimer(0);
       left;
    }else if (SENSOR_1 > WHITE -2){
       ClearTimer(0);
       right;
    }else if (SENSOR_1 > WHITE){
       ClearTimer(0);
       RIGHT;
    }else{
       ClearTimer(0);
       go_forward;
     }
  }
左に回りながら0.25秒黒と判断していたら交差点とみなして横断する。
 if(FastTimer(0) >= 25){
   ClearTimer(0);
   RIGHT;
   Wait(40);
   go_forward;
   Wait(20);
   Off(OUT_AC);
   ClearTimer(0);
  }
 }
次のサブルーチンはラインの右側を交差点を判断したら缶を押し出すプログラムです
 sub trace3_R(){                        //缶の受け渡し(右側)
             while (FastTimer(0) < 25){
    if (SENSOR_1 < BLACK){
       RIGHT;
    }else if (SENSOR_1 < BLACK +2){
       ClearTimer(0);
       right;
    }else if (SENSOR_1 > WHITE -2){
       ClearTimer(0);
       left;
    }else if (SENSOR_1 > WHITE){
       ClearTimer(0);
       LEFT;
    }else{
       ClearTimer(0);
       go_forward;
     }
  }
ゴール地点の交差点と判断したらゴールの中央を向いて缶を押し出す。
 if(FastTimer(0) >= 25){
      go_forward;
      Wait(10);
      repeat(8){LEFT;Wait(10);Off(OUT_AC);Wait(100);}  //ここで小刻みに旋回するのは急に旋回すると缶が倒れてしまうからです。
      Wait(100);
      PUSH;
      go_back;
      Wait(120);
      Off(OUT_AC);
      ClearTimer(0);
  }
 }
次のサブルーチンはラインの左側を交差点を判断したら缶を押し出すプログラムです
 sub trace3_L(){                             //缶の受け渡し(左側)
             while (FastTimer(0) < 25){
    if (SENSOR_1 < BLACK){
       LEFT;
    }else if (SENSOR_1 < BLACK +2){
       ClearTimer(0);
       left;
    }else if (SENSOR_1 > WHITE -2){
       ClearTimer(0);
       right;
    }else if (SENSOR_1 > WHITE){
       ClearTimer(0);
       RIGHT;
    }else{
       ClearTimer(0);
       go_forward;
     }
  }
ゴール地点の交差点と判断したらゴールの中央を向いて缶を押し出す。
 if(FastTimer(0) >= 25){
      RIGHT;
      Wait(70);
      Off(OUT_AC);
      PUSH;
      go_back;
      Wait(50);
      Off(OUT_AC);
     ClearTimer(0);
  }
 }

 task main()
 {
  SetSensor(SENSOR_1, SENSOR_LIGHT);
  SetSensor(SENSOR_3, SENSOR_LIGHT);
  ClearTimer(0);
  int n=0;
まずはラインを判断するまで直進する
 while(n==0){
              Wait(800);                   //相手を待つ時間
              until(SENSOR_1 < BLACK){     //黒になるまで直進
                      go_forward;}
              Off(OUT_AC);
              Wait(100);
              go_back;
              Wait(15);
              Off(OUT_AC);
               Wait(30);
          n++;    //nを増やし、1つ目の缶を運ぶプログラムに移行
 }
缶を感知するまで普通のトレース。感知後4秒トレースしたらn=2の缶に当たらないように図のように横断してゴールの交差点に来たら缶を押し出す。
#ref(2013b/Member/matsuro/Mission2/robocon2013b_n1.png,80%,n=1)
 while(n==1){
           if (SENSOR_3 > CATCH){
                     PlaySound(SOUND_UP);   //感知したかわかるように音を鳴らす
                     ClearTimer(0);
                     until(FastTimer(0) > 400){    //4秒は通常トレース
                          trace1_R();}
                     LEFT;           //横断するために左旋回
                     Wait(55);
                     go_forward;        //横断(このプログラムに移行したときはライン上にいるので、初めから黒になるまでとすると横断しない)
                     Wait(20);
                     until(SENSOR_1 < BLACK){
                      go_forward;}
                     ClearTimer(0);
                     until(FastTimer(0) > 500){    //5秒間通常トレース(途中に交差点があるため)
                              trace1_R();}
                     ClearTimer(0);
                     trace3_R();缶の受け渡しトレース
                     n++;   //nを増やしてn=2の缶のプログラムに移行
         } else if (SENSOR_1 < BLACK){
                 RIGHT;
         } else if (SENSOR_1 < BLACK +2){
                 right;
         } else if (SENSOR_1 > WHITE -2){
                 left;
         } else if (SENSOR_1 > WHITE){
                 LEFT;
           }
 }
本来は1つ目の缶を運んだ時点で積み上げ用のロボットとの連携を確かめるつもりでしたが、積み上げ用ロボットの製作が遅れて間に合わず、ひとまず2つ目の缶を取りに行くプログラムを作ることにしました。
 while(n==2){
             RIGHT;
             Wait(40);
             go_forward;
              Wait(100);
              until(SENSOR_1 < BLACK){
                       right;}
以上は図のようにラインの左側に入るための動作
#ref(2013b/Member/matsuro/Mission2/robocon2013b_n2.png,80%,n=2)
             if (SENSOR_3 > CATCH){        //缶を掴んだらUターンしてゴールまで運ぶ
                    until(SENSOR_1 < BLACK){
                      left;}
                    ClearTimer(0);
                    trace3_R();
                    n++;
            } else if (SENSOR_1 < BLACK){
                  LEFT;
          } else if (SENSOR_1 < BLACK +2){
                  left;
          } else if (SENSOR_1 > WHITE -2){
                  right;
          } else if (SENSOR_1 > WHITE){
                  RIGHT;
            }
  }
 }
プロブラムの微調整に思ったより時間がかかり、2つ目の缶を取りに行くプログラムまでしか書くことができませんでした。

-積み上げ用
--自分たちのグループは2人ずつ分かれて作業していたため、積み上げ用プログラムには関与していなかったので、できるだけの説明はしますが基本的には記載するだけとさせて頂きます。
 #define HP 7
 #define LP 2
 #define THRESHOLD 36//ライントレース用閾値
 #define turn_right1 OnFwd(OUT_A);
 #define go_forward OnRev(OUT_A);
 #define TIME_TRACE1 3//トレースの1回の判断で待つ時間
 #define TIME_TRACE2 500//「4」で本体を90度回転させる地点を指定する値
 #define NB_COUNT 4//交差点識別用の値
 #define STACK 11//
 
 task play_music()
 {
   PlayTone(740,28);Wait(5);
   PlayTone(587,28);Wait(5);
   PlayTone(440,28);Wait(5);
   PlayTone(587,28);Wait(5);
   PlayTone(659,28);Wait(5);
   PlayTone(880,61);Wait(5);
   PlayTone(440,28);Wait(5);
   PlayTone(659,28);Wait(5);
   PlayTone(740,28);Wait(5);
   PlayTone(659,28);Wait(5);
   PlayTone(440,28);Wait(5);
   PlayTone(587,80);
 } 
 
 task main()
 {
   SetSensor(SENSOR_2,SENSOR_LIGHT);
   SetPower(OUT_A,HP);
   int nbk=0;
   int ncros=0;
 //1.黒線に当たるまで前進
   OnRev(OUT_A);
   until (SENSOR_2<=THRESHOLD);
 //2.左折しライントレース
   turn_right1;
   Wait(400);
   ClearTimer(0);
   while(FastTimer(0)<=1000){
    if(SENSOR_2<THRESHOLD){go_forward;}
     else{turn_right1;}
     Wait(TIME_TRACE1);
   }
 //缶積み
   start play_music;
   SetPower(OUT_BC,2);
   OnFwd(OUT_B);Wait(68);Off(OUT_B);
   stop play_music;
   while(ncros<2){//1
     while(nbk<NB_COUNT){//2
       if(SENSOR_2<THRESHOLD){go_forward;nbk++;}
       else{turn_right1;nbk=0;}
     Wait(TIME_TRACE1);
     }//2
     Wait(50);
     turn_right1;Wait(NB_COUNT*TIME_TRACE1);
     nbk=0;
     ncros++;
     go_forward;Wait(60);
   }//1
   while(nbk<NB_COUNT){//1
    if(SENSOR_2<THRESHOLD){go_forward;nbk++;}
     else{turn_right1;nbk=0;}
     Wait(TIME_TRACE1);
   }//1
   turn_right1;Wait(350);
   go_forward;Wait(200);
   turn_right1;Wait(170);
   until(Message()==STACK);
   start play_music;
   OnFwd(OUT_C);Wait(1000);
   OnRev(OUT_B);Wait(68);Off(OUT_BC);
   stop play_music;
   turn_right1;Wait(350);Off(OUT_A);
   ClearMessage();
   repeat(2){
     until(Message()==STACK);
     OnFwd(OUT_B);Wait(68);Off(OUT_B);
     ClearMessage();
     until(Message()==STACK);
     OnFwd(OUT_C);Wait(1000);
     OnRev(OUT_B);Wait(68);Off(OUT_BC);
     turn_right1;Wait(350);Off(OUT_A);
     ClearMessage();
   }
   OnRev(OUT_A);
   Wait(170);
   go_forward;
   Wait(600);
   Off(OUT_A);
   }
*製作中の問題点 [#od53cccd]
-押し出し機構がうまくいかない→モーターを縦に取り付ける必要があったが固定が難しく、動かしているうちに取れてしまうことがあったため、固定箇所を増やして対応しました。また、押し出す棒を戻さなければいけないのに、途中で引っかかって戻らないことがあったので、棒に接触する場所は凹凸をなくすようにしました。
-光センサーが機能しない→センサーの位置をロボットの正面からハサミの先端に変えて向きを内側にすることでセンサーに缶が当たるようにして、当たった時にしかならない値を設定して判断できるようにしました。
-はじめのライントレースがうまくいかない→初めはセンサーが黒になるまで直進というプログラムにしていたのに、ラインをうまく判断しなくて少し通り過ぎてしまったため、黒と判断したら少し下がることで通り過ぎる問題を改善しました。

*まとめ(反省) [#o3753559]
-ロボット同士の連携がうまくいかず、最終的には積み上げ用のロボットが動かず、かなり不本意な形になってしまった。
-2人ずつで1つのロボットを作っていたが、それぞれでの連携が足りなくて、プログラムもあまり進まず、1台のロボットでやったほうが確実だったのではないかと思ってしまった。また、自分は運搬用のロボットを作っていたが、運搬用を作っていたもう一人がプログラムが苦手だったため、プログラムは全て一人で作ってしまい、もう一人のためにならなかったと思いました。
-本番までに作り上げることができず、ものすごく悔しい思いをした。
-完璧を求めすぎて妥協をして、出来るところまでという考え方ができなかった。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS