かみやんの技術者ブログ

主にプログラムの話です

オドメトリログの検証

前回のエントリで、オドメトリログの可視化を行って、オドメトリ計算に問題があるか、オドメトリ機能に問題があることが分かったわけだが、だるまさんから、オドメトリ計算のソースについて、不具合を指摘いただけた。

double front = (vL + vR) / 2 * MM_PER_COUNT;

このvL, vRはint型なので、2で割ると切り捨てられるよ。とのこと。うーむ、まさにその通り!相変わらずしょぼいミスだ。
正しくは、

double front = (vL + vR) / 2.0 * MM_PER_COUNT;

ですね。
前回、1800mm直進させた実験で、オドメトリ計算での自己位置推定では、1469mmと81.6%で推定されてしまったのですが、上記バグを修正したところ、1521mmになりました(84.5%)。少し近づきましたがまだ問題ありのようです。

昨日は、ロータリーエンコーダ1周を手で転がしたら何ミリか計りました。直径85mmなので、L=85xPI=267mmが理論値ですが、計ったところ270mmでした。3mm誤差。これを半径に割り戻すと42.972mm。42.5mmからの誤差は、0.472mm。これは、ロータリーエンコーダに貼った滑り止めテープの厚みであろうと推測されます(そもそも直径85mmというのは、CAD上で設計したABS板の直径)。滑り止めテープをデジタルノギスで測ったところ0.6mmでした。ということで計算に使うロータリーエンコーダの直径を85mmから86mmに変更しました。

その他、ロボットを手で押して何度か実測の走行距離とオドメトリ計算での推定距離とを計測しました。手で押す実験以外に、ジョイパッドで直進させる実験も何度か。

昨日の実験だと、前回の実験のように80%とか85%のように少なく推定されることはなく、ぴったり合ったり、逆に10%ぐらい大きく推定されたり。。前回の実験結果はなんだったのか。。前回は直線を1回しか計測しなかったが計り間違えたか?

10%ぐらい多く推定されるとすると、原因は下記か?

  • モーターのノイズを拾って余分にカウントアップされる
  • フォトインタラプタに外光が入って余分にカウントアップされる
  • 振動している?このロータリーエンコーダは、1相なのでバックがカウントできずに、バックしてもカウントアップする。ロータリーエンコーダが振動すると進んでいないのに、どんどんカウントアップする

あたりだろうか。

われながらひどいと思うが、実は、実験をしていて、非常に実験がアバウトで、実験結果を信用していいものかどうか疑わしい。どんな感じかというと、通常、1m正確にロボットに直進させて、実測。または、1mを正確に直進させて、実測。と行きたいところだが、ジョイパッドで前進させていて、なんら直線の制御をしていないため、スリップして直線からそれて曲がってしまっている。それでところどころハンドルを切って軌道修正している。なので、直進の実験でありながら直進でない。それと、ロボットの中心にペンなりマジックなりチョークなりで地面に軌跡を書けば、あとで実測しやすいが、床や地面を汚すわけに行かないのでそこまでやっていない。大きな紙でもひいてやればよいのか。それと、ジョイパッドではなく、直線制御をしたプログラムで約1m走らせるコードを書かないと駄目だ。

ちなみにピッタリあってるなと思う場合で、1500mm直進して、10〜20mmぐらいの誤差。誤差1〜2%か。
旋回となると、もっと色々な問題がありそう。論文等でも、オドメトリで旋回は、誤差が相当大きいので、ヨージャイロで補正するとよいとある。

なんにせよ、原因追求にはまだ時間がかかる。ただ、安定して誤差を1〜2%以下に抑えることができても、1km走ると、10m〜20mの誤差になる(旋回方向は1〜2%は無理と思われる)ので、LRFやジャイロの補正が必要。
本当は、オドメトリログとTop-URGのログを合成して可視化して、地図作成に早く行きたいのだが。