MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Point Cloud Library (PCL)の各モジュールの概要

目次

はじめに

ロボティクスにおいて、

三次元点群処理は非常に重要です。

 

Point Cloud Library(PCL)は

ROSからスピンアウトした

三次元点群処理用ライブラリで、

ロボティクスにおいて、

広く利用されています。

PCL - Point Cloud Library (PCL)

  

今回は、

PCLの各モジュールの概要について説明したいと思います。

基本的には下記のオフィシャルドキュメントを意訳したものになります。

 

Filters

statistical_removal_2.jpg (JPEG 画像, 829x300 px)

Filtersは、

主に点群のノイズを除去するためのモジュールです。

 

Filtersのツールは、

それぞれの点の周囲のデータを統計的に評価し、

ある評価基準に満たさない点データを削除します。

 

代表的な手法としては、

それぞれの分布をガウス分布で近似し、

その平均値と標準偏差の値で、

アウトライアーかどうかを評価する方法があります。

 

 

Features

  • features_normal.jpg (JPEG 画像, 371x175 px)

Featuresライブラリは、

点群情報から3次元特徴を推定するための、

データ構造やアルゴリズムをまとめたライブラリです。

三次元特徴は、一般的にある点の周りの

幾何学的情報から得られる特徴情報になります。

 

例えば、

冒頭の図は代表的な三次元特徴である

法線ベクトルの抽出結果です。

一般的に、このような三次元特徴を抽出する際には、

ある注目点(クエリ)の周りの点を

k近傍法で選択した点の情報を利用します。

 

この近傍点の探索を高速化するために、

kd-treeやoctreeというデータで

入力点群のデータを構造化しておくことも

重要な手法です。

 

そして、クエリの周辺の点の位置データの、

固有値を計算することにより、

法線ベクトルを推定することが可能になります。

 

 

Keypoints

narf_keypoint_extraction.png (PNG 画像, 612x567 px)

Keypointsライブラリは、

いくつかの特徴点抽出のアルゴリズムで構成されています。

この特徴点は、

それぞれの点群の中で、

安定的で、特徴的な点を表しています。

この特徴点を利用することで、

元の点群よりも少ない点のデータで、

元の点群データを表現できるようになります。

 

 

Registration

scans.jpg (JPEG 画像, 800x200 px)

Registration ライブラリは、

複数の点群データの重ねあわせ(レジストレーション)用のライブラリを

まとめたライブラリになります。

 

レジストレーションは、

複数の点群同士の対応する点を抽出し、

それらの間の距離が最小になるになるような、

点群の座標変換の値を推定する技術です。

この座標変換の推定は、

繰り返し処理によって実施され、

対応点のそれぞれの距離が

ある閾値以下になるまで、座標変換量を

逐次推定することで、最終値を推定します。

 

keypoints Tutorial

KdTree

3dtree.png (PNG 画像, 548x521 px)

KdTreeモジュールは、

FLANNを使った高速最近傍点探索を可能にするための

ライブラリです。

FLANNに関しては下記を参照下さい

myenigma.hatenablog.com

 

KD-Treeは、

K次元のデータの距離探索や、

最近傍点探索を高速に探索するための

ツリー状のデータ構造のことを指します。

 

最近傍点探索は、

点群処理においては重要な処理の一つです。

ある点の周りの特徴量の抽出や、

点のグルーピング、

点同士の対応点探索など、

PCLの様々な処理で最近傍点探索は利用されています。

kdtree-search

 

Octree

octree_bunny.jpg (JPEG 画像, 450x441 px)

 

Octreeモジュールは、

階層的なツリー状の点群データ構造を

構成するためのモジュールです。

このモジュールにより、

空間分割が実施され、

効率的なダウンサンプリングや探索が可能になります。

それぞれのoctreeのノードは、

8つの子ノードを有しており、

それぞれのノードは3次元をそれぞれ2分割した形になります。

つまり、子ノードに一つ移動するにつれて、

ボクセルの解像度が二倍になっていきます。

 

このoctreeでは、

ボクセルサーチや、K近傍法、

距離検索など、

効率的な最近傍点探索のロジックが実装されています。

またそれぞれの探索の次元なども自動調整されます。

加えて、それぞれのノードに占有度や点密度などの

情報を付加することもできますし、

データをバイナリーフォーマットに変換することも可能です。

また、メモリのアロケーションなどを高周期で実施したい時などに、

無駄なメモリを削減するような機能も付随しています。

 

Octree Tutorial

Segmentation

plane_model_seg.jpg (JPEG 画像, 427x267 px)

 

Segmentationモジュールは、

ある点群を個別のクラスタに分類するモジュールです。

これらのアルゴリズムは、

空間的に複数の物体に分かれている時の方が、

精密なクラスタリングが可能になります。

 

segmentation-tutorial

Sample Consensus

sample_consensus_planes_cylinders.jpg (JPEG 画像, 772x500 px)

 

sample sansensusモジュールは、

RANSACのような、サンプリングペースの

モデル推定モジュールです。

 

推定できるモデルしては、

線や平面や円柱、球などがすでに準備されています。

平面推定は屋内での認識において、しばしば利用されます。

(壁や床やテーブル面の推定など)

その他のモデルは、特別な形状の物体(コップなど)

を推定するのに使用することができます。

ユーザが指定したモデルやパラメータでの推定も可能です。

 

Surface

surface_meshing.jpg (JPEG 画像, 640x320 px)

 

Surfaceモジュールは、

3次元の点群から、表面情報を再構築するライブラリです。

点群の法線ベクトルから、メッシュやスムージングやリサンプリングされた

面情報を抽出することができます。

 

スムージングやリサンプリングは、

元の点群情報がノイズを含んでいたり、

複数の点群のデータのレジストレーションが

完璧でなかった時などに、重要になります。

またこの時に同時に面推定をしたり、

法線ベクトルの抽出なども可能になります。

 

またこのモジュールの

メッシュ化のアルゴリズムとしては、

2つのアルゴリズムが実装されています。

一つ目は、高速な三角形メッシュアルゴリズム、

二つ目は、スムージングや穴補完などを含む、

低速なメッシュアルゴリズムです。

 

Range Image

range_image1.jpg (JPEG 画像, 724x260 px)

Range Imageモジュールは、

距離画像を取り扱うためのモジュールです。

距離画像は、それぞれのピクセルの値が、

センサ中心からの距離や深さを表した画像です。

一般的に、距離画像はステレオカメラや、

TOFカメラで取得できますが、

カメラのキャリブレーションの値を使うことで、

簡単に距離画像を点群に変換することができます。

 

I/O

I/Oライブラリは、

Point Cloud Data (PCD)ファイルを読んだり、

書いたりするモジュールです。

また様々なセンサから点群データを取得する機能もあります。

 

 

Visualization

bunny1.jpg (JPEG 画像, 672x341 px)

 

Visalizationモジュールは、

三次元点群データに関する

アルゴリズムの結果を可視化するモジュールです。

OpenCVにおける画像や二次元形状を表示するツールに似たものになります。

 

下記のようにpcl::PointCloud のデータを可視化したり、

bunny1.jpg (JPEG 画像, 672x341 px)

 

円柱や球、ポリゴンなどの三次元形状を可視化したり、

shapes1.jpg (JPEG 画像, 672x397 px)

 

二次元のヒストグラムを表示したり、

histogram1.jpg (JPEG 画像, 672x210 px)

 

range_image1.jpg (JPEG 画像, 724x260 px)

距離画像を表示する関数もあります。

 

 

Common

Commonモジュールは、

PCLで使用される汎用的なデータ構造や

関数が実装されたモジュールです。

 

データ構造としては、

点群のクラスや、

面情報、RGBの色データ、

特徴点情報などがあります。

 

関数としては、

距離やノルム、

平均や共分散、

角度変換、幾何学変換などが準備されています。

 

Search

Searchモジュールは、

様々なデータ構造における最近傍点探索を実施する

関数モジュールです。    

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

 

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com