2014b/Member?

課題内容

課題2参照
自分は1人目の方を担当した。

ロボット

今回の課題では改良する必要はないと判断し、サンプルロボットをそのまま使用した。
しかし、ロボットを共有する相方がロボットを持ったまま途中から授業に来なくなってしまいプログラムのテストが一切できていないので、プログラムのみを載せる。

方針とプログラム

方針

交差点では、1ミリ秒を1回の動作として黒が何回連続で認識されたかによって判断させることにした。
交差点を判断した後の動作(左折or右折or直進)を別のルーチンcrosslineとしてまとめることによって、課題の移動パターンが変わっても比較的楽にプログラムの書き換えをできるようにした(かった)。

プログラム

#define BLACK 36
#define WHITE 50
#define SPEED 50
#define nMAX 10
#define CROSSTIME 200
#define STEP 1

#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define timereset time = 0;

sub turnleft() //交差点での左折の動作
{
 while(SENSOR_3 < WHITE){
  OnRL(SPEED,0);
 }
}
sub turnright() //交差点での右折の動作
{
 while(SENSOR_3 < WHITE){
  OnRL(0,SPEED);
 }
}

sub crossline(int i){ //何回目の交差点かで動きを変化させる
 if((i==1) || (i==3)){ //1,3回目は直進
  OnRL(SPEED,SPEED);
 }else if((i==4) || (i==5)){ //4,5回目は右折
  turnright();
 }else if(i==2){ //2回目は左折
  turnleft();
 }
}

task main(){ //本体
 SetSensorLight(S3);
 int time = 0; //timeは連続して黒の上にいた数
 int i;
 
 while (true){
  if(SENSOR_3 < BLACK){ //センサーの値が黒の時の動作
   OnRL(SPEED,0);
   time++;
   if(time >= nMAX){ //nMAX以上で交差点と判断する
    i++;
    crossline(i);
    timereset;
   }
  }else if(SENSOR_3 < WHITE){ //白黒中間の時の動作
   OnRL(SPEED,SPEED);
   timereset;
  }else{       //白の時の動作
   OnRL(0,SPEED);
   timereset;
  }
  Wait(STEP); //1ms毎に1動作する
  Off(OUT_BC);
 }
}

反省・感想

試すことがほとんどできなかったが、1回だけ試運転させた時は、交差点判断がうまくできなかった。 それから数値などに改良を加えたが、正直上手くいっている自信はない。

相方が来なくなってしまった時に、もう少しうまい対処が出来ればよかったというのが一番の反省である。


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