目次

課題2の内容

黒い線で作成したコースに沿って動くロボットを製作する。

ただし交差点では次のような動きをさせる。

一人目 一回目に交差点にさしかかったときは直進
二回目は左折
三回目は直進
四回目は右折
五回目は右折 → ゴールへ

 

二人目
一回目に交差点にさしかかったときは左折
二回目は右折
三回目は左折
四回目は直進
五回目は直進 → ゴールへ

 

以下を参照

課題2

 

自分は二人目の動作をさせた。

ロボット本体

最初の冊子にのっていたライントレース用のロボットは、カーブでセンサーが黒線から外れてしまったので、光センサーを本体からなるべく近くに設置しなおした。
これによってセンサーが外れることはなくなった。

プログラム

基本的には冊子に乗っていたライントレースのプログラムを利用した。

使用したマクロ

しきい値と各スピード

#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_forward OnRL(SPEED_H,SPEED_H);

左に曲がる(両輪)

#define turn_left1 OnRL(SPEED_L,-SPEED_L);

左に曲がる(片輪)

#define turn_left0 OnRL(SPEED_L,0);

右に曲がる(片輪)

#define turn_right0 OnRL(0,SPEED_L);

右に曲がる(両輪)

#define turn_right1 OnRL(-SPEED_L,SPEED_L);

交差点での動き

#define STEP 1

交差点のしきい値

#define nMAX 150

1秒止まる

#define short_break Off(OUT_BC);Wait(1000);

交差点を渡る時間

#define CROSS_TIME 200

交差点を渡る

#define closs_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;

main関数

task main()

{

  SetSensorLight(S3);

  int nOnline=0;
  int closs_number=1;  //交差点の番号(何回目の交差点か)

ライントレースと、交差点の判断

  while(true){

    while(nOnline < nMAX){

      if(SENSOR_3 < THRESHOLD-15){  //ほぼ黒線上

         turn_left1;

         PlaySound(SOUND_LOW_BEEP);  //低いビープ音を鳴らす

	  nOnline++;

      }else{

	  if(SENSOR_3 < THRESHOLD-7){  //黒に近い

            turn_left0;

      }else if(SENSOR_3 < THRESHOLD+7){  //中間

          go_forward;

      }else if(SENSOR_3 < THRESHOLD+15){  //白に近い

	    turn_right0;

      }else{  //ほとんど白

  	    turn_right1;

           PlaySound(SOUND_LOW_BEEP);  //低いビープ音を鳴らす

      }

     nOnline=0;

    }

    Wait(STEP);

    }

交差点における判断

  /*交差点であるとき*/

   if(closs_number != 3){  //3回目の交差点のとき、曲がる(回数はとりあえず)

      short_break;

      turn_right1;Wait(nMAX*STEP);

      closs_line;

      nOnline=0;  //回数を1増やす

      closs_number++;  //交差点の番号を1増やす

      PlaySound(SOUND_CLICK);  //クリック音を鳴らす

   }

   else  //そうでないとき

   {

      nOnline=0;  //回数をリセット

      closs_number++;  //交差点の番号を1増やす
 
      PlaySound(SOUND_UP);  //「テレレー↑」という音をならす

   }

  }

}

問題点

いくつか問題が発生して、解決できたものとできなかったものがあった

問題:交差点の判断ができない(解決済み)

交差点を正しく認識できなくなった。何度も走らせて確かめたところ、毎回交差点を曲がり角と誤認して左に曲がってしまっていた。

解決法

(完全に黒線上にいた回数) < (交差点の判断基準となる回数) となっているはずなので、交差点の判断基準であるnMAXの値を300から150に変更したところ、正常に判断できるようになった。

問題:小さいカーブを曲がれない(未解決)

センサーを近くしたことで大きなカーブでは問題なく黒線を追えるようになったが、小さい円の部分を曲がるときにセンサーが外れてしまった。このときのタイヤの動きを観察したところ、外側のタイヤのみが回転して曲がっていたため、内輪差でセンサーが外れてしまっていることがわかった。

解決法

外側のタイヤの回転だけでは曲がりきれないので、内側のタイヤを逆回転させればよいと思われる。(時間切れで実装に至らなかった。)

考察・感想

プログラムの問題を修正することに時間がかかってしまい、結局目的の動きをさせることはできなかった。交差点の判断はできているはずなので、あとはカーブを曲がれるようになればあとは「いまが何回目の交差点か」をかぞえて、if文を使って曲がる or 曲がらないの判断をすれば、課題は達成できると思う。
問題に気づくのが遅れてしまい、対策を考えるのが遅くなったので、次回はもっと早めに試す機会を作るようにしたい。


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-02-11 (水) 23:59:45