-
- パラメータ調整に困ったら
- アボート:画像認識近辺の処理や、モータ関連でアボートが発生してしまい止まってしまう。なにかの関数のオーバーフローが起こっていたと考えられる。
- セグメンテーション違反:ファイルディスクリプタのプログラムのミスが原因。
- 小型化により画像認識ができない:機体の小型化により、DBを正面にとらえることが難しくなったため、画像認識の成功率が激減。
- バック走行、回転中に突っかかると止まらない:(通路走行ではない、)直進、バック、回転の関数の終了条件をロータリーエンコーダの値のみにしていたため。
- ロータリーエンコーダの値がたまに取得できなくなる:原因不明
- ロータリーに時計回りに侵入すると復帰できない:右の壁沿いに進むプログラムであるため、ロータリー進入時に、まれに左方向に進んでしまうと、時計回りに回り始めてしまい抜けられなくなってしまう。
- パラメータ調整に困ったら
問題点
-
- パラメータ調整
⇒MIRS1203は通路走行にPD制御を用いている。以下にP,Dの値を変化させたときの挙動の変化を示す。
- 入力、出力の関係
入力は、左右の超音波センサの値の差分。また出力は左右のモーターのパワーとしている。
調整することで変わる挙動 値を大きくしすぎたとき 値を小さくしすぎたとき P 目標値に近づくまでの速さ フラフラする 補正が効かなくなる D 傾いた時の調整の速さ 回転し始める 壁に当たる - パラメータ調整
解決策
⇒画像処理を繰り返し行ったり、カメラを取り付けずに、画像処理をしようとするとアボートが頻発する。そこで、アボートが発生したら、画像処理の回数を減らす。
読めなかったら、右に行くなどのプログラムを追加し、画像処理をあまり行わないようにすれば、起こさなくすることができる。
なお、モータの関数を繰り返し呼び出すことによって、アボートが発生することもある。motor_testプログラムなどを文字列検索をかけるなどして注意深く見直しながら、抜いてしまった処理を追加する。
⇒おもに、fprintfなどファイルポインタを使うとき、ファイルポインタをopen、closeする必要がある。そこでopenとcloseの間に間違って、もう1回openを書いてしまうとセグメンテーション違反になる。
いろいろな処理に飛ぶようにすると、誤って2度宣言してしまうとことが多く、fprintfを使用するときは、必ず近くでopenとcloseを行うように心がける。
⇒MIRSを小型化すると、DBを正面にとらえることが難しくなってしまい、DBの数字を正確に読み取るのが難しくなる。
解決策として
1.通路走行がきれいに行えるように、パラメータの微調整を行う。
2.片側だけ読めた時の処理は入れずに、両側の数字が読めた時だけ、指定の方向に曲がるようにする。
3.画像処理をしない
等があげられる。
⇒関数の1ループごとに変数iを加算していき、ロータリーエンコーダの値が目標値を超えたときと、変数iが一定数以上になった時に関数を終了させるようにした。
※デメリットとして、モーターのパワーが落ちてしまうと、回転が終了する前にループから抜けてしまい、指定した角度よりも小さな角度で回転をやめてしまうことがある。ループの回数を多くすれば、このトラブルは防ぐことができるが、復帰も遅くなってしまうため、トレードオフになってしまう。
⇒ロータリーエンコーダの値が一定時間変わらなくなったら、強制的にmotor_restartをかけてプログラムを始めから再開できるようにした。これにより、ごく稀に起きるI/Oエラーにもmotor_restartがかかり、走行を再開できるようになった。
※デメリットとして、通路走行中、壁などに当たりモータの回転が停止してしまうとmotor_restartが何度もかかり、復帰するのが遅くなってしまう。
⇒過去60ループ分のロータリーエンコーダの微分値の左右差を記憶しておき、その平均が一定数以下になったらロータリーを逆走していると判断。逆走を判断後に180度回転し、走行を再開するようにした。これによりロータリーを逆走した判断ができるようになった。なお(入口から出てしまうことがないようにロータリーを7/8周逆走した時点で180度回転するように調整した。)60ループという数は、7/8周するために必要なプログラムのループ回数である。
ロータリー逆回り認識プログラムを参照
※デメリットとして、モータのパワーが低下すると7/8周よりも早く、180度回転を始めてしまう。そこで、同じバッテリーを使い続けるなどの対策が必要になる。