- 追加された行はこの色です。
- 削除された行はこの色です。
#contents
*課題[#la0886b4]
**課題について [#tedb6b4d]
[[課題1のページ>http://yakushi.shinshu-u.ac.jp/robotics/?2017a%2FMission2]]
より要約すると、コースを走るロボットを作る、ということである。
今回は、E地点右折コースを選んだ。
*ロボットについての概要 [#o6c7e1c9]
機体は取扱説明書に記載されているものを使用した。
*使用したプログラムと解説 [#oab2823b]
**プログラム:定義 [#c92eaaff]
#define SPEED_H 35 //スピード定義 大
#define SPEED_L 15 //スピード定義 小
#define turn_right1 OnFwd(OUT_A,SPEED_H);OnRev(OUT_C,SPEED_H); //大きく右折
#define turn_right2 OnFwd(OUT_A,SPEED_H);OnRev(OUT_C,SPEED_L); //小さく右折
#define goFwd OnFwd(OUT_AC,SPEED_H); //直進
#define turn_left1 OnRev(OUT_A,SPEED_H);OnFwd(OUT_C,SPEED_H); //大きく左折
#define turn_left2 OnRev(OUT_A,SPEED_L);OnFwd(OUT_C,SPEED_H); //小さく左折
#define TimerReset t0=CurrentTick(); //タイマーリセット
#define tMAX 140
使用した定義である。
**プログラム:ライントレース [#g869df6e]
sub line_trace()
{
SetSensorLight(S2);
long t0=CurrentTick();
while(CurrentTick()-t0<tMAX){
if (SENSOR_2 <= 30){
turn_left1;
}else if(SENSOR_2 <= 40){
turn_left2
TimerReset;
}else if(SENSOR_2 <= 43){
goFwd;
TimerReset;
}else if(SENSOR_2 <= 53){
turn_right2;
TimerReset;
}else {
turn_right1;
TimerReset;
}
}
}
使用したライントレースのプログラムである。しきい値は慎重に検討し、概ね問題なく作動した。
**プログラム:SOUND_UP、一秒停止 [#f6258598]
sub stop_and_beep1()
{
Off(OUT_AC);
PlaySound(SOUND_UP);
Wait(1000);
}
SOUND_UPをして一秒間停止するサブルーチンである。
**プログラム:SOUND_DOUN、一秒停止 [#v3b08fe8]
sub stop_and_beep2()
{
Off(OUT_AC);
PlaySound(SOUND_DOWN);
Wait(1000);
}
SOUND_DOWNをして一秒間停止するサブルーチンである。
**プログラム:左折と右折 [#q5c3128c]
sub curve_left()
{
Off(OUT_AC);
Wait(1000);
OnFwd(OUT_A,SPEED_H);
OnRev(OUT_C,SPEED_H);
Wait(1000);
Off(OUT_AC);
Wait(1000);
}
sub curve_right()
{
Off(OUT_AC);
Wait(1000);
OnFwd(OUT_C,SPEED_H);
OnRev(OUT_A,SPEED_H);
Wait(2000);
Off(OUT_AC);
Wait(1000);
}
一秒間停止した後、左折・右折をして一秒間停止するサブルーチンである。
課題には使用しなかった。なぜこれらのプログラムを書いたのかはわからない。
**プログラム:交差点横断 [#d70b50f5]
sub ignore()
{
Off(OUT_AC);
Wait(1000);
OnFwd(OUT_AC,SPEED_H);
Wait(400);
Off(OUT_AC);
Wait(100);
}
交差点に差し掛かった際、線を一部無視して少しだけ直進するプログラムである。
十字路などを渡る際に使用した。
**プログラム:メインタスク [#zbb2b458]
task main()
{
SetSensorLight(S2);
long t1=CurrentTick();
int m=0; //交差点カウンタ設定
while(m <= 13){
line_trace ();
m = m+1; //交差点カウント+1
if (m == 13){ //交差点カウンタの値が13の際…
stop_and_beep2 ();
Off(OUT_AC);
}else if(m == 12){ //交差点カウンタの値が12の際…
stop_and_beep1 ();
}else if(m == 11){ //交差点カウンタの値が11の際…
stop_and_beep1 ();
}else if(m == 10){
stop_and_beep1 ();
ignore ();
}else if(m == 9){
stop_and_beep2 ();
}else if(m == 8){
stop_and_beep1 ();
}else if(m == 7){
stop_and_beep1 ();
}else if(m == 6){
stop_and_beep2 ();
ignore ();
}else if(m == 5){
stop_and_beep2 ();
ignore ();
}else if(m == 4){
stop_and_beep1 ();
}else if(m == 3){
stop_and_beep1 ();
ignore ();
}else if(m == 2){
stop_and_beep2 ();
turn_right1;Wait(430);Off(OUT_AC);Wait(100);
}else if(m == 1){
stop_and_beep1 ();
turn_left1;Wait(250);Off(OUT_AC);Wait(100);
}
}
}
これがメインのタスクである。
今回は、whileで延々とライントレースを繰り返し、ライントレースのサブルーチンから外れた時を「交差点検知」とし、交差点カウンタを用いて検知した交差点の数に応じてifで条件付けをした。
*結果 [#j4782436]
ゴールすることはできなかった。
*反省点 [#e120e048]
上のtask_mainを見てわかるように、まず大まかなプログラムを書き、細かい微調整を定義やサブルーチンの後に付け足していけばよいと思っていたが、やはりプログラムのみで動作を制御しきるのは無理があった。
具体的に言えば、E右折後にP点でS点に行かずQ点に向かわせる事ができなかった。SOUND_DOWN後に少し左折させることで交差点を無視させようとしたが、線にセンサーがなかなか反応せずプログラムの数値だけでは解決できなかった。
おそらくもう少しタイヤ幅を狭くして小回りを利かせるか、センサーの位置を機体の中心に近づければ成功できたかもしれない。
*まとめ [#tdad08f0]
ゴールすることができず、非常に残念である。
基本的なプログラムの骨組みは当初の構想通りに組むことができ、出来もいいものであったと思うが、やはりプログラムで細かい動作を制御するのは難しかった。
次回の課題は今回の反省を踏まえて成功させたい。