こんにちは♪
おかげさまでちょっとのどの調子が治ってきました。
きっと昨晩おいしくお酒を飲んだからだな、うんうん^^
さーてさて、今日も今日とて壁切れ補正。
昨日は、「実は壁切れ補正じゃなかった!」というプログラムを直したものの、「停止位置手前から不測の動きをする」というエラーが出ました。
今日はそれを直したいと思います。
はじめから正しい動きをするよう書くことはとても無理ですが、
いろいろ試行錯誤します。
//最短走行時の超信地旋回前壁切れ補正 if(len > SECTION*2) //2区画以上走る場合 { while(len - STEP2LEN(step_r + step_l) > SECTION*1); //停止する1区間前まで走る if(sen_r.is_wall == true) //右壁がある場合 { while(sen_r.is_wall == true) //右壁が切れるまで走る step_r = step_l = 0; //ステップ数カウントのリセット while((step_r + step_l) < LEN2STEP(len_remains)); //あと走るべき距離走る } else if(sen_l.is_wall == true) //←壁がある場合 { while(sen_l.is_wall == true) //左壁が切れるまで走る step_r = step_l = 0; //ステップ数カウントのリセット while((step_r + step_l) < LEN2STEP(len_remains)); //あと走るべき距離走る } else { while((step_r + step_l) < obj_step); //一区画走る MTU2.TSTR.BIT.CST3 = 0; //モータのカウントをストップ MTU2.TSTR.BIT.CST4 = 0; //モータのカウントをストップ } } else //2区画以内しか走らない場合 { while((step_r + step_l) < obj_step); //目標地点まで走行 } MTU2.TSTR.BIT.CST3 = 0; //モータのカウントをストップ MTU2.TSTR.BIT.CST4 = 0; //モータのカウントをストップ }
壁切れを見る位置で両側に壁がある場合以外のとき、
昨日こう書いたものを、
while(len - STEP2LEN(step_r + step_l) == SECTION*1);
(よく見たらこれ間違ってましたね…。len – STEP2LENは、走るべき残りの距離なのでそれが1区間とイコールになったらwhile文を抜けるというのはまずい)
今日こう変えてみたわけです。
while((step_r + step_l) < obj_step);
これで走ってみます。
最短走行の行きで変な走りをしてしまう部分は解決しましたね!!やったー!
ただ、帰りで今度は以前見た「最低速度でぶるぶると走る」現象が起きています。
違うコースでも試してみます。
やはり帰り道でぶるぶるしてしまいます。
どうしてもなぜこうなるのかわからなかったので、のり先生に相談してみたところ、
原因が判明しました!
画像のような部分(片側に壁がなく、もう片側の壁がコーナーになっている)を走る場合、
壁がある方を見てwhile文に入るので、コーナーが続く限りwhile文を抜け出せないというわけです!!!!
なるほどおおおお!
いろいろと試行するのはいいのですが、「帰り道で」エラーがでると形容してしまったがために、
本質を見失っていたかもしれないですw
上記の条件にすれば、行きでも帰りでもこうなりました。
…で?
これはどうやって回避したらいいんだろう??
わからないことがあるとわくわくしますねw
自力でちゃんと動くプログラムを書いてのり先生を驚かせたいですw
時間切れなので続きは来週~♪