目次
詳しくは課題2を参照。
E地点直進コースを選択した。
上の写真のように、規定のサイズに収まるようにロボットを改造した。センサーが取り付けられている方が前方である。
上の写真はロボットをしたから撮影したものである。センサーはできるだけ車軸に近い位置に設置し、急なカーブでも安定して走行できるようにした。
#define THRESHOLD 50 //しきい値 #define SPEED 28 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED, SPEED); #define go_back OnRL(-SPEED,-SPEED); #define turn_left1 OnRL(SPEED, -SPEED); //左旋回 #define turn_left0 OnRL(SPEED, 0); //左折 #define turn_right0 OnRL(0, SPEED); //右折 #define turn_right1 OnRL(-SPEED, SPEED); //右旋回 #define STEP 1 #define nMAX 180 //黒を認識する上限回数 sub cLeft1() //(SOUND_UP)&左旋回 { PlaySound(SOUND_UP); turn_left1; until(SENSOR_3 > THRESHOLD+12); } sub cLeft2() //(SOUND_DOWN)&一時停止&左回転 { PlaySound(SOUND_DOWN); Off(OUT_BC); Wait(1000); turn_left0; until(SENSOR_3 > THRESHOLD+12); } sub straight() //方向修正&直進 { turn_right1; Wait(600); Off(OUT_BC); go_forward; Wait(500); Off(OUT_BC); }
task main() { SetSensorLight(S3); int nOnline=0; // 続けて黒になった回数 int nTurn=0; go_forward; // Aスタート,E1 Wait(500); Off(OUT_BC); while (nTurn < 13) { while (nOnline < nMAX) { if (SENSOR_3 < THRESHOLD-10) { //濃い黒 turn_left1; nOnline++; // カウンタを増やす } else { if (SENSOR_3 < THRESHOLD-5) { //黒寄りの灰色 turn_left0; } else if (SENSOR_3 < THRESHOLD+5) { //灰色 go_forward; } else if (SENSOR_3 < THRESHOLD+10) { //白寄りの灰色 turn_right0; } else { //白色 turn_right1; } nOnline=0; //カウントをリセット } Wait(STEP); }
『E地点直進コース』では終始左側走行でも交差点認識が可能だったので、黒なら左方に、白なら右方に方向転換し、常にラインの左際を走行するようにした。また、nMAX回連続で濃い黒を認識したら、その地点が交差点もしくは曲がり角であるとした。
if(nTurn < 1){ //F cLeft1(); nTurn++; nOnline=0; } else if(nTurn < 2){ //Q cLeft2(); nTurn++; nOnline=0; } else if(nTurn < 3){ //R1 PlaySound(SOUND_UP); straight(); nTurn++; nOnline=0; } else if(nTurn < 6){ //S1,G,H cLeft1(); nTurn++; nOnline=0; } else if(nTurn < 8){ //T1,T2 PlaySound(SOUND_DOWN); Off(OUT_BC); Wait(1000); straight(); nTurn++; nOnline=0; } else if(nTurn < 9){ //R2 cLeft2(); nTurn++; nOnline=0; } else if(nTurn < 10){ //S2 PlaySound(SOUND_UP); straight(); nTurn++; nOnline=0; } else if(nTurn < 11){ //P cLeft1(); nTurn++; nOnline=0; } else if(nTurn < 12){ //E2 cLeft2(); nTurn++; nOnline=0; } else if(nTurn < 13){ //A停止 Off(OUT_BC); turn_right1; Wait(300); Off(OUT_BC); go_forward; Wait(2000); Off(OUT_BC); PlaySound(SOUND_DOWN); nTurn++; } } }
交差点と曲がり角を通過する回数と順番は分かっているので、nTurnでのカウントにより、各ポイントでの動作を分類し、すべての認識ポイントを通過した後、停止するようにした。
交差点の判別を確実にしつつ、急カーブなどでの誤認識をしないようにしきい値や速度、nMAXの調節が特に難しかった。それさえクリアすれば、後は順番に動作を並べるだけだったので、前回の課題に比べれば短時間の作業で済んだ。また、本やテレビなどでライントレースするロボットは知っていたが、今回の課題で初めて、それがどのような仕組みで動いていたか理解することができ、楽しかった。