ロボットの紹介

  • サンプルのロボットでは攻略するコースのような急なカーブは曲がりきることは難しい。
    そこでモーターとモーターとの距離を縮めることによって小回りが利くようにし、
    今回のような急なカーブも曲がり切れるようにした。
  • 缶を挟むギミックにはモーター付きの大きなハサミを使用した。
    缶がロボットに触れたかどうかの判定をするためにバンパーを取り付けたタッチセンサーを使った。
DSC_0148.jpg

写真のハサミが開閉することによって缶をつかんだり離したりすることができる。 ハサミの先端には小さなタイヤを取り付け、缶がハサミから滑り落ちないようにしている。

コース攻略法

robotics-2013a-mission10.jpg
  • このコースでは時計回りコースを担当した。
  • 缶をつかみ目的の場所に置くために図のようにコースを5分割し、
    プログラムもそれに合わせて5つに分けて作成した。

プログラムの説明

#define THRESHOLD 42 //しきい値
#define HIPOWER 5 //速さの値(速)
#define LOWPOWER 1 //速さの値(遅)
#define set_power_H SetPower(OUT_AC,HIPOWER); //速い回転
#define set_power_L SetPower(OUT_AC,LOWPOWER); //遅い回転
#define go_forward set_power_H; OnFwd(OUT_AC); //前進
#define turn_left1 set_power_L; OnRev(OUT_A); OnFwd(OUT_C);//右旋回
#define turn_left0 set_power_L; Off(OUT_A); OnFwd(OUT_C); //右折
#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 STEP 1 //黒を判断する間隔
#define nMAX 3 //交差点を判断する基準の値
#define short_break Off(OUT_AC); Wait(10); //小休止
#define cross_time 20 //交差点を渡る時間
#define cross_line go_forward set_power_H; OnFwd(OUT_AC); Wait(cross_time); short_break; //交差点を渡る動作
#define time1 1600 //決められたポイントまで動作する時間
#define time3 900 
#define time5 900 
task main() {
 SetSensor(SENSOR_2, SENSOR_LIGHT);
 SetSensor(SENSOR_1, SENSOR_TOUCH);
 ClearTimer(0);
 int counter=0;
 int nOnline=0;
  • ここから,良分のコースの攻略。
    指定された時間まで通常のライントレースをする。
    また、途中でタッチセンサーに反応があればモーターによってハサミを閉じ、缶を挟もうとする。
  if (SENSOR_1 == 0){ //,離魁璽垢療喘罎泙把名錣離薀ぅ鵐肇譟璽
   OnFwd(OUT_B);
  }
  while(FastTimer(0) <= time1){
   if (SENSOR_1 == 1){
    OnRev(OUT_B);
   }
   if (SENSOR_2 < THRESHOLD -4){
    turn_left1;
   } else if (SENSOR_2 < THRESHOLD -3){
    turn_left0;
   } else if (SENSOR_2 < THRESHOLD +0){
    go_forward;
   } else if (SENSOR_2 < THRESHOLD +2){
    turn_right0;
   } else {
    turn_right1;
   }
    Wait(STEP);
  }
 PlaySound(SOUND_CLICK);
  • △良分。
    交差点にに差し掛かるとそれを認識して曲がらずに直進する(交差点を渡る)プログラム。
    このパート終了までに3つの交差点があるので、交差点を3つ認識した時点でこのプログラムは終了するようになっている。
 while(counter < 3){ //交差点を3つ渡る
   while(nOnline < nMAX){
    if (SENSOR_2 < THRESHOLD -3){
     turn_left1;
     nOnline++;
    } else {
    if (SENSOR_2 < THRESHOLD -2){
     turn_left0;
    } else if (SENSOR_2 < THRESHOLD -0){
     go_forward;
    } else if (SENSOR_2 < THRESHOLD +2){
     turn_right0;
    } else {
     turn_right1;
    } 
     nOnline=0;
    }
    Wait(STEP);
   }
   short_break;
   turn_right1; Wait(nMAX*STEP);
   cross_line;
   PlaySound(SOUND_UP);
   nOnline=0;
   counter++;
   }
 PlaySound(SOUND_CLICK);
  • の部分。
    円状の部分をロボットが回るおおまかな時間を計測して、プログラムした。
 ClearTimer(0);
 while(FastTimer(0) <= time3){ //通常のライントレース
  if (SENSOR_2 < THRESHOLD -4){
   turn_left1;
  } else if (SENSOR_2 < THRESHOLD -3){
   turn_left0;
  } else if (SENSOR_2 < THRESHOLD +0){
   go_forward;
  } else if (SENSOR_2 < THRESHOLD +2){
   turn_right0;
  } else {
   turn_right1;
  }
  Wait(STEP);
 }
 PlaySound(SOUND_CLICK);
  • い良分。
    交差点があり、ここだけは通常のライントレースでは突破できないので、
    一瞬だけ交差点を渡るプログラムに切り替えて攻略した。
 counter=0;
 while(counter < 1){ //交差点を一つ渡る
  while(nOnline < nMAX){
   if (SENSOR_2 < THRESHOLD -4){
    turn_left1;
    nOnline++;
   } else {
    if (SENSOR_2 < THRESHOLD -3){
     turn_left0;
   } else if (SENSOR_2 < THRESHOLD -0){
     go_forward;
   } else if (SENSOR_2 < THRESHOLD +2){
     turn_right0;
   } else {
     turn_right1;
   } 
    nOnline=0;
   }
  Wait(STEP);
  }
  short_break;
  turn_right1; Wait(nMAX*STEP);
  cross_line;
  PlaySound(SOUND_UP);
  nOnline=0;
  counter++;
  }
 PlaySound(SOUND_CLICK);
  • イ良分。
    前半部分は通常のライントレース。
    後半からは交差点(スタート地点)を認識すると決められた動きをして
    缶を決められた位置に置くプログラム。
 ClearTimer(0);
 while(FastTimer(0) <= time5){ //コース途中まで通常のライントレース
  if (SENSOR_2 < THRESHOLD -4){
   turn_left1;
  } else if (SENSOR_2 < THRESHOLD -3){
   turn_left0;
  } else if (SENSOR_2 < THRESHOLD +0){
   go_forward;
  } else if (SENSOR_2 < THRESHOLD +4){
   turn_right0;
  } else {
   turn_right1;
   }
    Wait(STEP);
   }
 PlaySound(SOUND_CLICK);
counter=0;
while(counter < 1){ //スタートの位置を判断して次の命令に移る
while(nOnline < nMAX){
 if (SENSOR_2 < THRESHOLD -4){
  turn_left1;
  nOnline++;
 } else {
  if (SENSOR_2 < THRESHOLD -3){
   turn_left0;
 } else if (SENSOR_2 < THRESHOLD -0){
  go_forward;
 } else if (SENSOR_2 < THRESHOLD +2){
  turn_right0;
 } else {
  turn_right1;
 } 
 nOnline=0;
}
Wait(STEP);
}
OnRev(OUT_B); //反対方向を向く
OnRev(OUT_A);
OnFwd(OUT_C);  
Wait(400);
Off(OUT_AC);
OnFwd(OUT_AC); //缶を置く位置まで進む
Wait(200);
OnFwd(OUT_B);
Off(OUT_AC);
Wait(100);
Off(OUT_B); //缶を離して後退する
OnRev(OUT_AC);
Wait(100);
OnRev(OUT_C); //反対方向を向く
OnFwd(OUT_A);  
Wait(400);
counter++;
  • 缶を置き終わるとゴールへ向かう
  while(true){ //ゴールまで通常のライントレース
   if (SENSOR_2 < THRESHOLD -4){
    turn_left1;
   } else if (SENSOR_2 < THRESHOLD -3){
    turn_left0;
   } else if (SENSOR_2 < THRESHOLD +0){
    go_forward;
   } else if (SENSOR_2 < THRESHOLD +2){
    turn_right0;
   } else {
    turn_right1;
   }
  Wait(STEP);
  }
  PlaySound(SOUND_CLICK);
 }
}

まとめ

ロボット本体について

  • ハサミ部分の重量が予想以上に重く、ロボット本体のバランスを取るのが難しかった。

プログラムについて

  • 括弧部分の文法ミスが多かったので、次回からはインデントをしっかりするなどして対策したい。
  • 部屋の明るさ、電池の残量、床の柔らかさなどで光センサが認識する明るさやタイヤの滑りなどが違ったため、走行にかかる時間が変わったので調整が難しかった。
  • 最後の缶を指定の位置に置くプログラムの作りが甘かったので、しっかりと考えてから作り始めたい。

添付ファイル: fileDSC_0148.jpg 170件 [詳細] filerobotics-2013a-mission10.jpg 222件 [詳細]

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