※この記事は、2014/04/20 に書かれたものである。 内容が古くなっていることがあるので要注意。

※この記事の内容は一切保証しない。何が起きても筆者は一切責任を負わない。

 

Point Cloid Library(以下 PCL) は、公式サイトでバイナリが配布されている。

しかし、VisualStudio(以下 VS) 2010 用のものであり、最近の開発環境では使えない。
また、OpenNI2 に対応していないという問題もある。

そこで、最近の VS と OpenNI2 対応させるために、ソースからビルドを行った。

 

チュートリアル資料

公式ページで公開されている。

Compiling PCL from source on Windows

この通りやるだけなので簡単だ・・・と思いきや、なかなかうまくいかない。
サードパーティ製ライブラリのビルド方法も書かれていない。

以下に、筆者がビルドした手順を記すので、必要な人は参考にしてほしい。

ちなみに、非常に時間がかかるので、覚悟が必要である。

 

ビルド環境

筆者のビルド環境は以下である。

  • Microsoft Windows 8.1 pro x64
  • Microsoft Visual Studio Express 2012 for Windows Desktop (Update 4)
  • CMake 2.8.12.2(x64)

最低限、CMake と VS2012 が動作する環境があれば、ビルドできると思われる。

現在最新の VS は、VS2013 であるが、
依存ライブラリである VTK5 のビルドを成功させることができなかった。
そこで、VS2012 でビルドを行った。

 

ライブラリの入手

PCL は、サードパーティのライブラリに依存しており、ビルドの際に必要である。
つまり、PCL をビルドする前に、依存ライブラリをビルドしておく必要がある。

依存ライブラリで最低限必要のものは、

  • Boost
  • Eigen
  • FLANN
  • VTK

であり、オプションで

  • Qhull
  • OpenNI
  • Qt
  • GTest

などが選択できる。

今回使用したライブラリのリストを以下に示す(公式ではないものも含まれるので注意)。

 

名称 version ライセンス 入手先
PCL 1.72 ? BSD ライセンス https://github.com/kwaegel/pcl
Boost 1.55.0 Boost Software License http://www.boost.org/
MS-MPI 2012 R2 ?(記載が見当たらない) http://www.microsoft.com/ja-jp/download/details.aspx?id=41634
Eigen 3.2.1 MPL 2.0 http://eigen.tuxfamily.org/index.php?title=Main_Page
FLANN 1.8.4 BSD ライセンス http://www.cs.ubc.ca/research/flann/#download
VTK 5.10.1 BSD ライセンス http://www.vtk.org/VTK/resources/software.html
Qhull 2012.1 http://www.qhull.org/COPYING.txt http://www.qhull.org/download/
OpenNI2 2.2.0.33 Apache ライセンス http://www.openni.org/openni-sdk/

 

PCL は、公式のものが OpenNI2 に対応していないため、フォークされたものを用いた。
Pull Requests に入っているので、次バージョンでは公式に反映されるかもしれない。

MS-MPI は Boost(Boost.MPI)のビルドに必要である。ライセンスが記載されていないが、
Microsoft の SDK なので、・・・自己責任で判断してほしい。
MS-MPI 以外にも、OpenMPI などの MPI ライブラリを用いることも可能である。

VTK は最新の VTK6 ではなく、古い VTK5 を使う必要がある。PCL が VTK6 に対応していないためだ。
最新の VS2013 は、古い VTK5 をビルドすることができない。
そのため、現時点では VS2013 で PCL を利用することができない(と思われる)。

OpenNI2 はビルドの必要がなかったため、公式ページで配布されているバイナリをそのまま使用した。
しかし、2014/04/23 に OpeNI のクローズが予告されおり、バイナリの入手が難しくなるかもしれない。
その際には、Giuhub からソースコードをダウンロードして、ビルドする必要があるだろう。

 

Boost のビルド

まず、Boost.MPI が必要とする、MS-MPI をインストールする。
インストーラを実行するだけなので、特に問題はない。

次に、MPI を有効にするために、ファイルの修正を行う。

■ tools/build/v2/user-config.jam

最後に、以下を追加

using mpi ;

■ tools/build/v2/tools/mpi.jam


local cluster_pack_path_native = “C:\\Program Files\\Microsoft Compute Cluster Pack” ;

if [ GLOB $(cluster_pack_path_native)\\Include : mpi.h ]

options = <include>$(cluster_pack_path)/Include

を以下に変更


local cluster_pack_path_native = “C:\\Program Files\\Microsoft HPC Pack 2012” ;

if [ GLOB $(cluster_pack_path_native)\\Inc : mpi.h ]

options = <include>$(cluster_pack_path)/Inc

Visual Studio Tools のコマンドプロンプトを起動し、以下を実行

> bootstrap
> b2 –toolset=msvc-11.0 –stagedir=stage/x86 address-model=32 link=static runtime-link=shared

x64 をターゲットとするときは、bootstrap の後、下のコマンドを代わりに用いる。

> b2 –toolset=msvc-11.0 –stagedir=stage/x64 address-model=64 link=static runtime-link=shared

 

【参考】

 

Eigen のビルド

Eigen は、ヘッダファイルのみのライブラリなので、ビルド不要である。

 

FLANN のビルド

ターゲットを x64 としてビルドするとエラーが出るので、ソースコードを修正する。

■ src/cpp/flann/util/serialization.h

適当な位置に、以下を追加

#ifdef _MSC_VER
BASIC_TYPE_SERIALIZER(unsigned __int64);
#endif

あとは、CMake で VS のソリューションファイルを作成し、VS でビルドする。

CMake の使い方は、世の中に溢れているので、ここでは割愛する。
Google などの検索エンジンで「CMake Windows」といったキーワードで検索すると、
詳しい説明がいくつも出てくるので、それらを参考のこと。

 

【参考】

 

VTK のビルド

CMake で VS のソリューションファイルを作成し、VS でビルドする。

それだけだが、非常に時間がかかる。

 

Qhull のビルド

このライブラリはオプションなので、面倒ならばビルドする必要はない。

build/qhull.sln を VS で開いてビルドする。
このとき、libqhull プロジェクトを C++ でビルドする必要がある。

image

さらに、x64 ターゲットでは、[リンカー]-[すべてのオプション]-[追加のオプション] から
“/machine:X86” を除去しなければならない。

image

必要となるのは、qhullstatic の生成物だけ(qhullstatic.lib / qhullstatic_d.lib)なので、
他のプロジェクトは無理にビルドする必要がない(エラーが出て止まることがあるが気にしなくていい)。

 

【参考】

 

PCL のビルド

CMake に依存ライブラリを認識させていく。

  • BOOST_INCLUDE_DIR を設定
  • Configure ボタンを押す
  • BOOST_CHRONO_LIBRARY_DEBUG / BOOST_CHRONO_LIBRARY_RELEASE を設定
  • Configure ボタンを押す
  • BOOST_LIBRARY_DIR が自動で設定されているはずなので、それを確認したら、
    もう一度 Configure ボタンを押す

ここまでの手順で、下のように Boost の項目が埋まっているはずである。

image

  • EIGEN_INCLUDE_DIR を設定する
  • Configure ボタンを押す
  • FLANN_INCLUDE_DIR / FLANN_LIBRARY / FLANN_LIBRARY_DEBUG を設定
  • Configure ボタンを押す

ここまでの手順で、下のように Eigen と FLANN の項目が埋まっているはずである。

image

  • QHULL_INCLUDE_DIR / QHULL_LIBBARY / QHULL_LIBRARY_DEBUG を設定
    LIBRARY は それぞれqhullstatic.lib / qhullstatic_d.lib を設定
  • Configure ボタンを押す

ここまでの手順で、下のように QHULL の項目が埋まっているはずである。

image

  • VTK は、CMake が勝手に検出するので、
    VTK_DIR に間違いがないか確認する(たまに間違っている)
  • OpenNI2 も CMake が勝手に検出するので、
    OPENNI2_INCLUDE_DIRS/OPENNI2_LIBRARY に間違いがないか確認する

image

  • BUILD_OPENNI2 にチェックを入れる。その他必要ならば、BUILD_* にチェックを入れる
  • CMAKE_INSTALL_PREFIX を適当なパスに設定する
  • Configure ボタンを押す
  • Generate ボタンを押す。問題がなければ、VS のソリューションファイルが作成される

あとは VS でビルドするだけであるが、ビルド完了まで非常に長い時間がかかる。
CMake の設定ミスなどで、エラーが発生しがちである。離席もままならない!

 

今回やらなかったこと

以下のライブラリの使用については、書くことを諦めた。
書き始めたら収集がつかなくなったので・・・(面倒臭くなった)。

    • Intel Perceptual Computing SDK
    • CUDA
    • Qt
    • GTest

 

テスト

#define _CRT_SECURE_NO_WARNINGS
#include "stdafx.h"

#pragma warning (disable: 4819)

#include <pcl/io/openni2_grabber.h>
#include <pcl/visualization/cloud_viewer.h>

#ifdef _DEBUG
#define MODE___ "debug"
#else
#define MODE___ "release"
#endif

#pragma comment(lib, "pcl_io_" MODE___ ".lib")
#pragma comment(lib, "pcl_visualization_" MODE___ ".lib")

int _tmain(int argc, _TCHAR* argv[])
{
	pcl::visualization::CloudViewer viewer("PCL OpenNI2 Viewer");
	pcl::io::OpenNI2Grabber grabber;

	boost::function<void (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr&)> f
		= [&viewer](const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
	{
		if(viewer.wasStopped() == false)
			viewer.showCloud(cloud);
	};
	boost::signals2::connection cloud_connection = grabber.registerCallback(f);

	grabber.start();

	while(viewer.wasStopped() == false)
	{
		boost::this_thread::yield();
	}

	boost::this_thread::sleep(boost::posix_time::milliseconds(100));
	
	grabber.stop();

	cloud_connection.disconnect();

	return 0;
}

38 行目が特に酷いが、テストなので目をつぶってほしい。

OpenNI2 対応デバイスを繋いで実行すると、ビューアにポイントが描画される。

 

image

 

『我らがズヴィズダーの光を、あまねく世界に!』

・・・がんばったけど、それっぽくならなかった。