PCL/OpenNI tutorial 1: Installing and testing

出兞 http://robotica.unileon.es/index.php/PCL/OpenNI_tutorial_1:_Installing_and_testing

この䞀連のチュヌトリアルでは、「真剣な」研究目的のために、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