Drawing Point Cloud retrieve from Kinect v2 using Point Cloud Library – part.2 with Grabber

What is Grabber?

Point Cloud Library (PCL)にはGrabberと呼ばれるデータ入力のためのモジュールがいくつか用意されています。

  • OpenNI2Grabber
  • PrimeSensorからデータを入力するためのOpenNI2ベースのGrabber。

  • HDLGrabber/VLPGrabber
  • Velodyne LiDARからデータを入力するためのBoost.Asio/PCAPベースのGrabber。

  • RealSenseGrabber
  • Intel RealSenseからデータを入力するためのRealSense SDK/librealsenseベースのGrabber。

PCL with Kinect v2

PCLにはKinect v2からデータを入力するためのGrabberは用意されていません。
そこで、Kinect SDK v2をベースにKinect v2からPCLにデータを入力する2つの方法を紹介します。

  • part.1 without Grabber
  • Grabberを利用しない方法。

  • part.2 with Grabber (this article)
  • Grabberを利用する方法。

Kienct2Grabber

PCLのGrabberは、pcl::Grabberを継承したクラスとして実装されています。
pcl::Grabberを継承したクラスを実装することで、PCLに含まれていないGrabberを実装することができます。

Kinect2Grabberは、Kinect v2からデータを入力するためにKinect SDK v2をベースに書いたGrabberです。
このGrabberはKinect SDK v2にのみ依存するため、他のライブラリをわざわざ用意する必要はありません。*1
また、実装はヘッダファイル(kinect2_grabber.h)のみのため、インクルードするだけですぐに利用することができます。

*1 Kinect SDK v2を使うため、プロジェクトに設定をする必要があります。サンプルプログラムではFindKinectSDK2.cmakeを使っています。

Kinect2Grabberは、以下からダウンロードすることができます。

Drawing Point Cloud retrieved from Kinect v2 using Point Cloud Library with Grabber

サンプルプログラムは以下で公開しています。

Include

pcl::Kinect2Grabberを使うために、kinect2_grabber.hをインクルードします。

main.cpp#L6

#include "kinect2_grabber.h"

Grabber

pcl::Kinect2Grabberのインスタンスを生成します。

main.cpp#L33

// Kinect2Grabber
boost::shared_ptr<pcl::Grabber> grabber = boost::make_shared<pcl::Kinect2Grabber>();

Register Callback

pcl::Kinect2Grabberで点群を取得するためのコールバック関数を定義します。
コールバック関数は、Grabberが1フレームの点群を取得するごとに呼ばれます。
ここで取得した点群へ処理を行い、点群のboost::shared_ptrを関数の外へ返します。

定義したコールバック関数をpcl::Kinect2Grabberに登録します。
pcl::Kinect2Grabber::registerCallback()にコールバック関数のポインタを渡します。

main.cpp#L22-L30

// Retrieved Point Cloud Callback Function
pcl::PointCloud<PointType>::ConstPtr cloud;
boost::mutex mutex;
boost::function<void( const pcl::PointCloud<PointType>::ConstPtr& )> function =
    [&cloud, &mutex]( const pcl::PointCloud<PointType>::ConstPtr& ptr ){
        boost::mutex::scoped_lock lock( mutex );

        /* Point Cloud Processing */

        cloud = ptr->makeShared();
    };

main.cpp#L36

// Register Callback Function
boost::signals2::connection connection = grabber->registerCallback( function );

Start/Stop

pcl::Kinect2Grabber::start()を呼び出すことで点群の取得を開始します。
同様にpcl::Kinect2Grabber::stop()を呼び出すことで点群の取得を停止します。

main.cpp#L38-L55

// Start Grabber
grabber->start();

while( !viewer->wasStopped() ){
    // Update Viewer
    viewer->spinOnce();

    boost::mutex::scoped_try_lock lock( mutex );
    if( lock.owns_lock() && cloud ){
        // Update Point Cloud
        if( !viewer->updatePointCloud( cloud, "cloud" ) ){
            viewer->addPointCloud( cloud, "cloud" );
        }
    }
}

// Stop Grabber
grabber->stop();

Execution Result

このサンプルプログラムを実行するとKinect v2から取得したPoint Cloudがリアルタイムで表示されます。

kinect2_pointcloud

 


コメントを残す

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