この一連のチュートリアルでは、「真剣な」研究目的のために、Kinectのような深度カメラの使い方について説明する。ご存じのように、Kinectは実際には赤外光パターン照射方式(Infraarred Structured Light Method)に基づいてPrimeSenseの技術で開発された手頃な価格の深度センサーである。また、普通のカメラも付随しており(これによりKinectはRGB-Dデバイスになる)、マイク、電動回転軸(ピボット)も備えている。その使用はXbox360コンソールでのプレイに限定されず、コンピュータに接続して他のセンサーと同様に使用できる。多くのオープンソースのドライバとフレームワークが利用可能である。

2010年11月にリリースされて以来、特に科学研究の間で多くの人気を得ている。低コスト(約1万円)にもかかわらず、深度感知プロジェクトのための強力な解決策であることが証明されているため、多くの研究で使われている。調査によれば、リアルタイムのサーフェスマッピング、物体認識と追跡、位置推定に焦点が当てられている。 (MicrosoftのKinectFusionプロジェクトのような)印象的な結果が得られている。

新しいXbox Oneには、顔の表情を検出し、心拍数を測定し、指のすべてを追跡することができる高度な解像度を備えたアップグレード版Kinect v2が付属している。 2014年7月にPC開発対応版(Kinect for Windows v2)がリリースされたが、公式のWindows SDK(オープンソースのサポートはあるがまだ未熟である)でのみ使用できる。 2014年10月に標準のKinect v2をPCに接続できるアダプタがリリースされたので、2015年4月に開発バージョンのセンサが廃止された。コンソールとアダプタの標準品が購入できる。

ここでは、普通のPCに「レガシー」Kinect 1.0デバイスをインストールする方法と使用法、およびその可能性について説明する。それを買ったばかりの学生を対象としてわかりやすく、基礎から説明する。

使用する予定のソフトウェア(Point Cloud LibraryとOpenNIドライバ)は、一行の変更も必要なく、ASUSのXtion PROやXtion PRO LIVEのような他のデバイスでも使用できることを覚えておこう(PROには深度センサー、PRO LIVE RGB-Dカメラである)。

注:チュートリアルはLinuxプラットフォーム用である。また、64ビット版は32ビット版よりも優れているようである。

必要なもの

次のものが必要になる:

  • 一般的なKinectデバイス。エレクトロニクスショップやオンラインで購入することができる。 また、Kinect Adventuresの無料コピーも含まれているが、これはコンソールを持っていない場合は無用である。 MicrosoftはKinect for Windowsデバイスをリリースしている。KinectはXbox360と互換性がなく、開発者向けの公式SDKのみで動作する。 また、前に述べたように、ASUS Xtionを使うこともできる。
  • Linuxを搭載しているコンピュータ(DebianかUbuntuが好ましい)。
  • 中規模の部屋。 Kinectには深さ測定に限界がある:最小40cm、最大8m(6mとしておこう)。

注意:Kinect for Windowsは、Linux上のオープンソースドライバで動作する際に、問題が起こることがある。

すべてを接続する

  • Kinectは一般的なUSBポートでは動作しない。 モーターがあるのでその消費電力は少し大きいため、MicrosoftはUSBと電源を組み合わせたコネクタを使用している。 古いXbox 360モデルには特別なアダプタが必要だったが、新しいSモデルのものには既にこの新しいポートがある。 幸いなことに、Kinectには公式のアダプタが付属している(もしもないなら購入する必要がある)。

  • アダプタを電源ソケットに差し込み、USBをコンピュータに接続しよう。 そしてターミナルで以下を入力してみましょう:

In [ ]:
% lsusb

すると次のようなデバイスがリストされるであろう:

Bus 001 Device 005: ID 045e:02b0 Microsoft Corp. Xbox NUI Motor
Bus 001 Device 006: ID 045e:02ad Microsoft Corp. Xbox NUI Audio
Bus 001 Device 007: ID 045e:02ae Microsoft Corp. Xbox NUI Camera

Xtionを使っている場合は、次のようなメッセージが表示される:

Bus 001 Device 004: ID 1d27:0601 ASUS

新しいXtionモデルなら"0601"が識別子として表示され、古いモデルなら "0600"が表示される。 いずれにせよ、どちらも同じように動作するはずである。 ただし、USB 3.0ポートは使わないこと!

ソフトウェアのインストール

KinectをPC上で動作させるには複数の方法があり、それぞれアプリケーション開発が必要:

  • Kinect for Windows SDK およびDeveloper Toolkit:アプリケーション開発を目的とした非商用SDKとして2011年6月16日にリリースされた。 Kinect v2がリリースされた2013年9月にバージョン1.8がリリースされた。これはMicrosoftの製品であるので、PCで動作させる最も簡単な方法である。残念ながらLinux版はない。
  • libfreenectライブラリ:OpenKinectプロジェクトから、公式のドライバに代わるオープンソースとして意図されたものである。 libfreenectはofxKinectのようなプロジェクトで使用され、LinuxやOS X上で動作するopenFrameworksツールキットのアドオンである(バージョン0.8以降はコアパッケージに含まれている)。ofxKinectには、 Kinectから得られるRGBとポイントクラウドを表示するアプリケーションのよい例がパックされている。
  • PrimeSenseドライバOpenNIプロジェクトが作られた後、モーショント・ラッキング・ミドルウェアのNITEとそのSDKと共に、PrimeSenseドライバはオープンソースとしてリリースされた。 NIはNatural Interactionの略で、プロジェクトはKinectのようなセンサーを使用して人間の入力に標準規格を導入しようとした。これらの正式なドライバーは、ROS(ロボット・オペレーティングシステム、つまりロボット研究者用のライブラリとツールの膨大なコレクション)とPCL(ポイントクラウド・ライブラリ、3Dポイントクラウド処理に必要なものすべてが入っている)によって使用される。残念ながら、OpenNI SDKのバージョン2.0では、ライセンス問題のためにKinectのLinuxに対するサポートがなくなった。現在、PCLは従来の1.xバージョンに依存している。また、Appleは2013年11月にPrimeSenseを購入し、2014年4月にはOpenNIのWebページを閉じた。現在そのソースは第三者によって維持管理されている。
  • SensorKinect:公式のPrimeSenseドライバの修正版であり、たとえば、ofxOpenNI(別のopenFrameworksアドオン)などで使用される。最終更新日は2012年である。

このチュートリアルでは、PCLをOpenNIドライバと併用する予定であるため、Xtionの所有者もそれを動作させることができる。

Ubuntu用のコンパイル済みPCL

  • ROSの有効なインストール(リポジトリ経由)がある場合は、何もインストールする必要はあない。ただOpenNIとPrimeSenseの両方のドライバとPCLがすでにインストールされている必要がありる。次のコマンドでこれをチェックすることができる:(libpcl-1.7-allがないため2018/6にlibpcl1.7に修正)
    sudo apt-get install libpcl1.7 libopenni-dev libopenni-sensor-primesense-dev
    このコマンドでは、すべてのパッケージがすでにインストールされていること(必要に応じてPCLのバージョン番号を変更する)を示し、そうでない場合はインストールする。ファイルの上書きに関するエラーが発生した場合は、ここを確認しよう。

ROSを使わない場合は、必要なものすべてを備えたPPA(個人用パッケージアーカイブ、プライベートリポジトリ)がある。ソースに追加し、すべてをインストールしよう:

sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get install build-essential cmake libpcl1.7 libpcl-dev pcl-tools

ROSとPCLのリポジトリとパッケージを混在させるとエラーが発生する可能性があるので、どちから1つを選択してそれを使い続けるようにしよう。 Kinectはデフォルトでは32ビットで動作しない可能性があるため、PCL / OpenNIのトラブルシューティングページを確認すること。

JDK

  • OpenNIにはSunの公式JDK(Java Development Kit)が必要である。これは公式のaptリポジトリでは使用できない。 非公式のものを使用することも、手動で行うこともできる。 最後の方法については、Java SEダウンロードページ(SEはStandard Editionを意味する)に移動し、最新バージョン(たとえば、jdk-8u66-linux-x64.tar.gz)をダウンロードする。 それを抽出し、内容を /usr/lib/jvm/ に移動して、システム全体で利用可能にする。
    sudo mkdir -p /usr/lib/jvm/ 
    sudo cp -r jdk1.8.0_66 /usr/lib/jvm/
    次に、Javaプログラムをコンパイルして実行するためのデフォルトの選択肢にする。 必要に応じてバージョン番号を変更することを忘れないように!
In [ ]:
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.8.0_66/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.8.0_66/bin/javac" 1
sudo update-alternatives --install "/usr/bin/jar" "jar" "/usr/lib/jvm/jdk1.8.0_66/bin/jar" 1

複数の選択肢がある場合は、次のコマンドを使用して正しいオプションを手動で選択する。

In [ ]:
sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo update-alternatives --config jar

確認のため、以下を実行してバージョンを表示し、インストールしたバージョンであることを確認しよう。

In [ ]:
java -version
javac -version

これでSunのJDKがインストールされた。

OpenNI

  • PCLはOpenNIとPrimeSenseドライバを使用して、KinectやXtionなどのデバイスからデータを取得する。 Ubuntuを使用している場合は、PPAを追加して、libopenni-devとlibopenni-sensor-primesense-devをインストールする。ただこれは既に実行してしまっている可能性がある。 それ以外の場合、GitHubからOpenNIおよびPrimeSense Sensorのソースを取得する(ZIP形式でダウンロードする。リンクはページの右側にある)。 それらを解凍して、依存関係にあるファイルをインストールする。
In [ ]:
sudo apt-get install python libusb-1.0-0-dev freeglut3-dev doxygen graphviz

OpenNIを解凍したディレクトリ(私の場合、OpenNI-master/)に移動し、Platform/Linux/CreateRedist/サブディレクトリにある端末を開く。

./RedistMaker

上のコマンドを実行し、エラーがなければ(エラーが出た場合はPCL/OpenNIのトラブルシューティングのページをチェックしよう)、Platform/Linux/Redist/OpenNI-Bin-Dev-Linux-x64-v1.5.7.10/(または それ相当のもの)に行き、インストールする(ただしこれにはrootでないといけない):

sudo ./install.sh

今度は、PrimeSenseドライバを展開したディレクトリ(私の場合 Sensor-master/ )に移動し、同じ手順を繰り返します(Platform/Linux/CreateRedist/に移動し、./RedistMakerを実行し、Platform/Linux/Redist/Sensor-Bin-Linux-x64-v5.1.6.6/、sudo ./install.shを実行しよう)。 おめでとう、これでOpenNIをインストール完了である。

CUDA

  • OpenNI同様、nVidia CUDAはオプションの依存関係であり、PCLが特定の計算にGPU(グラフィックス・プロセッシング・ユニット、つまりグラフィックスカード)を使用できるようにする。これは、KinFuのようなツールでは必須である(少なくとも1.5 GBのVRAMを搭載したシリーズ400以上のカードを持っていない場合は無視しよう)。

  • 一部のディストリビューションでは、リポジトリ内のCUDA用のパッケージを提供している。たとえば、Ubuntuでは次のようになる。

    sudo apt-get install nvidia-cuda-dev nvidia-cuda-toolkit

    手動でインストールする場合は(以前の方法と互換性がない)、CUDAのダウンロードページに移動し、自分のシステムにあった小さな.debファイルか大きな.runツールキット/ SDKインストーラファイルを入手しよう(その前にnVidiaドライバをインストールしておく必要があるが、必要に応じてインストーラが代行する)。

  • .debファイルを選択した場合は、Gdebiパッケージマネージャを使うか、またはコンソールから次のコマンドを実行することでインストールしよう:

    sudo dpkg -i <package.deb>

.debにはCUDAのものがすべて含まれているわけではなく、ソフトウェアリストにリポジトリを追加するだけである。次にすべてをインストールする:

In [ ]:
sudo apt-get update
sudo apt-get install cuda

一方、.runをダウンロードした場合は、実行権限を与える。

In [ ]:
chmod +x cuda_7.0.28_linux.run

そしてインストールする。 デフォルトのオプションを使用することはできるが、カード用のnVidiaグラフィックスドライバが動作している場合は、インストール時に「no」とインストーラに対して入力しなければならないこともある:

In [ ]:
sudo ./cuda_7.0.28_linux.run

システムがCUDAのライブラリとバイナリを見つけるために、環境変数を変更する必要がある。 それには/etc/ld.so.confを開き

In [ ]:
sudo nano /etc/ld.so.conf

次の2つの行のいずれかを追加する

In [ ]:
/usr/local/cuda/lib64 #  64ビットの場合
/usr/local/cuda/lib # 32ビットの場合

Ctrl+Oで保存してEnterを押し、Ctrl + Xで終了します。 ダイナミックリンカのキャッシュを次のように再ロードする。

In [ ]:
sudo ldconfig

あなたのPATHにCUDAのbinディレクトリを追加しよう。 ローカルの.bashrcファイルを編集する:

In [ ]:
nano ~/.bashrc

そして次の行を追加する:

In [ ]:
export PATH=$PATH:/usr/local/cuda/bin

これでCUDAがインストールされました。

ソースを入手する

  • すべての依存関係がインストールされた。
  • さて、PCLのソースコードをダウンロードする。 まず、PCLの安定版または実験版のどちらをインストールするかを選択する。 安定版ブランチは最新の公式リリースであり、問題なく動作することが保証されている。 実験ブランチはコンパイル・エラーを起こすことはめったにないが、安定版のために数ヶ月待たされるような興味深い機能を見つけることができる。 それ以外は、どちらも同じように構築されている。

  • 安定版を入手するには、ダウンロードページに行き、pcl-pcl-1.7.2.tar.gz(もしくは最新リリース版)をダウンロードし、どこかに展開する。 実験版は、次のようにGitを使う:

In [ ]:
sudo apt-get install git
git clone https://github.com/PointCloudLibrary/pcl PCL-trunk-Source

コンパイルされたPCLのトランク版は8 GB以上を占有する。 そこで十分な空き領域を持つパーティションにソースフォルダを置こう!

コンパイル

PCLソースディレクトリ(pcl-pcl-1.7.2/または PCL-trunk-Source/)に移動し、ビルド用のファイルを保存するためディレクトリbuildを作成する。

In [ ]:
mkdir build
cd build

さてCMakeを使ってプロジェクトを設定しよう。Release(最適化され、デバッグ機能なし)モードでビルドするように指示し、後で残りのオプションをカスタマイズする:

In [ ]:
cmake -DCMAKE_BUILD_TYPE=Release ..

CMakeはすべての依存関係を見つけることができなければならないので、「デフォルトでは無効」とマークされたサブシステム以外のすべてのサブシステムを構築する。 これでよければ今構築することはできるが、CMakeのcursesインタフェースを呼び出して、いくつかの点を変更しよう(最後の『.』に注意):

In [ ]:
ccmake .

ここでビルドオプションを変更することができる。 プログラムの使用状況が、画面の下部に表示される。 すべての機能を「オン」にしてみよう。 最も重要なことは、CUDAを使用したい場合は、それを有効にしてCMakeにSDKへのパスを与えることである。 "CUDA_SDK_ROOT_DIR"オプションに行き、正しいパスを入力する(おそらく/usr/local/cuda/)。

設定が終わったら、Cを押して構成を確定し、Gを押して生成し終了する。 変更したオプションによって、以前に省略されたパラメータがアクティブになる場合や、警告テキストが表示されることがある。 メッセージを読み終えたらEを押し、生成されるまでCキーを押し続ける(新しいパラメータにはアスタリスクが付いているため、確認してさらにカスタマイズする必要があるかどうかを判断できる)。

構成が完了したら、ビルドしよう:

In [ ]:
make

注:コンパイルのスピードを上げるためにパラメータ -jX を追加できる.ここでXはPCのコアまたはプロセッサの数に1を加えたものです。

build/ディレクトリを空にすることにより、いつでも強制的に再構成・ビルドしなおすことができることに注意。

In [ ]:
rm -rf ./*

インストール

PCLをコンパイルするには時間がかかる(PCが十分強力でない場合は最大数時間かかる)。 作業が終了したら、次を実行し、システム全体に対してインストールする。

In [ ]:
sudo make install

システムを再起動し、次節に進み、コンピュータがKinectデバイスを認識(および使用)するかどうかを確認しよう。

テスト(OpenNIビューア)

  • PCLライブラリを使用して、KinectやXtionからデータを取り出してユーザに提示する簡単なサンプルプログラムを作成する。 現在のフレームを(ポイントクラウドとして)ディスクに保存することもできる。 面倒くさいと感じたら、これをダウンロードし、次の2つの節をスキップしよう。そうでなければ、ハードディスク内の任意の場所に新しいディレクトリを作成し、仕事を続けよう。

CMakeLists.txt

作成したディレクトリの中に、CMakeLists.txtという名前の新しいテキストファイルを作る。 PCLベースのプログラムもCMakeビルドシステムを使用する。 任意のエディタを開き、次の内容を貼り付けよう。

In [ ]:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
project(PCL_openni_viewer)
 
find_package(PCL 1.7 REQUIRED)
 
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
 
set(PCL_BUILD_TYPE Release)
 
file(GLOB PCL_openni_viewer_SRC
    "src/*.h"
    "src/*.cpp"
)
add_executable(openniViewer ${PCL_openni_viewer_SRC})
 
target_link_libraries (openniViewer ${PCL_LIBRARIES})

CMakeの構文は明瞭である。 ここではCMakeバージョン2.8以上をインストールしてほしい。 まず"openni_PCL_viewer"という名前の新しいプロジェクトを宣言する。 CMakeに、PCLライブラリ開発ファイル、バージョン1.7の存在を確認するように指示する。 システムがCMakeおよびPCLのバージョン要件を満たせない場合は、プロセスは失敗する。

コンパイラとリンカーに、PCLがあるディレクトリと、PCLのライブラリがあるディレクトリを教え、PCLの定義シンボルを教える。 次にCMakeに "Release"のビルドタイプを使用するよう指示しする。これにより、使用するコンパイラに応じて特定の最適化が有効になる。 Release以外に、"Debug"、 "MinSizeRel"、 "RelWithDebInfo"などのビルドタイプも利用できる。

最後に、コンパイルするファイルのリストを格納する変数 "opennipclviewer_SRC"を作成する(ただし、このファイルは1つだけである)。 これらのソースファイルからコンパイルするために新しいバイナリを作成し、それをPCLライブラリにリンクする。

他のオプションについては、CMakeのヘルプを参照すること。

main.cpp

CMakeに対しsrc/ サブディレクトリにソースファイルがあると教えた。 そこでこれを守るため、次の内容を持つ新しいmain.cppファイルをsrc/の中に追加する。

In [ ]:
// Original code by Geoffrey Biggs, taken from the PCL tutorial in
// http://pointclouds.org/documentation/tutorials/pcl_visualizer.php

// Simple OpenNI viewer that also allows to write the current scene to a .pcd
// when pressing SPACE.

#include <pcl/io/openni_grabber.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/console/parse.h>

#include <iostream>

using namespace std;
using namespace pcl;

PointCloud<PointXYZRGBA>::Ptr cloudptr(new PointCloud<PointXYZRGBA>); // A cloud that will store color info.
PointCloud<PointXYZ>::Ptr fallbackCloud(new PointCloud<PointXYZ>);    // A fallback cloud with just depth data.
boost::shared_ptr<visualization::CloudViewer> viewer;                 // Point cloud viewer object.
Grabber* openniGrabber;                                               // OpenNI grabber that takes data from the device.
unsigned int filesSaved = 0;                                          // For the numbering of the clouds saved to disk.
bool saveCloud(false), noColor(false);                                // Program control.

void
printUsage(const char* programName)
{
	cout << "Usage: " << programName << " [options]"
		 << endl
		 << endl
		 << "Options:\n"
		 << endl
		 << "\t<none>     start capturing from an OpenNI device.\n"
		 << "\t-v FILE    visualize the given .pcd file.\n"
		 << "\t-h         shows this help.\n";
}

// This function is called every time the device has new data.
void
grabberCallback(const PointCloud<PointXYZRGBA>::ConstPtr& cloud)
{
	if (! viewer->wasStopped())
		viewer->showCloud(cloud);

	if (saveCloud)
	{
		stringstream stream;
		stream << "inputCloud" << filesSaved << ".pcd";
		string filename = stream.str();
		if (io::savePCDFile(filename, *cloud, true) == 0)
		{
			filesSaved++;
			cout << "Saved " << filename << "." << endl;
		}
		else PCL_ERROR("Problem saving %s.\n", filename.c_str());

		saveCloud = false;
	}
}

// For detecting when SPACE is pressed.
void
keyboardEventOccurred(const visualization::KeyboardEvent& event,
					  void* nothing)
{
	if (event.getKeySym() == "space" && event.keyDown())
		saveCloud = true;
}

// Creates, initializes and returns a new viewer.
boost::shared_ptr<visualization::CloudViewer>
createViewer()
{
	boost::shared_ptr<visualization::CloudViewer> v
	(new visualization::CloudViewer("OpenNI viewer"));
	v->registerKeyboardCallback(keyboardEventOccurred);

	return (v);
}

int
main(int argc, char** argv)
{
	if (console::find_argument(argc, argv, "-h") >= 0)
	{
		printUsage(argv[0]);
		return -1;
	}

	bool justVisualize(false);
	string filename;
	if (console::find_argument(argc, argv, "-v") >= 0)
	{
		if (argc != 3)
		{
			printUsage(argv[0]);
			return -1;
		}

		filename = argv[2];
		justVisualize = true;
	}
	else if (argc != 1)
	{
		printUsage(argv[0]);
		return -1;
	}

	// First mode, open and show a cloud from disk.
	if (justVisualize)
	{
		// Try with color information...
		try
		{
			io::loadPCDFile<PointXYZRGBA>(filename.c_str(), *cloudptr);
		}
		catch (PCLException e1)
		{
			try
			{
				// ...and if it fails, fall back to just depth.
				io::loadPCDFile<PointXYZ>(filename.c_str(), *fallbackCloud);
			}
			catch (PCLException e2)
			{
				return -1;
			}

			noColor = true;
		}

		cout << "Loaded " << filename << "." << endl;
		if (noColor)
			cout << "This cloud has no RGBA color information present." << endl;
		else cout << "This cloud has RGBA color information present." << endl;
	}
	// Second mode, start fetching and displaying frames from the device.
	else
	{
		openniGrabber = new OpenNIGrabber();
		if (openniGrabber == 0)
			return -1;
		boost::function<void (const PointCloud<PointXYZRGBA>::ConstPtr&)> f =
			boost::bind(&grabberCallback, _1);
		openniGrabber->registerCallback(f);
	}

	viewer = createViewer();

	if (justVisualize)
	{
		if (noColor)
			viewer->showCloud(fallbackCloud);
		else viewer->showCloud(cloudptr);
	}
	else openniGrabber->start();

	// Main loop.
	while (! viewer->wasStopped())
		boost::this_thread::sleep(boost::posix_time::seconds(1));

	if (! justVisualize)
		openniGrabber->stop();
}

これをセーブしてファイルを閉じる

コンパイル

PCLを構築するのと同じ手順に従う。 つまり、src/ディレクトリの隣に新しいbuild/サブディレクトリを作成する。 そしてターミナルを開き、以下を実行する:

In [ ]:
cmake -DCMAKE_BUILD_TYPE=Release ..
make

実行

同じターミナルにおいて、コンパイルされたサンプルプログラムを実行する:

In [ ]:
./openniViewer

数秒後、メインウィンドウが表示され、アプリケーションはデバイスからフレームを取得し始める。マウスを使用して現在のポイントクラウドを検査し、回転する左ボタン、ズームするための右ボタン(またはマウスホイール)、およびカメラをパンするための中央のポイントクラウドを検査することができる。最初は、黒い画面や大きな色付きの軸しか表示されず、クラウドは表示されない。ズームアウトして、シーン全体を表示してみよう。もう1つの便利なキーはRである。これを押すとカメラのパラメータがリセットされる。一部のカメラの動きの後でズームが遅くなったことに気がついた時や、クラウドがまだ見えないときに使用する。追加のコントロールと機能については、PCLVisualizerチュートリアルを参照のこと。

準備ができたら、スペースキーを押そう。プログラムは数秒間停止し、出力は「保存されたinputCloud0.pcd」となる。コンソールに表示される。現在のフォルダを調べて、実際にinputCloud0.pcdファイルが書き込まれていることを確認しよう。 QまたはAlt + F4でプログラムを閉じることができる。

次に、再度実行して次のパラメータを指定する。

In [ ]:
./openniViewer -v inputCloud0.pcd

これにより、プログラムはデバイスからデータを取得せず、代わりに保存されたポイントクラウドファイルからデータを取得する。 ロード後、ディスクに保存したのと同じシーンが表示されることに気付くだろう。

注:PCDデータはセンサーに対して保存される。 ビューをどれだけ操作しても、ファイルをロードするとデフォルトにリセットされる。

結論

この時点で、Kinectデバイスが動作し、深度データを取得する必要がある。 公式Webページには、PCLに関する優れたチュートリアルがあります。 Kinectセンサーを使用して実験を進める前に、それらをすべて終了することをお勧めする。 ここでは、PCLライブラリでの優れた紹介/チュートリアルを見つけることもできます。

Kinectの代わりにASUS Xtion PROデバイスを使用している場合は、問題や追加手順なしですべてを稼働させる必要がある(おそらくこれを除く)。

Go to root: PhD-3D-Object-Tracking

Links to articles:

PCL/OpenNI tutorial 0: The very basics

PCL/OpenNI tutorial 1: Installing and testing

PCL/OpenNI tutorial 2: Cloud processing (basic)

PCL/OpenNI tutorial 3: Cloud processing (advanced)

PCL/OpenNI tutorial 4: 3D object recognition (descriptors)

PCL/OpenNI tutorial 5: 3D object recognition (pipeline)

PCL/OpenNI troubleshooting