PCL(Point Cloud Library)+ROSで3次元画像処理入門

f:id:karaage:20170817152149j:plain:w640

PCLで3次元画像処理

 最近、個人的に画像処理に興味を持っています。2次元の画像処理は、フィルタの基礎から勉強しています(以下記事参照)。

 2次元の画像処理を色々試すと、ちょっと上の次元も試してみたくなりますね。というわけで今回は3次元の画像処理に挑戦してみようと思います。2次元だと、フリーで使えるライブラリとしてOpenCVが有名ですが、3次元だとPCL(Point Cloud Library)というものが有名です。

 PCLに関しての概要は、Atsushi (id:meison_amsl)さんの以下記事を参照下さい(突然の手抜き)。 

3次元画像処理の開発にはPCL + ROSの組み合わせが最適

 じゃあ早速PCLを使ってみようとなるわけですが、簡単に表示できる2次元画像(写真)と違い、3次元データはちょっと表示(可視化)するにも一苦労ですし、3次元データを扱えるセンサからどうやって3次元データを取得すれば良いのか、そもそもPCLをどうやってセットアップすれば良いのかもよく分かりませんね。

 そんなときに役立つのがROS(Robot Operating System)です。ROSはロボットのソフトウェア開発に使われるフレームワーク(ミドルウェア群)で、何度かこのブログでも使っています。ROSの概要や、使用するメリットなどは、またまたAtsushi さんの以下記事を参照下さい。

 上記記事でも触れられているように、元々ROSというのは、米国のロボットベンチャー企業であるWillow Garage社(現OSRF)が開発したソフトなのですが、PCLもWillow Garage社で開発されているため、PCLとROSは非常に相性が良いのです。具体的には以下です。

  • ROSをインストールすればPCLも自動的にインストールされる
  • PCLの3次元情報(3次元点群)をROSのRvizというソフトで簡単に可視化できる
  • 多数の市販3次元センサ用がROSに対応している

 PCLを使うなら、ROSを使わない手はないですね。というわけで、今回はROSとPCLの組み合わせにトライしてみます。ちなみに、2次元の画像処理ライブラリとして有名なOpenCV、開発したのはIntelですが、実はWillow Garageが開発で行われていたこともあり、実はROS、PCL、OpenCVは深い関わりがあったりするのです。いかにWillow Garageという会社がロボットの要素としてビジョンを重視していたかがよく分かりますね。

PCL + ROSで3次元画像処理

ROS(Linux) + PCLセットアップ

 ROSはLinux(Ubuntu)上で動かすのが基本(他は茨の道)なので、Linuxをインストールしたマシンをインストールしましょう。ここが一番ハードル高いかもしれませんね。ROSのインストールに関しては、以前自動でインストールするスクリプトを作ったりしたので、もしよければ参照してみて下さい。

 3次元センサを接続するので、基本的にはネイティブなLinux環境があるのがよいのですが、WindowsやMac上のバーチャルマシン上にLinuxとROSの仮想環境を構築する方法もあります。3次元センサの入力に関しては、とりあえず無しでもお試しできる方法もあります(後ほど紹介します)。仮想環境構築に関しては、以下記事参照下さい。

 ROSをフルインストールすると、PCLも自動的にインストールされます。ここは楽ですね。

 Raspberry PiにROSをインストールする方法もありますが、3次元画像処理は基本マシンスペックが必要なのでオススメしません。

 今回はROSのバージョンはIndigoを前提にしています(最新バージョンのkineticでも、ところどころindigoをkineticに置き換えるだけで、ほぼ同じ要領で良いと思います)。また、ビルドシステムはcatkin tools(catkin build)を前提としています。catkin toolsに関しては、Raspberry Pi 3にROSをセットアップしてRaspberry Pi純正カメラ(Raspicam)で遊んでみたの記事の「ROSのビルドシステム catkin_makeとcatkin tools(catkin build)に関して」を参照下さい(Raspberry Pi以外でROSを使う場合も同様です)。

3次元センサのセットアップ

 続いて3次元センサのセットアップです。一昔前は、3次元センサはものすごい高価(数百万)くらいしたのですが、最近市販の安い3次元センサも出てきました。ただ、性能はまだまだ発展途上です。価格的にも性能的にも使いやすいのは、実は未だに初代Kinect(Kinect V1)だったりします(個人的な意見)。というわけで、今回はKinect V1を使います。

Xbox 360 Kinect センサー

Xbox 360 Kinect センサー

 ROSでのKinectのセットアップ、動作確認方法、Rvizでの可視化に関しては、以下記事参照下さい。

f:id:karaage:20170817152149j:plain:w640
 はてなさんに読者プレゼントでもらったLIVAちゃんと活用しています!(謎アピール)

f:id:karaage:20170817152136j:plain:w640
 Rvizで部屋の3次元点群情報を可視化中

f:id:karaage:20170817231703p:plain:w640  Rviz表示

3次元画像処理実験

 準備が整ったら、いよいよ3次元画像処理です。ただ、実はPCLに関しては、あまり情報がなかったりします。特に日本語に関しては壊滅的です。あまり良い本も見つかりませんでした(もし良い情報を知っている人がいたら、教えて下さい。

 以下のROS WikiのPCLの項目や、PCL本家のドキュメント、チュートリアルを見ていくのが一番の近道のようです。

perception_pcl/Tutorials - ROS Wiki

PCL - Point Cloud Library (PCL)

 その他、参考になりそうなネット情報をこの記事の最後に参考リンクとしてまとめましたので、興味ある方は参照下さい。

 といっても、ROSとPCLを組み合わせて、どうやって3次元センサ(Kinect)の入力情報を処理して、Rvizで可視化できるように出力するか書いてなかったりします。そこで、Kinectの3次元点群をPCLのチュートリアルにある3次元画像処理して、Rvizで表示する簡単なサンプルを作成してGitHubにアップしましたので、こちらを使って3次元画像処理の実験をしていこうと思います。

 GitHubのリポジトリは以下になります。

 ROSをインストールしたマシンで、以下コマンド実行してビルドします。

$ git clone https://github.com/karaage0703/pcl_ros_processing
$ cd pcl_ros_processing
$ catkin bt

 あとは、1つ目のターミナルで以下実行し、roscoreを立ち上げましょう。

$ roscore

 2つ目のターミナルで、kinect もしくは他の3次元センサのノードを立ち上げましょう。

 もし、3次元センサがない方は、以下のコマンドを実行して、予め取得して置いた私の部屋の3次元データを再生して下さい。このように、簡単にログを取得、再生できる仕組みがあるのが、ROSの良いところですね。

$ rosbag play -l rosbag_data/pcl_test.bag

 3つ目のターミナルで以下実行します。

$ rosrun pcl_ros_processing planar_segmentation input:=/camera/depth_registered/points

 この状態で、Rvizを立ち上げ、/planar_segmentationというPoint Cloud2のTopicをみると平面を検出が出て来ているのが見て取れます(検出したところの色が変わる)

 次に、Ctrl + Cで上記のplanar_segmentationを終了し、以下コマンド実行すると、カラーフィルタを起動できます。

$ rosrun pcl_ros_processing color_filter_rgb input:=/camera/depth_registered/points

 例えば、以下のように色相のパラメータhのminとmaxを調整すると、特定の色だけ抜き出すことができます。

$ rosparam set /min_h 200
$ rosparam set /max_h 260

 色相(Hue)と色の関係は、以下サイトなど参照下さい。上記のパラメータだと青が抜き出されることになります。

 実際に、平面検出や色のフィルタをかけてみた様子が以下になります。 f:id:karaage:20170817231601g:plain:w640

 平面部分が赤くなったり、青い色だけ抜き出されているのがわかると思います。

Kinect以外の3次元センサに関して

 今回は、Depth(奥行き情報)が取れる3次元センサとしてKinectを使用しました。ただKinectはもう販売中止なんですよね。現在、手頃なお値段で一般人が入手できる以下の3次元センサを簡単に紹介しておきます。一応全てROSでも動かすことができます。

  • Intel Realsense SR300
  • PS4 Stereo Camera
  • ZED Stereo Camera
  • ASUS Xtion2

 3次元センサは、今のところ、欲しい距離で使えない、高い、重い、使いづらい、屋外で使えないなどの欠点があり、まだまだ発展途上の分野だなと感じています。「これだ!」というセンサの決定版があればよいのですが、そういうものはまだまだ先になりそうですね。

 だれか、良い3次元センサを知っていたら私にこっそり教えて下さい(笑)

Intel Realsense SR300

 Intelの3次元センサです。Kinectと同じライトコーディングと呼ばれる方式で3次元情報を取得します。かなり近距離まで精度良く3次元情報が取得できるため、Amazon Picking Challenge(以下APC 現Amazon Robotics Challenge)などの、ロボットコンペティションでもよく使われている、今人気のセンサです。

 去年だと、日本のベンチャーPreferred Networks(PFN)のチームが、このセンサを使ってAPCに出場し健闘(2位取得)していました。詳しい資料はPFNさんの以下スライド参照下さい。

Amazon Picking Challenge 結果報告

 Intel Realsense SR300のセットアップ方法(ドライバのlibrealsenseインストール)は、しょっちゅう変わって結構大変です。公式の以下のREADMEを都度確認してインストールするのがよいでしょう。結構上級者向けと思います。

 Ubuntu 16.04.1でしたら、ROS Kineticをインストールして、とりあえず以下のコマンドを実行してけば、セットアップできると思います。うまくいかなかったら、公式を参照しましょう。

$ sudo apt-get -y install libusb-1.0-0-dev pkg-config
$ sudo apt-get -y install libglfw3-dev
$ git clone https://github.com/IntelRealSense/librealsense
$ cd librealsense
$ mkdir build && cd build
$ cmake ../ -DBUILD_EXAMPLES=true
$ make && sudo make install
$ cd ..
$ sudo cp config/99-realsense-libusb.rules /etc/udev/rules.d/
$ sudo udevadm control --reload-rules && udevadm trigger
$ sudo apt-get -y install libssl-dev
$ ./scripts/patch-realsense-ubuntu-xenial.sh
$ export LD_LIBRARY_PATH=/usr/local/lib:${LD_LIBRARY_PATH}

 ROSのパッケージは、Intel公式のものがあるのですが、何故かものすごく点群がいまいちです。探したら、東大の学生さんが作っている良さそうなROSのパッケージを発見したので、forkして使わせていただいています(少し彩度のパラメータが気になったのでいじっています)。以下のリポジトリのsr300というブランチのものになります。

Intel RealSense Development Kit SR300

Intel RealSense Development Kit SR300

 ちなみにRealsenseはかなり電流を引っ張る(おそらくUSB3.0規格を逸脱している)ので、うまく動かないときは、セルフパワーのUSBハブとか、パワーケーブルなどで電流を供給してやった方がよいです。下記みたいなリピーターケーブルも良いかと思います。

PS4 Stereo Camera

 PlayStation 4のステレオカメラをHackして使う方法もあります。これは、ケーブルの改造(USB3.0)が必要なので、更に上級者向きです。詳細は、以下のサイトなど参照すると良いと思います。ステレオ方式なので、平面などは苦手ですが、結構性能出ます。

Oriental Robotics: PlayStattion4のステレオカメラからの距離画像をROSで使おう!

PlayStation Camera【メーカー生産終了】

PlayStation Camera【メーカー生産終了】

ZED Stereo Camera

 ZED Stereo Cameraも結構高性能です。付属のAPIで3次元情報取得からSLAMまで色々できるようです。こちらは約500ドルと結構お高いです。購入も含めてこちらも上級者向けですね。

ZED Stereo Camera

ASUS Xtion2

 Asus Xtion2は発売されたばかりのセンサです。Kinect V2と同じToF方式と呼ばれる光のパルスの位相差で3次元情報を取得するタイプです。こちらはまだ試したことがありません。一度試してみたいセンサですね(そんなに点群精度は良く無いという噂ですが)。

Xtion 2 | 3D Sensor | ASUS Global

まとめ

 2次元に続いて3次元の画像処理に入門してみました。基本は次元を拡大するだけで2次元の画像処理と同じ部分が多いです(もちろん、計算量は増えますが)。ただ、3次元の画像処理(PCL)で一番つらいのが、情報の少なさでしょうか。日本語はもとより壊滅的ですし、英語でもそれほど情報多くない印象です。PCLの公式サイトをみていくのが一番良さそうですが中々自己学習するにはつらいです。

 もしわかりやすい本や情報をご存知の方がいましたら、是非是非教えて下さい。

参考リンク

PCCブログ | PointCloudConsortium

PCLで点群処理

perception_pcl/Tutorials - ROS Wiki

ROSでのPCLの扱い - Qiita

pcl - ROS Wiki

cmake チュートリアルを読む前に - Qiita

Documentation - Point Cloud Library (PCL)

How to use PCL - ros recognition tutorial

市販 Stereo Cameraについて調査中 - Qiita

Intel RealSenseをMax OSやLinuxでも使える librealsense を使ってみた - Natural Software

Xtion 2 新製品発表会に参加、登壇しました - Natural Software

関連記事