以前、ROSでkinectを動かす。という記事で、Kinectの骨格情報をROS経由で得る方法について述べた。しかし、相当に古い情報なので、現在のgroovyではうまく動かないようだ。
そこで、groovyで動かす方法を再度まとめてみた。
2013/10/3追記:この件に関してまとまっているサイトを見つけたので追加しておく。
http://www.technolabsz.com/2013/06/how-to-solve-opennitracker-error-find.html
基本的には、openni_trackerというパッケージを導入することで骨格情報が扱えるようになるらしい。
sudo apt-get install ros-groovy-openni-tracker
上記のようにインストールし、
roslaunch turtlebot_bringup 3dsensor.launch
でKinectを動作させた後で、先ほどのページに記述されているようにtrakerを起動した。すると、
rosrun openni_tracker openni_tracker
[ERROR]: Find user generator failed: This operation is invalid!
のようなつれないメッセージとともに終了してしまう。
適当にググって探してみると同じ現象についての報告がされていた。
OpenNI/NITE incompatible in Fuerte/Groovy on Precise
要はNITEのバージョンが異なるためらしいのだが、5番目のコメントの方法を試してみたらうまくいった。
まず、OpenNI SDK historyのページから、NiTE v1.5.2.21のパッケージをダウンロードする。(うちの32bit版ubuntu12.04の場合、NITE-Bin-Linux-x86-v1.5.2.21.tar.zipとなる。)
ダウンロードしたZIPファイルを展開すると、bz2形式の圧縮ファイルが得られるので、さらにtar xjfコマンドで展開する。展開したフォルダの中にinstall.shというスクリプトがあるので、以下のようにインストールする。
sudo ./install.sh
これで先ほどのrosrun openni_tracker openni_tracker
を実行するとエラーを吐かなくなった。
しかし、Kinectの前でPSIポーズを取ってみてもウンともスンとも言わない。アヤしいと思って、roslaunch turtlebot_bringup 3dsensor.launchを止めて別のlaunchを試したらうまくいった。
roslaunch openni_launch openni.launch
まとめると、以下の手順でKinectが骨格情報を生成するようになった。
- ros-groovy-openni-trackerをapt経由で得る
- NiTE v1.5.2.21をダウンロードする
- roscoreなりturtlebot_bringupしておく
- roslaunch openni_launch openni.launchを起動する
- rosrun openni_tracker openni_trackerを起動する
上記のパッケージは骨格情報を認識すると、/tfトピックにデータを流すようになる。そこで、/tfをsubscribeして適当にデータを得ればいいのだが、気をつけなければならないのは、child_frame_idに現れるのは、trackerのページにあるような/headではなく、認識したUserの番号が付加された/head_4のようなものとなることである。後は0〜1の範囲にあるx, y, zから値を得れば良い(はず。まだやってない。)