ロボットの紹介

  • このロボットは見た目は普通でもきっとやるときはやる子です。
  • できるだけ小さくすることを目指し作りました。
  • 缶を挟むアームだけだと、ライントレースしている間にアームが開いてきてしまうので、下のアームは固定させ安定して缶を運べるようにした
  • 全体   モーターに連結している白い歯車は回り過ぎてモーターが壊れるのを防ぐ役割がある
    image (2).jpg
  • 缶をつかむ為のアーム   上の黒いアームは缶をはさみ、下の黄色のアームは固定されていて運ぶ補助をする
    image (3).jpg
  • 裏   光センサーの高さによりしきい値も変化してしまうので途中で組み立て直すときは注意する
    image (4).jpg
  • 後方   RCXはすぐにとれてしまうので、取っ手を付けて運びやすいようにした
    image (5).jpg

コース攻略法

  • 最初はタッチセンサーで缶をつかもうと思ったが、缶が軽すぎセンサーが反応しなかったので、タイマーを使い全てを時間で区切って操作しようとした。
  • 交差点を通過するプログラムだけでは、急なカーブをうまく曲がる事ができないことも多かったので、細かく時間を区切り通常のライントレース、急なカーブを曲がるライントレース、交差点を通過するプログラムを作った。
  • 最後の缶を置く部分もタイマーを使い攻略する。
  1. スタート
  2. 普通のライントレースをする
  3. 缶の位置まできたら缶をつかむ
  4. ライントレースと交差点を通過するライントレースを交互にする
  5. 缶を置く位置まで来たら、一度通過し通り過ぎてから旋回し缶を置き後退、再び旋回をする
  6. 普通のライントレースをする
  7. ゴール
    robotics-2013a-mission1.jpg

プログラムの説明

定義

#define THRESHOLD 35 //基準のしきい値
#define HIPOWER 7
#define LOWPOWER 1
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go_forward1 set_power_H;OnFwd(OUT_AC);  //前進(高速)
#define go_forward2 set_power_L;OnFwd(OUT_AC);  //前進(普通)
#define turn_left1 set_power_L;\
 OnFwd(OUT_C);OnRev(OUT_A);  //左旋回
#define turn_left0 set_power_L;\
 OnFwd(OUT_C);Off(OUT_A);  //左回り
#define turn_right0 set_power_L;\
 OnFwd(OUT_A);Off(OUT_C);  //右回り
#define turn_right1 set_power_L;\
 OnFwd(OUT_A);OnRev(OUT_C);  //右旋回
#define moter set_power_L;OnFwd(OUT_B);  //缶をつかむ
#define STEP 1
#define nMAX 3  //交差点とカーブを見分けるカウンター
#define short_break Off(OUT_AC);Wait(10);  //小休憩
#define CROSS_TIME 30  //交差点を通過するための前進する時間
#define cross_line go_forward1;\
 Wait(CROSS_TIME);short_break  //交差点を通過
#define time0 400
#define time1 1800 
#define time2 2200
#define time3 3300
#define time4 3700
#define time5 4600
#define time6 4900
#define time7 6000

普通のライントレースのサブルーチン

sub line_trace1()  //普通のライントレース
{     
       if (SENSOR_2 < THRESHOLD -6) {
      turn_left0;
     } else 
      if (SENSOR_2 < THRESHOLD -3) {
       turn_left1;
     } else if (SENSOR_2 < THRESHOLD +3) {
        go_forward1;
     } else if (SENSOR_2 < THRESHOLD +7) {
        turn_right0;
     } else {
        turn_right1;
       }
        Wait(STEP);
 }

急なカーブのライントレースのサブルーチン

sub line_trace2()  //急なカーブのライントレース
{     
       if (SENSOR_2 < THRESHOLD -3) {
      turn_left1;
     } else 
      if (SENSOR_2 < THRESHOLD +3) {
       turn_right1;
     } else {
        go_forward1;
       }
        Wait(STEP);
 }

交差点を通過するサブルーチン

sub line_cross()  //交差点を通過
{      
      int nOnline=0;
       while(nOnline < nMAX){
        if (SENSOR_2 < THRESHOLD -6) {
      turn_left1;
      nOnline++;  //カウンターをプラス
     } else {
      if (SENSOR_2 < THRESHOLD -3) {
       turn_left0;
     } else if (SENSOR_2 < THRESHOLD +3) {
        go_forward1;
     } else if (SENSOR_2 < THRESHOLD +7) {
        turn_right0;
     } else {
        turn_right1;
      }
    nOnline=0;  //カウンターをリセット
      }
      Wait(STEP);
    }
      short_break;  //小休憩
      turn_right1;Wait(nMAX*STEP*10);  //交差点と判断する間に左に旋回した分もとに戻る
      cross_line;  //交差点を通過
      nOnline=0;  //カウンターをリセット
}

コースを進む

    task main()
{
      SetSensor(SENSOR_2,SENSOR_LIGHT);
         ClearTimer(0);  //タイマーを0にする
       go_forward1;Wait(35);  //前進
       turn_left1;Wait(100);  //最初の直角のカーブを曲がる
       while(FastTimer(0) <= time0) {
         line_trace1();  //普通のライントレース
}
       moter;Wait(50);
       while(FastTimer(0) <= time1) {
         line_trace1();  //普通のライントレース
}
       PlaySound(SOUND_UP);
       while(FastTimer(0) <= time2) {
         line_cross();  //交差点を通過
}
       PlaySound(SOUND_UP);
       while(FastTimer(0) <= time3) {
         line_trace2();  //急な回転のライントレース
}
       PlaySound(SOUND_UP);
       while(FastTimer(0) <= time4) {
         line_cross();  //交差点を通過
}
          PlaySound(SOUND_UP);
       while(FastTimer(0) <= time5) {
         line_trace2();  //急な回転のライントレース
}
          PlaySound(SOUND_UP);
       while(FastTimer(0) <= time6) {
         line_cross();  //交差点を通過
}
           PlaySound(SOUND_UP);
       while(FastTimer(0) <= time7) {
         line_trace1();  //普通のライントレース
}
           PlaySound(SOUND_UP);

缶を置く

       turn_right1;Wait(100);  //缶を指定された位置に置き、缶に当たらないようにしながら続きのライントレースへ進む
       go_forward1;Wait(100);
       turn_left1;Wait(200);
       OnRev(OUT_B);Wait(50);Off(OUT_B);
       OnRev(OUT_AC);Wait(100);
       turn_right1;Wait(200);
       while(true){
         line_trace2();
   }
}

まとめ

  • 缶が軽すぎてタッチセンサーが反応せず苦労した。
  • 時間で細かく区切ってやろうとしたので、ちょうどいい時間を指定するのが難しかった。
  • 電池の電力により進むスピードが変わってしまうので、電力に気を配りながら調節するのが大変だった
  • 最終的に缶を指定の位置に置きゴールすることはできなっかたが、今回の失敗から学ぶことも多かった。
  • 課題2では今回のことを踏まえ、4人で協力しクリアしたい。

添付ファイル: fileimage (5).jpg 170件 [詳細] fileimage (4).jpg 152件 [詳細] fileimage (3).jpg 161件 [詳細] fileimage (2).jpg 145件 [詳細] filerobotics-2013a-mission1.jpg 140件 [詳細] file1373524701220.jpg 71件 [詳細] file1373524685053.jpg 82件 [詳細] file1373524663100.jpg 80件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-07-26 (金) 05:16:52