解説: PCL の円柱検出実装

解説: PCL の円柱検出実装
2016/05/22
ビジョン&IT ラボ 皆川卓也
1. 概要
Point Cloud Library (PCL)には pcl::SACSegmentationFromNormals という点群から平面
や円柱などの基本形状を検出するクラスが実装されています。このクラスで円柱を検出す
ると、以下のパラメータを取得することが可能です。

円柱の中心軸上の点座標𝒒

円柱の中心軸のベクトル𝐰

円柱の半径R
本書はこのクラスが実際どのようなアルゴリズムで円柱を検出しているのかを解説するも
のです。
(バージョン 1.7.2 で確認)
このクラスを用いて点群から円柱を検出する方法については
http://pointclouds.org/documentation/tutorials/cylinder_segmentation.php
を参照してください。
2. 処理の流れ
円柱の検出は RANSAC という方法によって行われます。
以下が大まかな処理の流れです。
1.
点群の法線ベクトルは事前に計算されているものとする
2.
点群からランダムに2点選択する
3.
選択した2点が円柱の表面にあるとみなして、円柱のパラメータを計算する
4.
各点のうち、算出した円柱との距離が閾値以下のものを選択する。
5.
処理を 2 から繰り返し、最も含まれる点の数が多かったパラメータを選択する。
3. 円柱パラメータの計算方法
ここでは点群からランダムに選んだ2点を用いて、どのように円柱のパラメータを計算し
ているかを述べます。
1
選択された2点を(𝒑1, 𝒏1 )、(𝒑2 , 𝒏2 )とします。ここで𝒑𝑥 座標を𝒏𝑥 は法線ベクトルを表します。
この2点が円柱の表面に存在する場合、以下の式が成り立ちます。
𝐰 ∙ 𝒏1 = 0
eq.(1)
𝐰 ∙ 𝒏2 = 0
𝒒1 + 𝑟1 𝒏1 = 𝒑1
𝒒2 + 𝑟2 𝒏2 = 𝒑2
eq.(2)
𝐰が円柱の中心軸の方向を表すベクトル、𝒒𝑥 が点𝒑𝑥 から中心軸上へ垂直に下した交点座標、
𝑟𝑥 はスカラー値です。
𝐰
𝒑1
𝒏1
𝒒1
図1 円筒パラメータ
これらの連立方程式を𝑟1 , 𝑟2 について解くと
𝑟1 =
|𝒏2 |2 (𝒑1 − 𝒑2 ) ∙ 𝒏1 − (𝒏1 ∙ 𝒏2 )(𝒑1 − 𝒑2 ) ∙ 𝒏2
|𝒏1 |2 |𝒏2 |2 − (𝒏1 ∙ 𝒏2 )2
(𝒏1 ∙ 𝒏2 )(𝒑1 − 𝒑2 ) ∙ 𝒏1 − |𝒏1 |2 (𝒑1 − 𝒑2 ) ∙ 𝒏2
𝑟2 =
|𝒏1 |2 |𝒏2 |2 − (𝒏1 ∙ 𝒏2 )2
eq.(3)
となります。この𝑟1 , 𝑟2 を eq.(2)へ代入すると、中心軸上の点𝒒1 , 𝒒2 は、以下のように求まり
ます。
𝒒1 = 𝒑1 − 𝑟1 𝒏1
𝒒2 = 𝒑2 − 𝑟2 𝒏2
eq.(4)
また中心軸ベクトル𝐰は
eq.(5)
𝐰 = 𝒒2 − 𝒒1
と求まりました。
円柱の半径Rは
2
R = |𝒑1 − 𝒒1 |
eq.(6)
となります。
以上から、円柱の中心軸上の点座標𝒒1 、円柱の中心軸のベクトル𝐰、円柱の半径Rが求まり
ました。
3