RTCPCL のコンパイル

Point Cloud Library を利用するためのRTコンポーネント RTC::PCL を、Ubuntu 10.04 でコンパイルしています。

http://openrtm.org/openrtm/node/1710

必要なもの

PCL

Ubuntu 10.04 では、レポジトリを登録することで apt-get が利用できます。

 sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
 sudo apt-get update
 sudo apt-get install libpcl-1.1-dev

(http://pointclouds.org/downloads/linux.html より)

OpenRTM-aist

1.0 と 1.1 に対応しています。

ccmake

2.8を使っています。

下準備

omniORB.cfg

ポイントクラウドの大量のデータを送受信するために、CORBA の転送量を増やします。
/etc/omniORB4.cfg (環境によっては /etc
/omniorb/omniORB.cfg )の、giopMapMsgSize を修正します。

 giopMaxMsgSize = 20971520

(元々の転送量、約2Mバイトを20Mバイトに修正した例…すなわち、末尾に0を付加)

再起動の必要はありません。

.bashrc

~/.bashrc に、以下の一行を追加して、新しい端末を開いてください。
 export LD_LIBRARY_PATH=/usr/local/lib

ソースの入手と修正

git を使って、ソースをダウンロードします。

 git clone https://github.com/gbiggs/rtcpcl.git 

まず CMakeLists.txt を修正します。

 find_package(OpenRTM 1 REQUIRED)

REQUIRED を削除して、「find_package(OpenRTM 1)」に変更。
 find_package(Boost 1.42.0 REQUIRED regex)

1.42.0 を 1.40 に変更。

コンパイル

git でソースを展開したディレクトリに入り、build ディレクトリを掘ってそこに入り、ccmake を実行します。

 % cd rtcpcl
 % mkdir build 
 % cd build
 % ccmake ..

最初は「EMPTY CACHE」としか出ないので、cキーを押して configure します。いきなりエラーが出ますが、無視してeを押し、先に進みます。
 CMake Error at
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:70
  (MESSAGE):
    REQUIRED_VARS (missing: DDS_INCLUDE_DIR DDS_C_LIBRARY DDS_CPP_LIBRARY
    DDS_CORE_LIBRARY VERSION_VAR)
  Call Stack (most recent call first):
   cmake/Modules/FindDDS.cmake:73  (find_package_handle_standard_args)
   CMakeLists.txt:32 (find_package)

DDS_SUPPORT がONになっているはずなので、カーソルを合わせてENTERキーを押し、OFFに変更してください。
dds_support.png
configure を二回繰り返すと、「Press [g] to generate and exit」という項目が現れます。gキーを押すと、 Makefile を生成して ccmake が終了します。

ソースの修正

pc_type/pc_mgmt.cpp の29行めにある、
 #include <pointcloudSupport.h>

の行を #if defined で囲みます。
 #if defined(DDS_SUPPORT)
  #include <pointcloudSupport.h>
 #endif

rtcpclcuboid/rtcpclcuboid.cpp の103行めと、rtcpclrainbowtube/rtcpclrainbowtube.cpp の134行めにある、
     PointCloudTypes_PointCloudTypeSupport::delete_data(dds_out_);

この行も同じようにして囲みます。
 #if defined(DDS_SUPPORT)
     PointCloudTypes_PointCloudTypeSupport::delete_data(dds_out_);
 #endif

rtcpclnormals/rtcpclnormals.h の43行目、rtcpclplanesegmentation/rtcpclplanesegmentation.hの43行目の、
  #include <pcl/features/normal_3d.h>

の直前の行に、#undef を挿入します。
  #undef LOGGER_H
  #include <pcl/features/normal_3d.h>

make

build ディレクトリ内で、 make を実行します。
make が通ったら、make install してください。

 % make
 % sudo make install

サンプルの実行

端末からRainbowTube サンプルと、Viewer サンプルを実行します。

 % RTCPCLRainbowTube_standalone & 
 % RTCPCLViewer_standalone &

Eclipse の RTシステムエディタ 上にふたつのコンポーネントを配置し、接続して All Activate します。
RainbowTube_SYSED.png
RTC::PCLViewer ウインドウが開いて、このような画像が出れば成功です。
rainbowtube1.png
マウスのホイールやドラッグの操作で、カメラの角度を変えられます。
rainbowtube2.png

次に、OpenNIサンプルを試します。
RTシステムエディタで All Deactivate して、RTCPCLRainbowTube0 を削除したら、端末から OpenNI サンプルを実行します。

 % RTCPCLOpenNI &

RTシステムエディタで、RTCPCLOpenNI0 コンポーネントの中段のデータポート corba_xyzrgb と RTCPCLViewer0 につなぎます。
OpenNI-SYSED.png
All Activate して、何かもやもやした無数の点の画像が表示されれば成功です。
openni1.png
カメラを操作すると、逆さまに映っているのがわかります。(Kinectの座標系がカメラ座標系であるため)
openni2.png

libusb が Permission denied エラーを出す場合

RTCPCLOpenNI をアクティベートすると、次のようなエラーが出る場合があります。

 vision@hiro-console:~/asahi/choreonoid-1.0.0/extplugin/graspPlugin/PCL$ RTCPCLOpenNI_standalone 
 libusb couldn't open USB device /dev/bus/usb/002/005: Permission denied.

この場合は、デバイスのパーミッションを変更します。
 % sudo chmod 666 /dev/bus/usb/002/005

/dev/bus/usb/xxx/xxx の値はPCによって違うので、よくエラーメッセージを見てください。