- 追加された行はこの色です。
- 削除された行はこの色です。
Welcome!
*課題 [#n26bc92f]
所定のコースを一周する。但し、道中に置かれた缶は元あった場所に戻さなければならない。
私は時計回りを担当。缶は直角コーナーに配置。
&ref(SN3V0243.jpg);
*ロボットの説明 [#aaf182c5]
&ref(AAA.jpg);
・小回りが利くように車幅を限界まで狭め、ライトセンサも極力車体に近づけた。
・タッチセンサは鈍感なので、ライトセンサで缶の有無を判別するようにした。
・缶の運び方は、ただアームに缶を入れてロボット自身が回転して元に戻すというシンプルなもの。
*プログラム [#c8a26b8b]
#define THERESHOLD 47 // 閾値
#define HIGHESTPOWER 7
#define HIPOWER 2
#define LOWPOWER 0
#define HIGHESTPOWER 7 // 缶移動用パワー
#define HIPOWER 2 // 直進用パワー
#define LOWPOWER 0 // ターン用パワー
#define set_power_HE SetPower(OUT_AC,HIGHESTPOWER);
#define set_power_H SetPower(OUT_AC,HIPOWER);
#define set_power_L SetPower(OUT_AC,LOWPOWER);
#define go_forward set_power_H; OnFwd(OUT_AC); // 直進
#define turn_left1 set_power_L;\
OnFwd(OUT_C); OnRev(OUT_A); // 左旋回
#define turn_left0 set_power_L;\
OnFwd(OUT_C); Off(OUT_A); // 左折
#define turn_right0 set_power_L;\
OnFwd(OUT_A); Off(OUT_C); // 右折
#define turn_right1 set_power_L;\
OnFwd(OUT_A); OnRev(OUT_C); // 右旋回
#define turn_left1 set_power_L; OnFwd(OUT_A); OnRev(OUT_C); // 左旋回
#define turn_left0 set_power_L; OnFwd(OUT_A); Off(OUT_C); // 左折
#define turn_right0 set_power_L; OnFwd(OUT_C); Off(OUT_A); // 右折
#define turn_right1 set_power_L; OnFwd(OUT_C); OnRev(OUT_A); // 右旋回
#define STEP 1
#define nMAX 35 // 通常のカーブとみなす時間の最大値
#define short_break Off(OUT_AC); Wait(100); // 小休止
#define cross_line go_forward set_power_H;\
OnFwd(OUT_AC); Wait(20); short_break; // 交差点通過
#define cross_line go_forward set_power_H; OnFwd(OUT_AC); Wait(20); short_break; // 交差点通過
#define go_forward1 OnFwd(OUT_AC); Wait(120);
#define go_forward2 OnFwd(OUT_AC); Wait(160);
#define U_turn1 set_power_HE; OnRev(OUT_A);OnFwd(OUT_C);\
Wait(80);
#define U_turn2 set_power_HE; OnRev(OUT_C);OnFwd(OUT_A);\
Wait(160);
#define U_turn3 set_power_HE; OnRev(OUT_C);OnFwd(OUT_A);\
Wait(80);
#define U_turn1 set_power_HE; OnRev(OUT_A);OnFwd(OUT_C); Wait(80); // 右旋回(1/4回転)
#define U_turn2 set_power_HE; OnRev(OUT_C);OnFwd(OUT_A); Wait(160); // 左旋回(1/2回転)
#define U_turn3 set_power_HE; OnRev(OUT_C);OnFwd(OUT_A); Wait(80); // 左旋回(1/4回転)
#define go_back OnRev(OUT_AC); Wait(160);
sub line_trace() // ライントレース用プログラム
{
if (SENSOR_1 < THERESHOLD -4) {
turn_right1;
turn_left1;
} else {
if (SENSOR_1 < THERESHOLD -2) {
turn_right0;
turn_left0;
} else if (SENSOR_1 < THERESHOLD +2) {
go_forward;
} else if (SENSOR_1 < THERESHOLD +4) {
turn_left0;
turn_right0;
} else {
turn_left1;
}
}
turn_right1;
}
}
}
task main()
{
SetSensor(SENSOR_1,SENSOR_LIGHT);
SetSensor(SENSOR_3,SENSOR_LIGHT);
ClearTimer(1);
while (FastTimer(1) <= 1600) {
while (FastTimer(1) <= 1600) { // 16秒以内に缶の位置を通過
line_trace();
Wait(STEP);
}
if (SENSOR_3 > 45) {
PlaySound(SOUND_CLICK);
go_forward1;
U_turn1;
go_forward2;
U_turn2;
go_back;
U_turn3;
if (SENSOR_3 > 45) { // 缶を発見
PlaySound(SOUND_CLICK); // 確認音
go_forward1; // 直角コーナー上まで進む
U_turn1; // 缶を持ったまま右に1/4回転
go_forward2; // 次の1/2回転で缶が元の場所に戻るように少し直進
U_turn2; // 缶を持ったまま1/2回転
go_back; // 缶を置いて少し後退
U_turn3; // 次のカーブに入れるように1/2回転して向きを調整
}
}
ClearTimer(0);
ClearTimer(1);
交差点の判別には、黒を連続で認識する時間の上限を設定し、それを超えたらロボットの向きを直し、そのまま直進させる方法を用いる。
while (FastTimer(1) <= 3200) { // 直角コーナーを通過してから、最後の交差点を通過するまでに約32秒かかる。
while (FastTimer(0) < nMAX) { // 黒を続けてnMAX秒認識しない場合、通常のライントレースを行う。
while (FastTimer(1) <= 3200) {
while (FastTimer(0) < nMAX) { // 黒を続けてnMAX秒認識しない場合、
通常のライントレースを行う
line_trace();
ClearTimer(0);
}
Wait(STEP);
}
turn_left1; Wait(nMAX); // 進行方向修正
turn_right1; Wait(nMAX); // 進行方向修正
cross_line; // 交差点通過
ClearTimer(0); // タイマーをリセット
}
ClearTimer(0);
ClearTimer(1);
while (true) {
全ての交差点を通過し終えたら、最後の丁字路を曲がる為に交差点を判別させなくする。
while (true) {
line_trace();
Wait(STEP);
}
}
}
}
*反省 [#s7f7c576]
正確に線を辿ることが出来るに至ったものの、ターンの円滑さに欠けていたので、
*反省点 [#ma9b01b9]
ライントレースのプログラムはどの部分でもうまく進めるように組めたが、全体的にスピードは遅いので、
よりスムースにカーブを曲がるようにプログラムを改良する必要があると思った。
要所要所時間を測ってそれぞれに合ったプログラムを組めたら良かったと思った。