2016a/Member

目次

課題

下の図のようなコースを各チームで作成し、

「ミッション」を遂行するためのロボットを作成せよ。

2016a-mission2-.png

黒線の幅は20mmでなるべく均等な濃さにすること。

↓↓「ミッション」↓↓

次の経路を黒い線にそって動くロボットを作成する

ただし、なるべく速く正確に動くロボットになるように工夫して、

交差点では1秒間停止すること。

•C地点からA地点へ (三人目)

◦C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点

2016a-mission2- - コピー (7).png

ロボット本体の説明

下の画像のように、ロボット本体の前方に光センサーを取り付けた

前回同様、モーターB,Cでタイヤを動かしている

http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2016a%2FMember%2FEtu%2FMission2&openfile=%A5%ED%A5%DC%CB%DC%C2%CE.JPG

プログラムの説明

今回使用した定義はこれらである

#define THRES1 38
#define THRES2 43
#define THRES3 53
#define THRES4 59
#define SPEED_H 30
#define SPEED_L 15
#define TIME_CROSS 230
#define move_RL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define STEP 1
#define nMAX 300
#define breaking Off(OUT_BC); Wait(500);

サブルーチンはこちら

sub go_forward()
{
move_RL(SPEED_H,SPEED_H);
}                             //直進
sub turn_left_A()
{
move_RL(SPEED_L,0);
}                             //左折
sub turn_left_B()
{
move_RL(SPEED_L,-SPEED_L);
}                             //左旋回
sub turn_right_A()
{
move_RL(0, SPEED_L);
}                             //右折
sub turn_right_B()
{
move_RL(-SPEED_L,SPEED_L);
}                              //右旋回
sub cross_line()
{
move_RL(SPEED_H,SPEED_H);Wait(TIME_CROSS);breaking;
}                             //交差点直進
task main ()
{
  SetSensorLight(S1);
  int n_black=0;
  int m_kousa=0;

下のプログラムはライントレースしつつ交差点に差し掛かると左折するプログラムである

僕のコースでは、c地点からはじまり、S交差点とP交差点で左折をするので

リピートを使って二回繰り返した

 repeat(2){
   while (n_black < nMAX) {
     if (SENSOR_1 < THRES1) {
          turn_left_B();
          n_black++;
     } else {
         if (SENSOR_1 < THRES2) {
            turn_left_A();
         } else if (SENSOR_1 < THRES3) {
            go_forward();
         } else if (SENSOR_1 < THRES4) {
            turn_right_A();
         } else {
            turn_right_B();
          }
          n_black=0;
     }
        Wait(STEP);
   }
     breaking;
     PlaySound(SOUND_DOWN);
     turn_left_B();
     Wait(1500);
     n_black=0;
 }

下のプログラムはライントレースしつつ交差点に差し掛かると直進するプログラムである

P交差点を左折したあと、Q交差点をぐるっと2回通りすぎるコースなので

ここでもリピートを使って2回繰り返した

 repeat(2) {
   while (n_black < nMAX) {
     if (SENSOR_1 < THRES1) {
        turn_left_B();
        n_black++;
     } else {
       if (SENSOR_1 < THRES2) {
          turn_left_A();
       } else if (SENSOR_1 < THRES3) {
          go_forward();
       } else if (SENSOR_1 < THRES4) {
          turn_right_A();
       } else {
          turn_right_B();
        }
        n_black=0;
     }
      Wait(STEP);
   }
   breaking;
   PlaySound(SOUND_DOUBLE_BEEP);
   cross_line();
   n_black=0;
 }

下のプログラムはライントレースしつつ交差点に差し掛かると右折するプログラムである

Q交差点を2回通りすぎたあと、R交差点を右折するコースなので、ここで使った

   while (n_black < nMAX) {
     if (SENSOR_1 < THRES1) {
        turn_left_B();
        n_black++;
     } else {
       if (SENSOR_1 < THRES2) {
          turn_left_A();
       } else if (SENSOR_1 < THRES3) {
          go_forward();
       } else if (SENSOR_1 < THRES4) {
          turn_right_A();
       } else {
          turn_right_B();
        }
        n_black=0;
     }
      Wait(STEP);
   }
   breaking;
   PlaySound(SOUND_DOWN);
   move_RL(0,20);
   Wait(1500);
   n_black=0;

下のプログラムは最初に使った、

ライントレースしつつ交差点に差し掛かると左折するプログラムである

R交差点を右折したあと、P交差点を左折するために使った

 while (n_black < nMAX) {
     if (SENSOR_1 < THRES1) {
        turn_left_B();
        n_black++;
     } else {
       if (SENSOR_1 < THRES2) {
          turn_left_A();
       } else if (SENSOR_1 < THRES3) {
          go_forward();
       } else if (SENSOR_1 < THRES4) {
          turn_right_A();
       } else {
          turn_right_B();
        }
        n_black=0;
     }
      Wait(STEP);
   }
   breaking;
   PlaySound(SOUND_DOUBLE_BEEP);
   turn_left_B();
   Wait(1500);
   n_black=0;

下のプログラムはこれも最初に使った

ライントレースしつつ交差点に差し掛かると直進するプログラムであるが

最後にA地点で止まるために1.8秒間直進するプログラムを組み込んだ

P交差点を左折したあとAの場所を交差点とみなし、

A地点で止まるために使った

   while (n_black < nMAX) {
     if (SENSOR_1 < THRES1) {
        turn_left_B();
        n_black++;
     } else {
       if (SENSOR_1 < THRES2) {
          turn_left_A();
       } else if (SENSOR_1 < THRES3) {
          go_forward();
       } else if (SENSOR_1 < THRES4) {
          turn_right_A();
       } else {
          turn_right_B();
        }
        n_black=0;
     }
      Wait(STEP);
   }
     breaking;
     go_forward();
     Wait(1800);
     Off(OUT_BC);
}

課題結果

cコースをすべての交差点を認識しゴールまでたどり着くことはできた

が、成功率は五分五分といった感じだった

また少し時間がかかりすぎた

もっと早く進ませることができたかもしれない

さらに言うと、サブルーチンの関係でプログラム全体が長ったらしくなってしまった

ライントレースのサブルーチンをつくってやるともっと短く出来たかもしれない

タイムは2分32秒だった

苦労した点

しきい値の調整に苦労した

また、交差点を認識させるのが難しく

特にR交差点→P交差点→A地点の時のP交差点の認識がうまくいかないことが多かったのと

Q交差点→R交差点→P交差点の時のR交差点は右折で、

今回のライントレースは先の左側をベースにしていたので

右折するとなると曲がる距離の関係でモーターの出力をすこし上げなければならなくて

その調整にも苦労した

感想

今回は全体的にプログラムが長くなってしまった

交差点の認識などもむずかしく、友達と協力しながら出来たのはよかった。


添付ファイル: file2016a-mission2- - コピー (7).png 130件 [詳細] file2016a-mission2-.png 129件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-07-07 (木) 17:13:39