以前、ROS経由でKinectの骨格情報を得る(Groovy)という記事で、Kinectの骨格情報をROS経由で得る方法について述べた。しかし、久しぶりにFluoで骨格情報を表示してみたところ遅すぎて(ポーズが1分後くらいに表示される)使い物にならない。最初はマシンのスペックが低すぎるのかと思ったのだがCore 2 Duoのマシンでも同様なので、スペックの問題ではなく通信の問題なのではないかと思って調べてみた。
元の記事ではKinectの骨格情報を得るのに、openni_trackerというパッケージを利用していた。何気なくソースを眺めてみたらファイルが1つしかないしシンプルにできており、単にOpenNIを使って骨格情報を得てROSの/tfトピックにpublishしているものだった。問題は、数分の1秒ごとに得たデータを関節毎に分割し、それをpublishしている点である。これだと、短い時間に多くのパケットが飛ぶことになり、WebSocketで受けているFluo側ではえらく手間のかかるものになってしまう。
そこで、openni_trackerをコピーしてkinetrackerというパッケージを作り、データを分割せず全ての関節情報を一度に送るように変えた。また、/tfトピックは他のいろいろなメッセージも来るので、新しく/kinetrackerというトピックを作り、kinetracker/Skeltonというメッセージを送ることにした。
Fluo側も/kinetrackerトピックをsubscribeするようにしたところ、個々の関節情報をまとめていた部分が不要になったため、全体的なパフォーマンスが向上した。トラッキングの追随速度も十分に早く、普通に使うのに何の問題もないことがわかった。
オリジナルから大きく変えたものではないが、備忘として残しておく。
kinetracker02.tgz
使い方はrosのワークスペースの適当な場所で展開し、
roslaunch kinetracker kinetracker.launch
とする。これにより、roscoreの起動およびrosbridge_serverの起動を行う。