[[2016a/Member]] *目次 [#l2279707] #contents *課題 [#o9e55d5b] 下の図のようなコースを各チームで作成し、 「ミッション」を遂行するためのロボットを作成せよ。 #ref(2016a-mission2-.png) 黒線の幅は20mmでなるべく均等な濃さにすること。 ↓↓「ミッション」↓↓ 次の経路を黒い線にそって動くロボットを作成する ただし、なるべく速く正確に動くロボットになるように工夫して、 交差点では1秒間停止すること。 •C地点からA地点へ (三人目) ◦C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点 #ref(2016a-mission2- - コピー (7).png) *ロボット本体の説明 [#yb2c36ad] 下の画像のように、ロボット本体の前方に光センサーを取り付けた 前回同様、モーターB,Cでタイヤを動かしている http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2016a%2FMember%2FEtu%2FMission2&openfile=%A5%ED%A5%DC%CB%DC%C2%CE.JPG *プログラムの説明 [#rdd5a4c5] 今回使用した定義はこれらである #define THRES1 38 #define THRES2 43 #define THRES3 53 #define THRES4 59 #define SPEED_H 30 #define SPEED_L 15 #define TIME_CROSS 230 #define move_RL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define STEP 1 #define nMAX 300 #define breaking Off(OUT_BC); Wait(500); サブルーチンはこちら sub go_forward() { move_RL(SPEED_H,SPEED_H); } //直進 sub turn_left_A() { move_RL(SPEED_L,0); } //左折 sub turn_left_B() { move_RL(SPEED_L,-SPEED_L); } //左旋回 sub turn_right_A() { move_RL(0, SPEED_L); } //右折 sub turn_right_B() { move_RL(-SPEED_L,SPEED_L); } //右旋回 sub cross_line() { move_RL(SPEED_H,SPEED_H);Wait(TIME_CROSS);breaking; } //交差点直進 task main () { SetSensorLight(S1); int n_black=0; int m_kousa=0; 下のプログラムはライントレースしつつ交差点に差し掛かると左折するプログラムである 僕のコースでは、c地点からはじまり、S交差点とP交差点で左折をするので リピートを使って二回繰り返した repeat(2){ while (n_black < nMAX) { if (SENSOR_1 < THRES1) { turn_left_B(); n_black++; } else { if (SENSOR_1 < THRES2) { turn_left_A(); } else if (SENSOR_1 < THRES3) { go_forward(); } else if (SENSOR_1 < THRES4) { turn_right_A(); } else { turn_right_B(); } n_black=0; } Wait(STEP); } breaking; PlaySound(SOUND_DOWN); turn_left_B(); Wait(1500); n_black=0; } 下のプログラムはライントレースしつつ交差点に差し掛かると直進するプログラムである P交差点を左折したあと、Q交差点をぐるっと2回通りすぎるコースなので ここでもリピートを使って2回繰り返した repeat(2) { while (n_black < nMAX) { if (SENSOR_1 < THRES1) { turn_left_B(); n_black++; } else { if (SENSOR_1 < THRES2) { turn_left_A(); } else if (SENSOR_1 < THRES3) { go_forward(); } else if (SENSOR_1 < THRES4) { turn_right_A(); } else { turn_right_B(); } n_black=0; } Wait(STEP); } breaking; PlaySound(SOUND_DOUBLE_BEEP); cross_line(); n_black=0; } 下のプログラムはライントレースしつつ交差点に差し掛かると右折するプログラムである Q交差点を2回通りすぎたあと、R交差点を右折するコースなので、ここで使った while (n_black < nMAX) { if (SENSOR_1 < THRES1) { turn_left_B(); n_black++; } else { if (SENSOR_1 < THRES2) { turn_left_A(); } else if (SENSOR_1 < THRES3) { go_forward(); } else if (SENSOR_1 < THRES4) { turn_right_A(); } else { turn_right_B(); } n_black=0; } Wait(STEP); } breaking; PlaySound(SOUND_DOWN); move_RL(0,20); Wait(1500); n_black=0; 下のプログラムは最初に使った、 ライントレースしつつ交差点に差し掛かると左折するプログラムである R交差点を右折したあと、P交差点を左折するために使った while (n_black < nMAX) { if (SENSOR_1 < THRES1) { turn_left_B(); n_black++; } else { if (SENSOR_1 < THRES2) { turn_left_A(); } else if (SENSOR_1 < THRES3) { go_forward(); } else if (SENSOR_1 < THRES4) { turn_right_A(); } else { turn_right_B(); } n_black=0; } Wait(STEP); } breaking; PlaySound(SOUND_DOUBLE_BEEP); turn_left_B(); Wait(1500); n_black=0; 下のプログラムはこれも最初に使った ライントレースしつつ交差点に差し掛かると直進するプログラムであるが 最後にA地点で止まるために1.8秒間直進するプログラムを組み込んだ P交差点を左折したあとAの場所を交差点とみなし、 A地点で止まるために使った while (n_black < nMAX) { if (SENSOR_1 < THRES1) { turn_left_B(); n_black++; } else { if (SENSOR_1 < THRES2) { turn_left_A(); } else if (SENSOR_1 < THRES3) { go_forward(); } else if (SENSOR_1 < THRES4) { turn_right_A(); } else { turn_right_B(); } n_black=0; } Wait(STEP); } breaking; go_forward(); Wait(1800); Off(OUT_BC); } *課題結果 [#h0c85155] cコースをすべての交差点を認識しゴールまでたどり着くことはできた が、成功率は五分五分といった感じだった また少し時間がかかりすぎた もっと早く進ませることができたかもしれない さらに言うと、サブルーチンの関係でプログラム全体が長ったらしくなってしまった ライントレースのサブルーチンをつくってやるともっと短く出来たかもしれない タイムは2分32秒だった *苦労した点 [#mc604dcd] しきい値の調整に苦労した また、交差点を認識させるのが難しく 特にR交差点→P交差点→A地点の時のP交差点の認識がうまくいかないことが多かったのと Q交差点→R交差点→P交差点の時のR交差点は右折で、 今回のライントレースは先の左側をベースにしていたので 右折するとなると曲がる距離の関係でモーターの出力をすこし上げなければならなくて その調整にも苦労した 21 *感想 [#mf5546d8] 今回は全体的にプログラムが長くなってしまった 交差点の認識などもむずかしく、友達と協力しながら出来たのはよかった。