noAdjust::cpp を実環境で動作させた場合の実行結果
実環境(廊下)における実行例
以下、タイムスタンプを用いることで上記のような「ずれ」の問題を緩和する方法について説明する。
測定データの評価例
測定したデータがどの時刻のデータかを用いることで、移動しながらでも測定データの正確な位置を推測できる。つまり、URGCtrl によって取得できる測定データを二次元平面に展開する際、そのデータを取得した時刻と、その時刻におけるロボット位置を用いればよい。
ある時刻のロボット位置を返すためのクラスとして, TicksPosition がある。
このクラスは、時刻とロボット位置をペアで登録することにより、指定時刻におけるロボット位置を直線補間で返す。
登録位置と返される位置の関係
したがって、時刻とロボット位置の登録頻度が高いほど、指定時刻に返されるロボット位置は正確になる。
また, URGCtrl::convert() は、測定データを変換するための引数として、
を処理できる。
noAdjust::cpp に対し、ロボットを移動させながら URG のデータを二次元展開するように変更したプログラムは ticksPosUse::cpp となり、その実行結果は以下のようになる。
実環境(廊下)における実行例
noAdjust.cpp の実行結果と比べると、ロボットの移動の影響が緩和されているのが分かる。
よって、モニタ画面にロボットを表示するために利用している位置を 1[msec]毎に保存しておき、をの位置を TicksPosition の位置として利用すればよい。この仕組みによる URG データ展開の正確性は、モニタ用のロボットシミュレータの正確さに大きく依存する。 また, モニタ用位置はロボットに自己位置を問い合わせるとその位置で修正されるため、この場合でも適度な周期でロボットに自己位置を問い合わせることは必要になる。
モニタ位置を用いて URG データを二次元展開するプログラムを simuPosUse::cpp に示し、その実行結果を以下に示す。
実環境(廊下)における実行例
モニタ位置を用いることの欠点は、実機実行以外のモニタモードで正しく動作しないことである。
以上