今回はKinectやシャトル検出について書こうと思います。


シャトルの検出

とりあえずKinectV2をUbuntuで動かす

ROSを使用するためUbuntuでロボットの開発を行っていたのですが、MicrosoftはKinectV2のドライバをWindows用のしか公開していません。
そこで、非公式のライブラリlibfreenect2を使用することにしました。

ロボミントンの開発を行っていた頃は、libfreenect2も公開されたばかりで全然ドキュメントがなかったのでかなり手こずりました。
Intel GPUのOpenGLの問題に嵌り、OpenCLを使用するためにBeignetをインストールするのに嵌り、散々でした。

GitHubのissueで他の開発者達と相談したり、プルリクエスト出したり、まともに使用できるようにするのに1ヶ月以上かかりました。

KinectV2によるシャトル検出

テストプログラムの作成

Kinect V2を用いてシャトル検出を行うにあたって、以下の2つが問題となります。

  • カメラ上ではほぼ点にしか見えないシャトルを本当に検出することができるのか
  • 何メートル先まで検出できるのか

この2つを確認するために、背景差分を用いた動体検出によって、シャトルの検出を行いました。
ただし、背景差分を使用する場合、カメラ自体を移動させることはできません。
つまり、この方法では移動ロボットに搭載されているカメラでシャトルを検出することはできません。

使用したライブラリはOpenCVで、以下の手順でシャトルの座標を取得しました。

  1. 距離画像に対して背景差分
  2. 動体検出
  3. 二値化・ラベリング
  4. ラベルが1つの場合、それに関して、距離画像から座標を取得

この実験の結果、最低でも3~4m程度の奥行までは検出可能なことが分かりました。

PCLを用いたシャトルの検出

本番でシャトルを検出する際は、ロボットが移動している最中でも検出できる必要があるため、先述のものと別の方法でシャトル検出を行うプログラムを作成しました。

テストプログラムではKinectから出力される距離画像を画像として処理していましたが、本番で用いたシャトル検出のプログラムではPoint Cloud Library(PCL)というライブラリを使用し、3Dの点群として処理しました。

以下の手順でシャトルを検出しています。

  1. Kinectの距離画像から点群に変換
  2. フィールド内、高さ1.6m以上の領域の点のみを抽出
  3. クラスタリング(ラベリングみたいな感じ)
  4. クラスタが存在したらそれをシャトルとして、重心を求める。この時点では、重心はKinectから見た相対座標で表されている。
  5. ロボットの位置・姿勢からシャトルの絶対位置を求める

これは、ロボミントンにおける高さ制限を利用し、「ネットより上に位置する物体はシャトルしか存在しない」という仮定のもと、作成されています。
天井は十分無視できる高さに存在する必要があります。(一般的な教室では練習できないという問題が発生しました)

このプログラムでは最大6m先のシャトルも検出可能になりました。

GitHubで公開しているプロジェクトのshuttle_finderがこのプログラムにあたります。


次回はシャトルの軌道予測について書こうと思います。

カテゴリー: ロボット

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

ロボット

今更ロボミントンを振り返る その4

今回は軌道予測と打点の決定方法についてです Contents1 シャト 続きを読む …

ロボット

今更ロボミントンを振り返る その2

前回に引き続きロボミントンの振り返りです。 Contents1 センシ 続きを読む …

ロボット

今更ロボミントンを振り返る その1

Contents1 序文2 概要3 ルール4 機体アイデア4.1 後衛 続きを読む …