2005/C5/しょう

ライントレーサー

int c=45; //センサー感度

task main ()
{
  SetSensor (SENSOR_1, SENSOR_LIGHT); 
  SetSensor (SENSOR_2, SENSOR_LIGHT);
  ClearTimer (0);

  while (Timer (0) < 600) //駆動時間
  {
    while (SENSOR_1<=c && SENSOR_2<=c) //線上
    {
      OnFwd (OUT_A+OUT_C);
    }

    if (SENSOR_1>c && SENSOR_2<c) //はみ出し
    {
      OnFwd (OUT_C);      //左へ
      OnRev (OUT_A);

      until (SENSOR_2 >= c);  //右へ
      
      OnFwd (OUT_A);
      OnRev (OUT_C);

      until (SENSOR_1 <= c && SENSOR_2 <= c);  //線上に戻った

      OnFwd (OUT_A);
      OnRev (OUT_C);
      Wait(5);
      OnRev (OUT_A+OUT_C);
      Wait(5);
      Off (OUT_A+OUT_C);

      if (SENSOR_1 > c && SENSOR_2 > c)
      {
        OnFwd (OUT_A+OUT_C);
        until (SENSOR_1 <= c && SENSOR_2 <= c);
      }
     }

    while (SENSOR_1<=c && SENSOR_2>c)
     {
       OnFwd (OUT_A+OUT_C);
     }

  }

  Off (OUT_A+OUT_C);
}

ロボット前方に二個のセンサーを搭載した。 先生も紹介した普通のやり方だが、うちの班のラインは細めのため横に二個搭載しても意味をなさない。(線を太くすればそれでよいのだが。)
そこで、私はロボット前方に“縦に”二個搭載してみた。
前のセンサーのみまたは両方のセンサーが線上にあるときは直進し、前のセンサーのみ線からはみ出したら左に曲がる。
後ろのセンサーも線からはみ出した場合、曲がる方向が間違っているか、線を通り越しているので両方のセンサーが線上に戻るまで右に曲がる。
これだけだと線の端に居るのでまたすぐはみ出してしまう。それを防ぐため、さらに少しだけ右に進み、後退するようにした。
後は制限時間まで同じ動作を繰り返す。

現在の問題点は、線が細い急カーブでは進路変更の部分が無限ループして動けなくなってしまうことが分かっている。時間制限を設けてループに入ってしまったら別の回避行動をとるようにすればいいだろう。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-11-19 (土) 15:32:50 (5019d)