※製作途中※ 目次 #contents *はじめに [#h30f9622] 課題は指定されたルートに沿ってロボットをライントレースさせるというもので、具体的には、 -一回目に交差点にさしかかったときは直進 -二回目は左折 -三回目は直進 -四回目は右折 -五回目は右折 → ゴールへ という動きである。 ([[2014年後期/課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%2FMission2]]より) *プログラムの説明 [#uee9a021] 今回私はタイマー機能を使って区間ごとにプログラムを変え、ロボットにライントレースをさせた。ライントレースさせるためのプログラムは主に また、小タイトル後の()内はそのプログラムの略称を示している。 **タイマー機能 [#f68eaa40] プログラミング方法は、ある基準となる時刻を記憶しておき、その時刻と現在との差を計算するという方法である。 long t0=CurrentTick(); while(CurrentTick()-t0<=○){ … } (○の部分に時間を記入する) **交差点を渡るプログラム(交差点) [#x28ffe2d] 一般に、交差点を渡るために while(タイマー){ while(nOnline<nMAX){ if(SENSOR_3<THRESHOLD-12){ turn_left1; nOnline++; }else{ if(SENSOR_3<THRESHOLD-7){ turn_left0; }else if(SENSOR_3<THRESHOLD+7){ go_forward; }else if(SENSOR_3<THRESHOLD+13){ turn_right0; }else{ turn_right1; } nOnline=0; } Wait(STEP); } short_break; turn_right1;Wait(nMAX*STEP); cross_line; nOnline=0; } **黒い線(の境界線)に沿って動くプログラム(白黒) [#j7bd2fc4] *苦労した点・問題点・解決策 [#bb6ab3b9] 私が一番苦労したことは、ロボットがちゃんとライントレースをしてくれないということである。と、いうのは、資料通りのプログラムなら交差点に差し掛かった際、ライン上に沿ってロボットは進もうとするため、右または左に曲がってしまい工夫を施して交差点で直進出来るようにしなければならない。しかし私のロボットは例題のプログラムにしても交差点を直進してしまう。つまり、ちゃんと線に沿って進んでいないということである。 これを改善しようとセンサーの値やスピードを変えるなどの工夫をしたものの、交差点で直進してしまうのは変わらなかった。しかし、他の班のロボットとレースで私のプログラムを使用したところ、ちゃんと線に沿ってくれ、交差点部分で右または左に沿うように進んでくれた。このことから、私の班のレース(線)の交差点に何らかの不具合があることが分かった。 レース自体を書き直すわけにはいかない為、プログラミングで交差点に差し掛かったら左右に向きを変えるよう調整した。その方法として、交差点を渡るためのプログラムを応用して、何度も何度も左に繰り返し、連続した黒の点がある数を超えると右または左に旋回するというプログラムを作ろうとした。しかし、上手くいかなかったため、交差点を渡るためのプログラムをロボットに実際に動かせ、ストップウォッチで交差点に差し掛かるまでの時間を計り、その時間を使ってタイマー機能によって、交差点に差し掛かった時間になったら右または左に旋回させるというプログラミングを作ったところ、上手く左右へ曲がれるようになったため、このプログラムを使うことにした。 *ライントレース [#sc51066f] ロボットにライントレースをさせるために4つのパターンを考え、4つ目のプログラムがライントレースを成功させることが出来た。 1~3パターン目のプログラムでは、失敗した理由と改善点を説明する。 1. 交差点(18s)→左旋回(黒線にかかるまで)→交差点(27s)→右旋回(黒線にかかるまで)→交差点(18s) 2. 交差点(10s)→白黒(10s)→左旋回(黒線にかかるまで)→交差点(10s)→右旋回(黒線にかかるまで)→交差点(18s) 3. 白黒(21s)→左旋回(黒線にかかるまで)→白黒(20s)→右旋回(黒線にかかるまで)→白黒(10s)→右旋回(黒線にかかるまで)→白黒(30s) 4. 白黒(21s)→左旋回(0.8s)→白黒(20s)→右旋回(0.8s)→白黒(10s)→右旋回(0.8s)→白黒(30s) #define SPEED 53 #define THRESHOLD 45 #define SPEED_H1 60 #define SPEED_H2 50 #define SPEED_L 30 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define turn_left1 OnRL(SPEED_L,-SPEED_L); #define turn_right1 OnRL(-SPEED_L,SPEED_L); #define turn_left3 OnFwd(OUT_B,SPEED);Off(OUT_C); #define turn_right3 Off(OUT_B);OnFwd(OUT_C,SPEED); #define STEP 1 task main() { SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<=21000){ if(SENSOR_3<THRESHOLD){ turn_left3 }else{ turn_right3 } Wait(STEP); } turn_left1; Wait(800); long t1=CurrentTick(); while(CurrentTick()-t1<=20000){ if(SENSOR_3<THRESHOLD){ turn_left3 }else{ turn_right3 } Wait(STEP); } turn_right1; Wait(800); long t2=CurrentTick(); while(CurrentTick()-t2<=10000){ if(SENSOR_3<THRESHOLD){ turn_left3 }else{ turn_right3 } Wait(STEP); } turn_right1; Wait(800); long t3=CurrentTick(); while(CurrentTick()-t3<=50000){ if(SENSOR_3<THRESHOLD){ turn_left3 }else{ turn_right3 } Wait(STEP); } } *考察・感想 [#dd213a86]