今回はKinectやシャトル検出について書こうと思います。
Contents
シャトルの検出
とりあえずKinectV2をUbuntuで動かす
ROSを使用するためUbuntuでロボットの開発を行っていたのですが、MicrosoftはKinectV2のWindows用のドライバしか提供していません。
そこで、非公式のライブラリlibfreenect2を使用することにしました。
ロボミントンの開発を行っていた頃は、libfreenect2も公開されたばかりで全然ドキュメントがなかったのでかなり手こずりました。
Intel GPUのOpenGLの問題に嵌り、OpenCLを使用するためにBeignetをインストールするのに嵌り、散々でした。(毎日Linuxカーネルビルドしてました…)
GitHubのissueで他の開発者達と相談したり、プルリクエスト出したり、まともに使用できるようにするのに1ヶ月以上かかりました。
(OpenCL使用時のみLIBCからshutdown関数が動的にロードされ、ライブラリ内のshutdown変数と名前が競合しバグるとか…)
KinectV2によるシャトル検出
テストプログラムの作成
Kinect V2を用いてシャトル検出を行うにあたって、以下の2つが問題となります。
- カメラ上ではほぼ点にしか見えないシャトルを本当に検出することができるのか
- 何メートル先まで検出できるのか
この2つを確認するために、背景差分を用いた動体検出によって、シャトルの検出を行いました。
ただし、背景差分を使用する場合、カメラ自体を移動させることはできません。
つまり、この方法では移動ロボットに搭載されているカメラでシャトルを検出することはできません。
使用したライブラリはOpenCVで、以下の手順でシャトルの座標を取得しました。
- 距離画像に対して背景差分
- 動体検出
- 二値化・ラベリング
- ラベルが1つの場合、それに関して、距離画像から座標を取得
https://youtu.be/fxs4vvxDYKU
この実験の結果、最低でも3~4m程度の奥行までは検出可能なことが分かりました。
PCLを用いたシャトルの検出
実際にロボットに搭載してシャトルを検出する際は、移動しながらシャトル検出をする必要があります。
よって背景差分は使用できないので、先述のものと別の方法でシャトル検出を行うプログラムを作成しました。
テストプログラムではKinectから出力される距離画像を画像として処理していましたが、本番で用いたシャトル検出のプログラムではPoint Cloud Library(PCL)という点群処理ライブラリを使用してシャトルを検出しました。
以下の手順でシャトルを検出しています。
- Kinectの距離画像から点群に変換
- フィールド内、高さ1.6m以上の領域の点のみを抽出
- クラスタリング(画像処理でいうラベリングに相当)
- クラスタが存在したらそれをシャトルとして、重心を求める。この時点では、重心はKinectから見た相対座標で表されている。
- ロボットの位置・姿勢からシャトルの絶対位置を求める
これは、ロボミントンにおける高さ制限を利用し、「ネットより上に位置する物体はシャトルしか存在しない」という仮定のもと、作成されています。
体育館など、天井は十分無視できる高さに存在する必要があります。(一般的な教室では練習できないという問題が発生しました)
このプログラムでは最大6m先のシャトルも検出可能になりました。
GitHubで公開しているプロジェクトのshuttle_finderがこのプログラムにあたります。
次回はシャトルの軌道予測について書こうと思います。
ロボットと電子工作とプログラミング!
女の子は甘いもので出来てる?