目次
#contents

*課題の内容 [#ueb9e0ee]
模造紙に書いた黒線を追ってロボットを走らせるライントレースという課題でした。詳しくは[[課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%2FMission2]]をご覧ください。

私は交差点を、直進→左折→直進→右折→右折の順に通過してゴールするコースのプログラムを作りました。

*ロボットの説明 [#ze5c47c7]
ロボットの前に光センサーを付けてこのセンサーで黒い部分と白い部分を判断してライントレースをします。すでに組み立ててあったロボットにセンサーを取り付けただけだったので、ロボットを組み立てるのは時間をかけずにできました。

#ref(ライントレース1.jpg)
#ref(ライントレース4.jpg)

*プログラム [#z3b649b9]

 #define THRESHOLD 45
 #define SPEED_H 50
 #define SPEED_L 25
 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
 #define go_straight OnRL(SPEED_H,SPEED_H);
 #define turn_left1 OnRL(SPEED_L,-SPEED_L);//左旋回
 #define turn_left0 OnRL(SPEED_L,0);//左折
 #define turn_right1 OnRL(-SPEED_L,SPEED_L);//右旋回
 #define turn_right0 OnRL(0,SPEED_L);//右折
 #define CROSS_TIME 200
 #define short_break Off(OUT_BC);Wait(1000);
 #define nMAX 240
 #define STEP 1
 #define prepare short_break;turn_right1;Wait(200*STEP);
 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
 #define turn_left Off(OUT_BC);OnRL(SPEED_L,0);Wait(600);Off(OUT_BC);
 #define turn_right Off(OUT_BC);OnRL(0,SPEED_L);Wait(500);Off(OUT_BC);

はじめによく使う動きを定義しました。

 task main()
 {
  SetSensorLight(S1);
  int nOnline=0;//続けて黒になった回数
  int nCross=1;//交差点の数

カウンターを使って、センサーが連続して黒を認識した数を数えます。この回数が定義で定めたnMAX=240を超えない限り普通のライントレースをします。

 while(true){
  while(nOnline<nMAX){
   if(SENSOR_1<THRESHOLD-15){turn_left1; nOnline++;}
   else{
    if(SENSOR_1<THRESHOLD-7){turn_left0;}
    else if(SENSOR_1<THRESHOLD+7){go_straight;}
    else if(SENSOR_1<THRESHOLD+15){turn_right0;}
    else{turn_right1;}
    nOnline=0;
  }
  Wait(STEP);
  }

これはライントレースのプログラムです。

センサーで明るさを測定した結果、黒が約40、白が約60という値が出たので、しきい値を45に設定し、この値を基準に黒・黒と境界の間・境界付近・白と境界の間・白という5段階に分けて、黒線の境界上をジグザグに進むプログラムを作りました。

  if(nCross==1){PlaySound(SOUND_UP);prepare;cross_line;nOnline=0;nCross++;}
  else if(nCross==2){PlaySound(SOUND_UP);prepare;turn_left;nOnline=0:nCross++;}
  else if(nCross==3){PlaySound(SOUND_UP);prepare;cross_line;nOnline=0;nCross++;}
  else if(nCross==4){PlaySound(SOUND_UP);prepare;turn_right;nOnline=0;nCross++;}
  else if(nCross==5){PlaySound(SOUND_UP);prepare;turn_right;nOnline=0;}
 }
}
 }

これは交差点に来た時のプログラムです。

ロボットがいつ交差点を認識したのか分かるように、交差点と分かったら音が鳴るプログラムを入れました。そのあとカウンターで数えた何回目の交差点かによってそれぞれの動きをするプログラムを作りました。

* [#ga6217c2]
*反省と感想 [#ga6217c2]
交差点を認識せずにそのまま普通のライントレースを続けてしまったり、逆に急カーブを交差点と認識して交差点のプログラムを始めてしまったりとなかなか思うように進めることができませんでした。交差点を認識するが急カーブは普通のライントレースをする値を探し出すことが大変でした。また、何回目の交差点かによって直進したり右左折したりと動きが変わってくるので、どのように交差点を数えて、回数によってプログラムを変えるかにも苦労しました。

テスト期間も重なってなかなかロボティクスに割く時間を作ることができませんでしたが、機械系である私にとってプログラミングをしてロボットを動かすということができたことは来年につながると思います。


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