2013b/kk/missoin?

ロボコン

今回のロボコンの課題

ライン上に設置された缶を集めポイントの枠内にどれだけ積み上げれるかを競います。 .png

ルールの概要は大まかに

二班 kk matsuro trtr 6638

私たちのグループの方針としてはロボットを「缶を集める」役と「積み上げる」役に
それぞれロボットを分け2段の缶を複数積みあげて得点を稼ぎます。

separate.jpg

缶をあつめてくるロボットは前回の課題の応用で、ライントレースをして缶を見つけ運ぶプログラムを加えたいと思います。ライン上にない缶をどう集めるかが課題となります。
缶を積み上げるロボットでは、何かエレベーター式の仕組みをつけて缶を上に積み上げたいと思います。

ロボットの説明

缶を集めてくる側のロボットです。基本形はライントレースのときのものを応用しています。 こちらはkkとmatsuroが主に制作を担当しました。
大きな特徴としては缶の受け渡しのため、つかんだ缶を押し出しハサミの外に出す仕組みです。
機体の底を最大のタイヤを使用して持ち上げ、缶を押し出すのに使用するモーターを取りつ けました。この時、重たいモーターを固定するのに苦労しました。
soko.jpg L字のブロックと蝶番のブロックを使用して強固にしました。このモーターにはライントレースをする光センサーもついています。
ハサミの先についた光センサーで缶を掴んだことを感知します。センサーの位置は、初め機体の中央:黒い受信ポート下:に位置していましたが蛍光灯や紙からの反射光によって値が30〜40とばらつきが生じてしまったため、より缶に近い歯先に取り付けました。こうすることで値のばらつきは残ったものの缶無しで誤動作することはなくなりました。

bou.jpg

試合直前には缶押し出しの精度を上げるため以下の様になりました。

bou2.JPG

ハサミはシンプルに棒二本。トレース中に重量の軽い缶を安定して運ぶことが問題でしたが、ハサミに返しを取り付けたり、全体の動くスピードを落としたり、90°以上の回転を数角度づつに分けたりして何とか缶がはみ出ない程度に抑えました。この問題が機械だけを先行して作ったことの弊害でした。

缶を積み上げるロボットでは、背面にあるタイヤを用いて缶を垂直に上げます。 up.JPG こちらはtrtr、6683が主に担当しました。
ゴールに行く途中の缶,鉢△鬚弔みながら進行していきます。そのため運ぶ側のロボットは缶、い僚腓亡未妨かいます。
大まかな仕組みと動きは理解していますが缶積み上げロボットについては
[こちら:http://yakushi.shinshu-u.ac.jp/robotics/?2013b%2FMember%2Ftrtr%2FMission2]
[:http://yakushi.shinshu-u.ac.jp/robotics/?2013b%2FMember%2F6638%2FMission2]を参照されたい。

プログラム{缶を運ぶ側}

  • 定義文
    #define WHITE 46   //白の値
    #define BLACK 40   //黒(ライン上)の値
               //境界の値は上の二つから+、-をもちいて作っています。
    
    #define CATCH 44   //缶をつかんだ時の光センサー3の値
    #define power SetPower(OUT_AC,1);          //モーターの出力を7段階中の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;OnRev(OUT_B);Wait(3);Off(OUT_B);  Wait(20);  OnFwd(OUT_B);Wait(10);Float(OUT_B);
    //缶を押し出す動作です。モーターの向きからOnRevで棒が飛び出し、OnFwdで戻ります。Floatで優しく仕舞います。
  • サブルーチン

 ライントレース(右側)

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;
    }
 }
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;
    }
 }
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);
     LEFT;
     Wait(70);
     Off(OUT_AC);
     Wait(100);
     PUSH;
     go_back;  //ハサミの接触を避けるため
     Wait(100);
     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(100);                   //相手を待つ時間
              until(SENSOR_1 < BLACK){     //黒になるまで直進、ラインを感知してトレースを開始します。
                      go_forward;}
              Off(OUT_AC);
              Wait(100);
              go_back;    //感知から動作までに進んでしまった分戻ります。
              Wait(15);
              Off(OUT_AC);
              Wait(30);
          n++;
 }

 while(n==1){
           if (SENSOR_3 > CATCH){
                     PlaySound(SOUND_UP);   //缶をつかんだ合図
                     ClearTimer(0);
                     until(FastTimer(0) > 500){  //,播呂覦銘屬泙任了間です。
                          trace1_R();}
                     LEFT;       //,播呂襪箸の動作です。
                     Wait(55);
                     go_forward;
                     Wait(20);
                     until(SENSOR_1 < BLACK){
                      go_forward;}
                      ClearTimer(0);
                     until(FastTimer(0) > 500){ //,鯏呂蟒えてからのトレース
                              trace1_R();}
                     ClearTimer(0);
                     trace3_R();
                     n++;
         } 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;
           }
 }

 while(n==2){  //二つ目の缶を運ぶプログラムです。
             RIGHT;
             Wait(40);
             go_forward;
             Wait(150);
             until(SENSOR_1 < BLACK){
                      right;}
            if (SENSOR_3 > CATCH){
                   until(SENSOR_1 < BLACK){
                     LEFT;}
                   ClearTimer(0);
                   trace3_L();
                   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;
           }
 }
}

skime.png

結果

結果缶の個数基礎得点技術点
   1   5  ave:10.1

 今回はたくさんの時間があるにも関わらず缶を一つしか運ぶことができなかった。
結果だけ見れば、前回の課題1からの進歩がほとんどなかった。
制作に時間をかけた、缶の押し出しの仕組みも本番では半分しか機能を発揮できなかった。
 また積み上げ側のロボットが動作できなかった要因として、ゼロからの作成だったが
作成の役割分担をしたために、積み上げ側の負担が大きくなってしまいチームワークの不足がはっきりと出てしまい残念だった。
始めの案を変更すると楽にできた部分もあったかもしれないが作戦に近い形でロボットが作成できて楽しかった


添付ファイル: fileskime.png 144件 [詳細] fileup.JPG 139件 [詳細] filebou2.JPG 180件 [詳細] filebou.jpg 138件 [詳細] filesoko.jpg 150件 [詳細] fileseparate.jpg 147件 [詳細] file.png 153件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-02-06 (木) 14:38:15