[[2013a/MemberOnly/進行状況]]
#contents

*ロボット [#md7beda4]
#ref(2013a/Member/shu/Mission2/zentai.jpeg,100%,全体)
#ref(2013a/Member/shu/Mission2/hutaage.jpeg,100%,全体2)

**ロボットの説明 [#me354e0f]
***車軸回り [#w6c47205]
課題1の車軸回りを参考にして、同じように細めに作りました。~
前回の課題であった壊れやすさを補うために様々な改良が施されています。~
たとえばL字型の部品を使ってモーターを固定している点などです。~
前回より強固な車軸ができたと思います。~
#ref(2013a/Member/shu/Mission2/syaziku.jpeg,100%,車軸回り)
***発射機構&受取機構 [#v3b7201d]
ここが一番の課題でした。~
最初の計画ではプーリの回転を使った機構を考えていましたが、思うようにボールをつかめなかったので急遽変更しました。~
受け取るときはふたを被せるようにしてボールを押さえつけることで固定します。~
打ち出すときはふたの一番奥についている棒ではじいて打ち出します。~
打ち出す棒がまっすぐなのでボールがふたの中のどの位置にあってもまっすぐに打ち出すことがで来ます。~
#ref(2013a/Member/shu/Mission2/huta.jpeg,100%,発射機構&受取機構)
~
この機構を動かすためにはモーターを非常に不安定な場所につけなければいけません。~
また、モーターがうまく収まらず、歯車同士のかみ合わせが非常に悪くなってしまいました。~
このかみ合わせを直すために大小さまざまな歯車を組み合わせました。~
これによって何とか動くまでにかみ合わせを修正できました。~
#ref(2013a/Member/shu/Mission2/haguruma.jpeg,100%,歯車)


**工夫した点 [#lfa10ce7]
-ボールを撃つ機構とボールを受け取る機構を一つのモーターで行うために蓋を被せるような形にした。
-車輪の間隔を限界まで狭くして小回りのききやすいロボットに仕上げた。
-被せる蓋を横に広くすることでパスミスをカバーしやすくした。
-車高を低くすることで重心を低くし、安定性を出した。
**苦労した点 [#w25f0a11]
歯車をうまくかみ合わせるのが非常に難しく、最終的に少し歯車間に隙間ができてしまいました。~
また、ライントレース用の光センサーと車軸との距離をできるだけ近付くようにするのが大変でした。~

*コース攻略 [#yca92c60]
**ボールをシュートする側 [#od625558]
#ref(2013a/Member/shu/Mission2/robocon2013a.png,100%,シュート側)
+スタートは,ら
+,ら△泙任聾鮑硬世△蠅離薀ぅ鵐肇譟璽
+交差点の数で△鯣獣任靴謄魁璽稿眤Δ鮓く
+パスをもらったら向きを戻してまで交差点ありライントレース
+交差点を過ぎてからの時間指定でを判断してコース内側を向く
+パスを打ったら向きを戻してい泙埜鮑硬世△螢薀ぅ鵐肇譟璽
+交差点を過ぎてからの時間指定でい鯣獣任靴謄魁璽稿眤Δ鮓く
+スタートは�から
+�から�までは交差点ありのライントレース
+交差点の数で�を判断してコース内側を向く
+パスをもらったら向きを戻して�まで交差点ありライントレース
+交差点を過ぎてからの時間指定で�を判断してコース内側を向く
+パスを打ったら向きを戻して�まで交差点ありライントレース
+交差点を過ぎてからの時間指定で�を判断してコース内側を向く
+パスをもらったら向きを戻して交差点ありライントレース
+イ慮鮑硬世鯣獣任靴燭藝犬棒回してシュート
+�の交差点を判断したら左に旋回してシュート

**ボールをシュートしない側 [#va31b664]
#ref(2013a/Member/shu/Mission2/not_shot.png,100%,シュートしない側)
+スタートは,ら
+,ら△泙任聾鮑硬世△蠅離薀ぅ鵐肇譟璽
+交差点からの時間で△鯣獣任靴燭薀棔璽襪里曚Δ鮓いてそのまま前進してボールをつかむ
+スタートは�から
+�から�までは交差点ありのライントレース
+交差点からの時間で�を判断したらボールのほうを向いてそのまま前進してボールをつかむ
+ボールを取ったら左旋回をしてまっすぐ進み、ラインについたらそのまま交差点ありライントレース
+の交差点を判断したらコース内側を向きパスを打つ
+�の交差点を判断したらコース内側を向きパスを打つ
+パスを打ったら元の向きに戻って交差点ありライントレース
+交差点からの時間でい鯣獣任靴謄魁璽稿眤Δ鮓き、パスをもらう
+交差点からの時間で�を判断してコース内側を向き、パスをもらう
+パスをもらったら元の向きに戻って交差点ありライントレース
+イ慮鮑硬世鯣獣任靴燭薀魁璽稿眤Δ鮓いてパス
+�の交差点を判断したらコース内側を向いてパス

*プログラム [#ja822e4d]
**全体紹介 [#o849cfc6]
***ボールをシュートする側 [#se6ab982]
 #define BLACK_high 36 //一番黒いしきい値
 #define BLACK_low 38 //少し黒いしきい値
 #define WHITE_low 42 //少し白いしきい値
 #define WHITE_high 44 //一番黒いしきい値
 #define WHITE_high 44 //一番白いしきい値
 #define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //左旋回
 #define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左前進
 #define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C);	 //右前進
 #define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //右旋回
 #define go_fwd OnFwd(OUT_AC); //前進
 #define short_break Off(OUT_AC); Wait(100); //小休止
 #define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
 #define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受け取る
 #define time2 10 //シュートしない側が交差点から一回目に前進する時間
 #define time3 10 //シュートしない側が交差点から二回目に前進する時間
 #define nMAX	300 //交差点と判断する基準
 #define STEP 1 //ライントレース時の待ち時間   
 task main(){
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 int nOnline=0;
 int nCross=0;
 int counter=0;
 while (nCross < 2) {
 //交差点までのライントレース 
 while (nOnline < nMAX) {
 if(SENSOR_1 < BLACK_high) {
  turn_right_senkai;
  nOnline++;
 } else {
  if (SENSOR_1 < BLACK_low) {
   turn_right_kaiten;
  } else if (SENSOR_1 < WHITE_low) {
   go_fwd;
  } else if (SENSOR_1 < WHITE_high) {
   turn_left_kaiten;
  } else {
   turn_left_senkai;
   }
   nOnline==0;
 }
  Wait(STEP);
 }
 PlaySound(SOUND_UP); //交差点を感知してwhileから抜ける
 short_break;
 nCross++;
 nOnline=0;
 }
 turn_left_senkai; 
 Wait(70);
 until(FastTimer(1) > 4500);
 CATCHBALL;
 turn_left_senkai;
 Wait(70);
 while (FastTimer(0) <= time2){ 
 if(SENSOR_1 < BLACK_high) {
  turn_right_senkai;
 } else if (SENSOR_1 < BLACK_low) {
  back_turn_right_kaiten;
 } else if (SENSOR_1 < WHITE_low) {
  go_fwd;
 } else if (SENSOR_1 < WHITE_high) {
  back_turn_left_kaiten;
 } else {
  turn_left_senkai;
 }
  Wait(STEP);
 } 
 nCross=0;
 turn_right_senkai;
 wait(70);
 until(FastTimer(1) > 6000);
 SHOTBALL;
 turn_left_senkai;
 Wait(70); 
 while (nCross < 1){ 
 while (nOnline < nMAX){
  if(SENSOR_1 < BLACK_high){
   turn_right_senkai;
   nOnline++;
  } else { 
   if (SENSOR_1 < BLACK_low){
   turn_right_kaiten;
  } else if (SENSOR_1 < WHITE_low){
   go_fwd
  } else if (SENSOR_1 < WHITE_high){
   turn_left_kaiten;
  } else {
   turn_left_senkai;
   }
 nOnline==0;
 }
  Wait(STEP);
 }
 PlaySound(SOUND_UP);
 short_break;
 nCross++;
 nOnline=0;
 }  
 while (FastTimer(0) <= time2){
 if(SENSOR_1 < BLACK_high) {
  turn_right_senkai;
 } else if (SENSOR_1 < BLACK_low) {
  back_turn_right_kaiten;
 } else if (SENSOR_1 < WHITE_low) {
  go_fwd;
 } else if (SENSOR_1 < WHITE_high) {
  back_turn_left_kaiten;
 } else {
  turn_left_senkai;
 }
  Wait(STEP);
 }  
 turn_right_senkai;
 Wait(70); 
 until(FastTimer(1) > 7500);  
 CATCHBALL;  
 turn_left_senkai;
 Wait(70);
 while(counter < 1){
  while(nOnline < nMAX){ 
   if (SENSOR_1 < 38){
    turn_right_senkai;
    nOnline++;
   } else {
   if (SENSOR_1 < 39){
    turn_right_kaiten;
   } else if (SENSOR_1 < 42){
    go_fwd;
   } else if (SENSOR_1 < 44){
    turn_left_kaiten;
   } else {
    turn_left_senkai;
    }
    }  
  nOnline=0;
  }
 Wait(STEP);
 }
 short_break;
 turn_left_senkai; Wait(150);
 go_rev; Wait(100);
 SHOTBALL;  
 }
 
***ボールをシュートしない側 [#o71443ca]
 #define BLACK_high 36 //一番黒いしきい値
 #define BLACK_low 38 //少し黒いしきい値
 #define WHITE_low 42 //少し白いしきい値
 #define WHITE_high 44 //一番黒いしきい値
 #define WHITE_high 44 //一番白いしきい値
 #define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //左旋回
 #define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左前進
 #define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C);	 //右前進
 #define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //右旋回
 #define go_fwd OnFwd(OUT_AC); //前進
 #define short_break Off(OUT_AC); Wait(100); //小休止
 #define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
 #define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受け取る
 #define TURNSTEP 10	 //横のセンサーを使う時の繰り返しの待ち時間
 #define time2 10 //シュートしない側が交差点から一回目に前進する時間
 #define time3 10 //シュートしない側が交差点から二回目に前進する時間
 #define nMAX	300 //交差点と判断する基準
 #define STEP 1 //ライントレース時の待ち時間
 task main(){
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  int nOnline=0;
  int nCross=0;
 ClearTimer(0);
   while(nCross <= 1){
   while(nOnline < nMAX){
     if(SENSOR_1 < BLACK_high){ 
	turn_left_senkai ;
	nOnline++ ;
    } else if(SENSOR_2 < BLACK_low){
	turn_left_kaiten;
    } else if(SENSOR_2 < WHITE_low){
	go_fwd;
    } else if(SENSOR_2 < WHITE_high){
	turn_right_kaiten;
    } else {
	turn_right_senkai;
     } 
   }
  nOnline == 0;
  nCross ++;
  short_break;
  cross_line;
  }
  nCross=0;
  go_fwd;
  Wait(500);
  OnRev(OUT_A);
  OnFwd(OUT_C);
  Wait(100);    //ボールに向く  
  CATCHBALL;
  OnFwd(OUT_AC);
  Wait(200);   //ボールを取る
  until(SENSOR_1 < BLACK_low){
    turn_left_kaiten;
  }                //コースに戻る
  while(nCross <= 1){
    if(SENSOR_1 < BLACK_high){
	turn_left_senkai;
	nOnline ++;
    } else if(SENSOR_2 < BLACK_low){
	turn_left_kaiten;
    } else if(SENSOR_2 < WHITE_low){
	go_fwd;
    } else if(SENSOR_2 < WHITE_high){
	turn_right_kaiten;
    } else {
	turn_right_senkai;
     } 
   }
 nCross=0;
 turn_left_senkai;
 Wait(70);
 until(FastTimer(1) > 4500);
 SHOTBALL;
 turn_right_senkai;
 Wait(70);
  while(nCross <= 1){
    if(SENSOR_1 < BLACK_high){
	turn_left_senkai;
	nOnline ++;
    } else if(SENSOR_2 < BLACK_low){
	turn_left_kaiten;
    } else if(SENSOR_2 < WHITE_low){
	go_fwd;
    } else if(SENSOR_2 < WHITE_high){
	turn_right_kaiten;
    } else {
	turn_right_senkai;
     } 
   }
 nCross=0; 
 while (FastTimer(0) <= time2){ 
 if(SENSOR_1 < BLACK_high) {
  turn_right_senkai;
 } else if (SENSOR_1 < BLACK_low) {
  back_turn_right_kaiten;
 } else if (SENSOR_1 < WHITE_low) {
  go_fwd;
 } else if (SENSOR_1 < WHITE_high) {
  back_turn_left_kaiten;
 } else {
  turn_left_senkai;
 }
  Wait(STEP);
 }
 turn_left_senkai;
 Wait(70);
 until(FastTimer(1) > 6000);
 CATCHBALL;
 turn_right_senkai;
 Wait(70);
 while (nCross < 1){ 
  while (nOnline < nMAX){
  if(SENSOR_1 < BLACK_high){
   turn_right_senkai;
   nOnline++;
  } else { 
   if (SENSOR_1 < BLACK_low){
   turn_right_kaiten;
  } else if (SENSOR_1 < WHITE_low){
   go_fwd
  } else if (SENSOR_1 < WHITE_high){
   turn_left_kaiten;
  } else {
   turn_left_senkai;
   }
 nOnline==0;
 }
  Wait(STEP);
 }
 PlaySound(SOUND_UP);
 short_break;
 nCross++;
 nOnline=0;
 }
 turn_left_senkai;
 Wait(70);
 until(FastTimer(1) > 7500); 
 SHOTBALL; 
 }  


**ボールをシュートする側の細かな説明 [#oc4badff]
***定義 [#fa647009]
 #define BLACK_high 36 //一番黒いしきい値
 #define BLACK_low 38 //少し黒いしきい値
 #define WHITE_low 42 //少し白いしきい値
 #define WHITE_high 44 //一番黒いしきい値
 #define WHITE_high 44 //一番白いしきい値
 #define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //左旋回
 #define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左前進
 #define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C);	 //右前進
 #define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //右旋回
 #define go_fwd OnFwd(OUT_AC); //前進
 #define short_break Off(OUT_AC); Wait(100); //小休止
 #define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
 #define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受け取る
 #define time2 10 //シュートしない側が交差点から一回目に前進する時間
 #define time3 10 //シュートしない側が交差点から二回目に前進する時間
 #define nMAX	300 //交差点と判断する基準
 #define STEP 1 //ライントレース時の待ち時間   
~
まずはライントレース時のしきい値とライントレースするときによく使う一連の動きを定義しておきます。~
続いてこの課題で重要な動きであるボールの発射と受け取りの動作を定義します。~
最後に時間関係の定数を定義します。~

***スタートから第一のパス [#e200f31d]

 task main(){
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 int nOnline=0;
 int nCross=0;
 int counter=0;
 while (nCross < 2) {
 //交差点までのライントレース 
 while (nOnline < nMAX) {
 if(SENSOR_1 < BLACK_high) {
  turn_right_senkai;
  nOnline++;
 } else {
  if (SENSOR_1 < BLACK_low) {
   turn_right_kaiten;
  } else if (SENSOR_1 < WHITE_low) {
   go_fwd;
  } else if (SENSOR_1 < WHITE_high) {
   turn_left_kaiten;
  } else {
   turn_left_senkai;
   }
   nOnline==0;
 }
  Wait(STEP);
 }
 PlaySound(SOUND_UP); //交差点を感知してwhileから抜ける
 short_break;
 nCross++;
 nOnline=0;
 }
 turn_left_senkai; 
 Wait(70);
 until(FastTimer(1) > 4500);
 CATCHBALL;
 turn_left_senkai;
 Wait(70);
~
まずはスタート位置から二回交差点をこえるまでライントレースを行います。~
二回目の交差点をこえたら左に旋回してパスをもらう準備をします。~
スタートしてからの時間がある点をこえたときにパスをします。~
そのままボールを持ちながら進む方向へと向きを変えます。~

***第一パスから第二パス [#x6eebfdc]
 while (nCross < 1){ 
 while (nOnline < nMAX){
 if(SENSOR_1 < BLACK_high){
  turn_right_senkai;
  nOnline++;
 } else { 
  if (SENSOR_1 < BLACK_low){
   turn_right_kaiten;
  } else if (SENSOR_1 < WHITE_low){
   go_fwd
  } else if (SENSOR_1 < WHITE_high){
   turn_left_kaiten;
  } else {
   turn_left_senkai;
   }
   nOnline==0;
   }
   Wait(STEP);
  }
 PlaySound(SOUND_UP);
 short_break;
 nCross++;
 nOnline=0;
 }
 while (FastTimer(0) <= time2){ 
 if(SENSOR_1 < BLACK_high) {
  turn_right_senkai;
 } else if (SENSOR_1 < BLACK_low) {
  back_turn_right_kaiten;
 } else if (SENSOR_1 < WHITE_low) {
  go_fwd;
 } else if (SENSOR_1 < WHITE_high) {
  back_turn_left_kaiten;
 } else {
  turn_left_senkai;
 }
  Wait(STEP);
 } 
 nCross=0;
 turn_right_senkai;
 wait(70);
 until(FastTimer(1) > 6000);
 SHOTBALL;
 turn_left_senkai;
 Wait(70); 
~
第一パスを終えたらそのままライントレースを行い交差点まで行きます。~
交差点をこえた時から時間をはかり二つの交差点の中心までライントレースします。~
中心についたら右に旋回してパスを待ちます。~
再びスタートしてからの時間がある点をこえたときにパスをします。~
パスを打ち終わったら元の向きに戻ります。~

***第二パスから第三パス [#r3994544]
 while (nCross < 1){ 
 while (nOnline < nMAX){
  if(SENSOR_1 < BLACK_high){
   turn_right_senkai;
   nOnline++;
  } else { 
   if (SENSOR_1 < BLACK_low){
   turn_right_kaiten;
  } else if (SENSOR_1 < WHITE_low){
   go_fwd
  } else if (SENSOR_1 < WHITE_high){
   turn_left_kaiten;
  } else {
   turn_left_senkai;
   }
 nOnline==0;
 }
  Wait(STEP);
 }
 PlaySound(SOUND_UP);
 short_break;
 nCross++;
 nOnline=0;
 }  
 while (FastTimer(0) <= time2){
 if(SENSOR_1 < BLACK_high) {
  turn_right_senkai;
 } else if (SENSOR_1 < BLACK_low) {
  back_turn_right_kaiten;
 } else if (SENSOR_1 < WHITE_low) {
  go_fwd;
 } else if (SENSOR_1 < WHITE_high) {
  back_turn_left_kaiten;
 } else {
  turn_left_senkai;
 }
  Wait(STEP);
 }  
 turn_right_senkai;
 Wait(70); 
 until(FastTimer(1) > 7500);  
 CATCHBALL;  
 turn_left_senkai;
 Wait(70);
~
ここは第一から第二とほぼ同じ動きをします。~
違うところは交差点から時間で進むときの距離が短いことです。~

***第三パスからシュート [#xca79d27]
 while(counter < 1){
  while(nOnline < nMAX){ 
   if (SENSOR_1 < 38){
    turn_right_senkai;
    nOnline++;
   } else {
   if (SENSOR_1 < 39){
    turn_right_kaiten;
   } else if (SENSOR_1 < 42){
    go_fwd;
   } else if (SENSOR_1 < 44){
    turn_left_kaiten;
   } else {
    turn_left_senkai;
    }
    }  
  nOnline=0;
  }
 Wait(STEP);
 }
 short_break;
 turn_left_senkai; Wait(150);
 go_rev; Wait(100);
 SHOTBALL;  
 }
~
まずはゴール近くの交差点までひたすらライントレースをします。~
この交差点を基準にすることで時間指定するよりも誤差が格段に減り、シュート成功確率も跳ね上がります。~
あとは左に旋回し、後ろに少し下がってからシュートを打ちます。~
後ろに下がるのは規定に「輪の中に入った状態でシュートをしてはいけない」とあるからです。~

**ボールをシュートしない側の細かな説明 [#s01974ff]
***定義 [#xcb8f087]
 #define BLACK_high 36 //一番黒いしきい値
 #define BLACK_low 38 //少し黒いしきい値
 #define WHITE_low 42 //少し白いしきい値
 #define WHITE_high 44 //一番黒いしきい値
 #define WHITE_high 44 //一番白いしきい値
 #define turn_left_senkai OnRev(OUT_A); OnFwd(OUT_C); //左旋回
 #define turn_left_kaiten Off(OUT_A); OnFwd(OUT_C); //左前進
 #define turn_right_kaiten OnFwd(OUT_A); Off(OUT_C);	 //右前進
 #define turn_right_senkai OnFwd(OUT_A); OnRev(OUT_C); //右旋回
 #define go_fwd OnFwd(OUT_AC); //前進
 #define short_break Off(OUT_AC); Wait(100); //小休止
 #define SHOTBALL OnFwd(OUT_B); Wait(500); //ボールを撃つ
 #define CATCHBALL OnRev(OUT_B); Wait(500); //ボールを受け取る
 #define TURNSTEP 10	 //横のセンサーを使う時の繰り返しの待ち時間
 #define time2 10 //シュートしない側が交差点から一回目に前進する時間
 #define time3 10 //シュートしない側が交差点から二回目に前進する時間
 #define nMAX	300 //交差点と判断する基準
 #define STEP 1 //ライントレース時の待ち時間
~
ここはシュートする側とほぼ同じになります。~
進む時間に微妙な違いがあります。~

***スタートからボールを取るまで [#p983ccd5]

 task main(){
  SetSensor(SENSOR_2,SENSOR_LIGHT);
  int nOnline=0;
  int nCross=0;
 ClearTimer(0);
   while(nCross <= 1){
   while(nOnline < nMAX){
     if(SENSOR_1 < BLACK_high){ 
	turn_left_senkai ;
	nOnline++ ;
    } else if(SENSOR_2 < BLACK_low){
	turn_left_kaiten;
    } else if(SENSOR_2 < WHITE_low){
	go_fwd;
    } else if(SENSOR_2 < WHITE_high){
	turn_right_kaiten;
    } else {
	turn_right_senkai;
     } 
   }
  nOnline == 0;
  nCross ++;
  short_break;
  cross_line;
  }
  nCross=0;
  go_fwd;
  Wait(500);
  OnRev(OUT_A);
  OnFwd(OUT_C);
  Wait(100);    //ボールに向く  
  CATCHBALL;
  OnFwd(OUT_AC);
  Wait(200);   //ボールを取る
~
まずは交差点までライントレースをします。~
交差点をこえたら一定時間直進をし、そのまま右に旋回しボールに向きます。~
ライントレースしながらの時間指定だとしきい値によって進む速度が変動してしまいうまくボールが取れなかったので直進することにしました。~
ボールに向いたらそのまま直進しボールを取ります。~

***ボールを取ってから第一パスまで [#g6ff842b]
  until(SENSOR_1 < BLACK_low){
    turn_left_kaiten;
  }                //コースに戻る
  while(nCross <= 1){
    if(SENSOR_1 < BLACK_high){
	turn_left_senkai;
	nOnline ++;
    } else if(SENSOR_2 < BLACK_low){
	turn_left_kaiten;
    } else if(SENSOR_2 < WHITE_low){
	go_fwd;
    } else if(SENSOR_2 < WHITE_high){
	turn_right_kaiten;
    } else {
	turn_right_senkai;
     } 
   }
 nCross=0;
 turn_left_senkai;
 Wait(70);
 until(FastTimer(1) > 4500);
 SHOTBALL;
 turn_right_senkai;
 Wait(70);
~
ボールを取ったらラインを感知するまで左に進み、ラインに乗ったらライントレースを開始します。~
交差点までライントレースをして、交差点を感知したらコース内側を向いてパスの準備をします。~
スタートしてからの時間がある点をこえたところでパスをして、そのまま元の向きに戻ります。~

***第一パスから第二パス [#m3639805]
 while (FastTimer(0) <= time2){ 
 if(SENSOR_1 < BLACK_high) {
  turn_right_senkai;
 } else if (SENSOR_1 < BLACK_low) {
  back_turn_right_kaiten;
 } else if (SENSOR_1 < WHITE_low) {
  go_fwd;
 } else if (SENSOR_1 < WHITE_high) {
  back_turn_left_kaiten;
 } else {
  turn_left_senkai;
 }
  Wait(STEP);
 }
 turn_left_senkai;
 Wait(70);
 until(FastTimer(1) > 6000);
 CATCHBALL;
 turn_right_senkai;
 Wait(70);
~
第一パスを終えたら再び時間指定付きライントレースを行います。~
ここの距離は短いので誤差は少なくて済みます。~
ある点まですすんだらコース内側を向き、パスの準備をします。~
スタートしてからの時間がある点をこえたところでパスをして、そのまま元の向きに戻ります。~

***第二パスから第三パス [#q41cab41]
 while (nCross < 1){ 
  while (nOnline < nMAX){
  if(SENSOR_1 < BLACK_high){
   turn_right_senkai;
   nOnline++;
  } else { 
   if (SENSOR_1 < BLACK_low){
   turn_right_kaiten;
  } else if (SENSOR_1 < WHITE_low){
   go_fwd
  } else if (SENSOR_1 < WHITE_high){
   turn_left_kaiten;
  } else {
   turn_left_senkai;
   }
 nOnline==0;
 }
  Wait(STEP);
 }
 PlaySound(SOUND_UP);
 short_break;
 nCross++;
 nOnline=0;
 }
 turn_left_senkai;
 Wait(70);
 until(FastTimer(1) > 7500); 
 SHOTBALL; 
 }  
~
第二パスを終えたら次の交差点までライントレースをします。~
交差点をこえたら少し進んでから左に旋回してコース内側を向きます。~
スタートしてからの時間がある点をこえたところでパスをして、役目を終えます。~
*感想 [#j043eb13]
今回は二つのロボットを使うということで役割分担をしっかりとして各々の負担を減らすよう心がけました。~
ロボット自体はほとんど同じ形にすることでシュート位置のずれなどを極力なくしました。~
前回の課題では準備不足が祟って失敗してしまったので今回は早めに準備をしようという話になりました。~
しかしテスト期間と重なったのもあってかなかなか4人で集まる時間が作れず、各々の作業は終わっているのに合わせて確認することができない、という日々が続いてしまいました。~
結局集まれるようになったのは本番の一週間前からでほとんど余裕がありませんでした。~
しかしここでプログラムを合わせるとロボットが命令どうりにうごかない、という大変なことが起こってしまいました。~
これによって動作を一つずつ確認しながらプログラムを合わせていくという途方もない作業が必要となり、実際に合わせて動かす時間がほとんどありませんでした。~
そんな不完全なまま本番に臨んでしまい、結果は散々たるものでした。~
今回の敗因はお互いの認識に若干の誤差があったため思うようにプログラムが合わなかった点にあると思います。~
これは社会にでてからチームでプログラムを作るときにとても大事なことです。~
もっと深く話し合ってお互いの認識が一致しているか確認してから作業をすべきでした。~
このゼミはこれで終わりですが、ここでの失敗を別の機会に生かしたいと思います。~

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