タイムスタンプを用いた URGデータの補正

URG使用時の問題

URG の環境の測定周期は 100[msec] であり、URG を搭載したビーゴが走行しながらデータを取得した場合、そのデータは実環境に対してずれてしまう。

noAdjust::cpp を実環境で動作させた場合の実行結果

noAdjust_rouka.jpg

実環境(廊下)における実行例

以下、タイムスタンプを用いることで上記のような「ずれ」の問題を緩和する方法について説明する。


タイムスタンプの利用

測定したデータを展開したときに「ずれ」るのは、データを取得したときの位置と時刻を考慮していないからである。

urg_timestamp.png

測定データの評価例

測定したデータがどの時刻のデータかを用いることで、移動しながらでも測定データの正確な位置を推測できる。つまり、URGCtrl によって取得できる測定データを二次元平面に展開する際、そのデータを取得した時刻と、その時刻におけるロボット位置を用いればよい。

ある時刻のロボット位置を返すためのクラスとして, TicksPosition がある。
このクラスは、時刻とロボット位置をペアで登録することにより、指定時刻におけるロボット位置を直線補間で返す。

ticksPosition_img.png

登録位置と返される位置の関係

したがって、時刻とロボット位置の登録頻度が高いほど、指定時刻に返されるロボット位置は正確になる。

また, URGCtrl::convert() は、測定データを変換するための引数として、

を処理できる。
noAdjust::cpp に対し、ロボットを移動させながら URG のデータを二次元展開するように変更したプログラムは ticksPosUse::cpp となり、その実行結果は以下のようになる。

ticksPosUse_rouka.jpg

実環境(廊下)における実行例

noAdjust.cpp の実行結果と比べると、ロボットの移動の影響が緩和されているのが分かる。


自己位置をモニタ用の位置で代用

TicksPosition から返される位置を正確にするには、ロボット位置を頻繁に取得し、登録する必要がある。しかしながら、通信を頻繁に行うことは、プログラム実行における処理性能を下げる可能性がある。

よって、モニタ画面にロボットを表示するために利用している位置を 1[msec]毎に保存しておき、をの位置を TicksPosition の位置として利用すればよい。この仕組みによる URG データ展開の正確性は、モニタ用のロボットシミュレータの正確さに大きく依存する。 また, モニタ用位置はロボットに自己位置を問い合わせるとその位置で修正されるため、この場合でも適度な周期でロボットに自己位置を問い合わせることは必要になる。

モニタ位置を用いて URG データを二次元展開するプログラムを simuPosUse::cpp に示し、その実行結果を以下に示す。

simuPosUse_rouka.jpg

実環境(廊下)における実行例

モニタ位置を用いることの欠点は、実機実行以外のモニタモードで正しく動作しないことである。

以上


Generated on Mon Apr 13 22:52:06 2009 by  doxygen 1.5.7.1