2017a/Member/doita/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2017a/Member]]
~目次
#contents
*課題について [#zd83be0b]
詳しくは[[課題2>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2]]を参照。
**コース [#h2bfa239]
#ref(./コース.JPG,70%,コース概要)
[[E地点直進コース>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2#h3f8021b]]を選択した。
*ロボットの概要 [#c989ac2c]
#ref(./ロボット.JPG,ロボット概要)
上の写真のように、規定のサイズに収まるようにロボットを改造した。センサーが取り付けられている方が前方である。
**センサーの位置 [#d7362af9]
#ref(./下から.JPG,下から見た図)
上の写真はロボットをしたから撮影したものである。センサーはできるだけ車軸に近い位置に設置し、急なカーブでも安定して走行できるようにした。
*プログラム [#wa774f6a]
**定義,サブルーチン [#u92f8759]
#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);
}
**ライントレース [#s9d20a3b]
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回連続で濃い黒を認識したら、その地点が交差点もしくは曲がり角であるとした。
**交差点、曲がり角での動作 [#q955c725]
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でのカウントにより、各ポイントでの動作を分類し、すべての認識ポイントを通過した後、停止するようにした。
*感想 [#x7bfe45c]
交差点の判別を確実にしつつ、急カーブなどでの誤認識をしないようにしきい値や速度、nMAXの調節が特に難しかった。それさえクリアすれば、後は順番に動作を並べるだけだったので、前回の課題に比べれば短時間の作業で済んだ。また、本やテレビなどでライントレースするロボットは知っていたが、今回の課題で初めて、それがどのような仕組みで動いていたか理解することができ、楽しかった。
終了行:
[[2017a/Member]]
~目次
#contents
*課題について [#zd83be0b]
詳しくは[[課題2>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2]]を参照。
**コース [#h2bfa239]
#ref(./コース.JPG,70%,コース概要)
[[E地点直進コース>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2#h3f8021b]]を選択した。
*ロボットの概要 [#c989ac2c]
#ref(./ロボット.JPG,ロボット概要)
上の写真のように、規定のサイズに収まるようにロボットを改造した。センサーが取り付けられている方が前方である。
**センサーの位置 [#d7362af9]
#ref(./下から.JPG,下から見た図)
上の写真はロボットをしたから撮影したものである。センサーはできるだけ車軸に近い位置に設置し、急なカーブでも安定して走行できるようにした。
*プログラム [#wa774f6a]
**定義,サブルーチン [#u92f8759]
#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);
}
**ライントレース [#s9d20a3b]
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回連続で濃い黒を認識したら、その地点が交差点もしくは曲がり角であるとした。
**交差点、曲がり角での動作 [#q955c725]
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でのカウントにより、各ポイントでの動作を分類し、すべての認識ポイントを通過した後、停止するようにした。
*感想 [#x7bfe45c]
交差点の判別を確実にしつつ、急カーブなどでの誤認識をしないようにしきい値や速度、nMAXの調節が特に難しかった。それさえクリアすれば、後は順番に動作を並べるだけだったので、前回の課題に比べれば短時間の作業で済んだ。また、本やテレビなどでライントレースするロボットは知っていたが、今回の課題で初めて、それがどのような仕組みで動いていたか理解することができ、楽しかった。
ページ名: