Main Content

pcregistericp

ICP アルゴリズムを使用した 2 つの点群のレジストレーション

説明

tform = pcregistericp(moving,fixed) は、移動点群を固定点群にレジストレーションする剛体変換を返します。

レジストレーション アルゴリズムは "反復最近接点" (ICP) アルゴリズムに基づいています。この反復処理で最良のパフォーマンスを得るには、データのプロパティを調整しなければなりません。レジストレーションの精度と効率を向上させるには、pcregistericp を使用する前に pcdownsample を使用して点群をダウンサンプリングすることを検討してください。

"pointToPlane" または "planeToPlane" (Generalized-ICP または G-ICP とも呼ばれる) メトリクスを選択する場合、レジストレーション アルゴリズムには点群の法線が必要です。入力点群の Normal プロパティが空の場合、関数がそれを指定します。

[tform,movingReg] = pcregistericp(moving,fixed) はさらに、固定点群に位置合わせされた変換後の点群を返します。

[___,rmse] = pcregistericp(moving,fixed) はさらに、前述の構文のいずれかを使用し、位置合わせされたインライア点間のユークリッド距離の平方根平均二乗誤差を返します。

[___] = pcregistericp(moving,fixed,Name=Value) は、前の構文にある引数の任意の組み合わせに加えて、名前と値の引数を 1 つ以上使用してオプションを指定します。たとえば、pcregistericp(moving,fixed,Metric="planeToPlane") は、最小化メトリクスを "planeToPlane" に設定します。

すべて折りたたむ

点群データをワークスペースに読み込みます。

ptCloud = pcread("teapot.ply");

読み込まれた点群を表示します。

pcshow(ptCloud) 
title("Teapot")

Z 軸に沿って 30 度回転し、[5 5 10] の並進を行う変換オブジェクトを作成します。

rotationAngles = [0 0 30];
translation = [5 5 10];
tform1 = rigidtform3d(rotationAngles,translation);

点群を変換し、結果を可視化します。

ptCloudTformed = pctransform(ptCloud,tform1);

pcshow(ptCloudTformed)
title("Transformed Teapot")

点群を登録します。

tform = pcregistericp(ptCloudTformed,ptCloud,Extrapolate=true);

結果を真の変換と比較します。

disp(tform1.A);
    0.8660   -0.5000         0    5.0000
    0.5000    0.8660         0    5.0000
         0         0    1.0000   10.0000
         0         0         0    1.0000
tform2 = invert(tform);
disp(tform2.A);
    0.8660   -0.5000   -0.0000    5.0000
    0.5000    0.8660   -0.0000    5.0000
    0.0000    0.0000    1.0000   10.0000
         0         0         0    1.0000

点群データをワークスペースに読み込みます。

ld = load("livingRoom.mat");
moving = ld.livingRoomData{1};
fixed  = ld.livingRoomData{2};

点群を可視化し、y 軸を表示する方向を設定します。

figure
pcshowpair(moving,fixed,VerticalAxis="Y",VerticalAxisDir="Down")

nonuniformGridSample 法を使用して点群をダウンサンプリングし、レジストレーションの効率と精度を向上させます。

maxNumPoints = 12;
fixedDownsampled = pcdownsample(fixed,"nonuniformGridSample",maxNumPoints);
movingDownsampled = pcdownsample(moving,"nonuniformGridSample",maxNumPoints);

plane-to-plane (Generalized-ICP) レジストレーションを使用して点群を整列させます。

[~,movingReg] = pcregistericp(movingDownsampled,fixedDownsampled,Metric="planeToPlane");

点群の整列を可視化し、y 軸を表示する方向を設定します。

figure
pcshowpair(movingReg,fixed,VerticalAxis="Y",VerticalAxisDir="Down")

入力引数

すべて折りたたむ

移動点群。pointCloud オブジェクトとして指定します。

固定点群。pointCloud オブジェクトとして指定します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値の各ペアを区切り、Name を引用符で囲みます。

例: "planeToPlane" は、ICP アルゴリズムの最小化メトリクスを "planeToPlane" に設定します。

最小化メトリクス。"pointToPoint""pointToPlane"、または "planeToPlane" として指定します。反復最近接点 (ICP) アルゴリズムは、指定されたメトリクスに従って移動点群と固定点群の間の距離を最小化することにより、2 つの点群間の剛体変換を推定します。

Metric"pointToPlane" または "planeToPlane" (Generalized-ICP アルゴリズムとも呼ばれる) として指定すると、レジストレーションに必要な反復回数を減らすことができます。ただし、これらのメトリクスには、反復ごとに追加のアルゴリズム手順が必要です。"pointToPlane" または "planeToPlane" メトリクスを使用して、平面のレジストレーションを改善します。

ダウンサンプリング方法の選択
関数 pcdownsample を使用して点群をダウンサンプリングします。"pointToPoint" メトリクスを選択する場合、レジストレーション アルゴリズムには点群の法線が必要です。"nonuniformGridSample" アルゴリズムは、ダウンサンプリングの前に元のデータで法線を計算し、より正確な法線を生成します。したがって、"nonuniformGridSample" ダウンサンプリング法を使用すると、より正確な "pointToPoint" レジストレーションが可能になります。次の表に従って、関数 pcdownsample"random""gridAverage"、または "nonuniformGridSample" 法を使用します。

Metric移動点群のダウンサンプリング方法固定点群のダウンサンプリング方法
"pointToPoint""random""random"
"gridAverage""gridAverage"
"pointToPlane""gridAverage""gridAverage"
"random""nonuniformGridSample"
"planeToPlane""gridAverage""gridAverage"
"nonuniformGridSample""nonuniformGridSample"

外挿。logical の 0 (false) または 1 (true) として指定します。この引数を true に指定すると、『A Method for Registration of 3-D Shapes』で説明されているように、レジストレーション状態空間内でパスをトレースする外挿ステップが関数によって追加されます。外挿を有効にすると、点群の収束に必要な反復回数を減らすことができます。"planeToPlane" メトリクスを使用する場合、名前と値の引数 Extrapolate を指定することはできません。

インライアのパーセント比。(0, 1] の間のスカラーとして指定します。この値は、マッチするペアをインライアとして使用するためのパーセント比を指定します。この関数は、点群のマッチ ペア内にある任意の 2 点間の最大ユークリッド距離について指定した割合よりも 2 点間のユークリッド距離が小さい場合、マッチする点のペアをインライアであると見なします。既定では、関数はマッチするすべてのペアを使用します。

最大反復回数。正の整数として指定します。この値は、関数が 2 つの点群の収束を試みる最大反復回数を指定します。

"pointToPoint" および "pointToPlane" メトリクスの場合、この引数の既定値は 20 です。"planeToPlane" メトリクスの場合、既定値は 30 です。

連続する ICP 反復間の許容誤差。[Tdiff Rdiff] の形式の 2 要素ベクトルとして指定します。ここで、Tdiff と Rdiff は、連続する ICP 反復で推定される並進と回転の差の絶対値の許容誤差をそれぞれ表します。Tdiff は、2 つの並進ベクトル間のユークリッド距離を測定します。Rdiff は角度差を度数で測定します。最新の 3 つの連続する反復において推定された剛体変換間の平均の差が指定された許容誤差の値より小さくなると、アルゴリズムが停止します。

初期剛体変換。rigidtform3d オブジェクトとして指定します。初期剛体変換は、外部での大まかな推定結果を指定する場合に役立ちます。

進行状況の表示。logical の 0 (false) または 1 (true) として指定します。進行状況を表示するには、Verbosetrue に指定します。

出力引数

すべて折りたたむ

剛体変換。rigidtform3d オブジェクトとして返されます。剛体変換は、移動点群を固定点群にレジストレーションします。rigidtform3d オブジェクトは、3 次元剛体変換を示します。反復最近接点 (ICP) アルゴリズムは、移動点群と固定点群間の剛体変換を推定します。

変換後の点群。pointCloud オブジェクトとして返されます。変換後の点群は、固定点群と位置合わせされています。

平方根平均二乗誤差。位置合わせされたインライア点間のユークリッド距離を表す正の数値スカラーとして返されます。

アルゴリズム

すべて折りたたむ

Illustration of complete point cloud registration workflow.

ヒント

  • 地上車両の点群の場合、レジストレーション前に関数 pcfitplane または関数 segmentGroundFromLidarData を使用して地面を削除することにより、パフォーマンスと精度を向上させることができます。これを行う方法の詳細については、LiDAR データからのマップの作成 (Automated Driving Toolbox)の例の補助関数 helperProcessPointCloud を参照してください。

  • 2 つを超える点群をマージするには、関数 pcmerge の代わりに関数 pccat を使用します。

参照

[1] Besl, P.J., and Neil D. McKay. “A Method for Registration of 3-D Shapes.” IEEE Transactions on Pattern Analysis and Machine Intelligence 14, no. 2 (February 1992): 239–256. https://doi.org/10.1109/34.121791.

[2] Chen, Yang, and Gérard Medioni. “Object Modelling by Registration of Multiple Range Images.” Image and Vision Computing 10, no. 3 (April 1992): 145–155. https://doi.org/10.1016/0262-8856(92)90066-C.

[3] Segal, A., Haehnel, D. and S. Thrun. "Generalized-ICP". Robotics: Science and Systems V, Robotics: Science and Systems Foundation,. (June 2009): 435-442. https://doi.org/10.15607/RSS.2009.V.021.

拡張機能

バージョン履歴

R2018a で導入

すべて展開する