[[2018a/Member]] *課題 [#e2b82ceb] -下の図の黒い線に沿って空き缶を移動させる。 #ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&refer=2018a%2FMission2&openfile=2018a-mission2.png) Aをスタート Bを右折 Jで一時停止の後、Yの空き缶をキャッチしてJに戻る JからKに向かい、Kを直進 Lを直進 Iを左折 Hで一時停止の後、左折 Gで一時停止の後、右折 Fで一時停止の後、右折 Eを直進 Dで一時停止の後、空き缶をXに置いてDに戻り、Cに向かう Cで一時停止の後、直進 Bを直進 Aで停止 *ロボット [#t389e4a6] #ref(robo2.jpg) #ref(robo1.jpg) -2枚目の写真で分かるように、小さなタイヤを内側につけている。 **工夫した点 [#pf79b874] -センサーとタイヤの間隔が大すぎると進まなくなり、大きすぎると急なカーブがあるところをトレースできないためロボットの真下、タイヤの少し前にライトセンサーを取り付けた。 -ハサミを大きくしないと、缶をつかめないが、大きすぎるとつかむ前に缶にぶつかってしまうため、ハサミを右側に寄せて左回りで缶をつかむようにした。 -タイヤとタイヤの間隔が広すぎると急なカーブをトレースできないためタイヤを小さくしてロボットの内側につけた。 -ハサミの間にゴムをつけることでつかみやすくした。 *プログラム [#pb521fea] -黒い線の右、または左の境界を明るさの差によって赤外線センサーで認識させる。 **交差点の認識 [#pcef75aa] 赤外線センサーが交差点の内側にくる(右折する交差点なら、赤外線センサーが黒い線の右側にある状態)ようにあらかじめプログラムしておき、内側をトレースさせる。そうすることで、交差点にさしかかったときに赤外線センサーが黒を連続で認識するようになる。 nという変数を使い、赤外線センサーが黒(黒い線の上に乗っている状態)を連続で認識したときにカウントし、黒をいくつかの値まで(交差点Jなら270)認識すると、交差点と判断させる。 -赤外線センサーが交差点の内側にくる(右折する交差点なら、赤外線センサーが黒い線の右側にある状態)ようにあらかじめプログラムしておき、内側をトレースさせる。そうすることで、交差点にさしかかったときに赤外線センサーが黒を連続で認識するようになる。 -nという変数を使い、赤外線センサーが黒(黒い線の上に乗っている状態)を連続で認識したときにカウントし、黒をいくつかの値まで(交差点Jなら270)認識すると、交差点と判断させる。 **プログラム [#j200ef3c] #define llt OnRev(OUT_A,50); OnFwd(OUT_C,30); Wait(1);//大きく左に回る #define lrt OnFwd(OUT_A,30); OnRev(OUT_C,50); Wait(1);//大きく右に回る #define ternleft OnRev(OUT_A,50); OnFwd(OUT_C,10);//左に回る #define ternright OnFwd(OUT_A,10); OnRev(OUT_C,50);//右に回る #define go OnRev(OUT_A,50); OnRev(OUT_C,50);//直進する #define back OnFwd(OUT_A,50); OnFwd(OUT_C,50);//後退する #define close RotateMotor(OUT_B,50,90); #define open RotateMotor(OUT_B,50,-90); task main() { SetSensorLight(S3); int n=0; while(n<=250) //bまで { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); RotateMotor(OUT_C,50,-200); while(n<=270) //Jまで { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); close; //缶を掴む RotateMotor(OUT_A,50,-350); n=0; while(n<=200) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } Off(OUT_AC); Wait(1000); RotateMotor(OUT_C,50,-90); Off(OUT_C); n=0; while(n<=210) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } Off(OUT_AC); Wait(1000); RotateMotor(OUT_C,50,-90); //L通過 Off(OUT_C); n=0; while(n<=200) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } Off(OUT_AC); Wait(1000); //H stop n=0; while(n<=400) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<51) //G { go; n=0; } else { ternright; n=0; // W } } Off(OUT_AC); go; Wait(500); //s1 n=0; while(n<=400) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); go; Wait(500); //s2 stop n=0; while(n<=200) { if(SENSOR_3<45) //B { llt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { lrt; n=0; // W } } Off(OUT_AC); Wait(1000); //G stop RotateMotor(OUT_C,50,-310); n=0; while(n<=200) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); RotateMotor(OUT_C,50,-90); //F通過 n=0; while(n<=200) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); RotateMotor(OUT_C,50,-90); //E通過 n=0; while(n<=200) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); //D stop RotateMotor(OUT_C,50,90); Off(OUT_C); open; back; Wait(250); RotateMotor(OUT_A,50,60); Off(OUT_A); go; until(SENSOR_3 <= 45); n=0; while(n<=250) { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); while(n<=250) //bまで { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); Wait(1000); RotateMotor(OUT_A,50,-130); while(n<=250) //bまで { if(SENSOR_3<45) //B { lrt; n++; } else if(SENSOR_3<52) //G { go; n=0; } else { llt; n=0; // W } } Off(OUT_AC); } **工夫した点 [#g9a6f3cd] -交差点を認識するため、トレースする白と黒の境界を交差点がある側にして、交差点ごとにトレースする境界を変更する。 -小さすぎるカーブはやはりトレースしきれなかったので、交差点として認識させ、トレースする境界をカーブの外側に変更した。 *最後まで残った課題 [#y3e83f43] -ロボットの重心が前過ぎて、境界をトレースするたびにロボットが大きく揺れてしまう。 -白と黒の両極端のプログラムで作ったため、安定して前に進まない。