■課題11■

■必修課題■

各モータ系の関数(foward()など)が-1を返してきたときには,一度ロボットを停止し,全センサをチェックして,その結果次第で次の動作を決定するような判断ルーチンを作成せよ.

これは,右手法と呼ばれる迷路をとくための判断ルーチンである.右手伝いに壁に右手を付けたまま進めば,いずれ迷路のゴールにたどり着くことを利用している.

ヒント

課題10で使用したchechSensor()の返値を使用して,次のようにmain関数に判断ルーチンを作成すればよい.(switch文の説明)

void main(void)
{
  初期化部分

  for(;;)
  {
      センサ結果=checkSensor(基準値);
      switch(センサ結果)
      {
         case 右センサに反応なしの場合:
           turnRight();
           break;
         case 前センサに反応なしの場合:
           followRight();
           break;
         case ほかの状況:
           その状況に適した行動;
           break;
         case ほかの状況:
           その状況に適した行動;
           break;
         case
           以下略 ← 考えられるすべての状況に対処しないといけない
      }
  }
}

壁に接触しないように、より細かい制御のためには、次のように各case内部で、動作結果をちゃんと調べて、失敗したときの対処を行う必要がある。例えば次のような単純な対応ができる。

  case 右センサに反応なしの場合:
    返値=turnRight();
    if(返値==失敗を意味する値)
    {
       //turnRight()に失敗したときの対処、例えば次のようにバックさせる
       back3cm();
    }
    break;

さらに、そこまでする必要はないかもしれないが、もっと細かく制御するためには、距離値を直接確認することも考えられる.

  case 行き止まりの場合:
       右センサ値 = readSensor(0); //右センサの読み込み
       左センサ値 = readSensor(2); //左センサの読み込み
       if(右の方が壁から遠い)
       {
             右回りで180度回転
       }
       else
       {
             左回りで180度回転
       }
    }
    break;

readSensor()は,sensor.cの中に用意されている関数で,課題9で使用したreadSensorと同じ動作をする関数である.

■締め切り■