2つの3D点群間の変換と回転の違いを見つける必要があります。これについては、PCLが理想的であるように見えるので、これを調べています。
クリーンなテストデータでは、反復最近傍点が機能していますが、奇妙な結果が出ています(ただし、正しく実装していない可能性があります...)pcl::estimateRigidTransformation
機能しており、ノイズの多いデータの処理が悪化すると思いますが、それはより良いようです。
私の質問は:
2つの雲はノイズが多くなり、同じ点が含まれているはずですが、いくつかの不一致があります。これに対処する最良の方法は何ですか?
最初に2つのクラウドで対応する機能を見つけて、estimateTransform
を使用する必要がありますか?または、RANSAC
関数を見て外れ値を削除する必要がありますか? ICP
はestimateRigidTransform
よりも良い方法ですか?
強力なポイントクラウド登録アルゴリズムを設定することは、さまざまなオプション、ハイパーパラメーター、およびテクニックを正しく設定して強力な結果を得るには、困難な作業になる可能性があります。
ただし、 Point Cloud Library には、この種のタスクを解決するための事前実装された関数のセット全体が付属しています。あとは、各ブロックが何をしているかを理解し、これらのブロックを互いに積み重ねた、いわゆるICPパイプラインを設定するだけです。
ICPパイプラインは、2つの異なるパスをたどることができます。
1。反復登録アルゴリズム
簡単なパスは、入力クラウド(IC)に反復最近傍点アルゴリズムを適用してすぐに開始し、常に最短点法を使用して、固定参照クラウド(RC)で計算します。 ICPは、2つの点群が十分に近く(回転Rと並進Tの前に良好)、楽観的な仮定を採用しており、レジストレーションは、それ以上の初期整列なしで収束します。
もちろん、このパスはローカルミニマムで動かなくなる可能性があり、そのため、指定された入力データのあらゆる種類の不正確さに騙されがちになるため、パフォーマンスが非常に低下します。
2。機能ベースの登録アルゴリズム
この問題を克服するために、人々はあらゆる種類の方法とアイデアの開発に取り組み、パフォーマンスの悪い登録を克服しました。単なる反復登録アルゴリズムとは対照的に、機能ベースの登録では、最初に2つの点群間のより高いレバー対応を見つけてプロセスを高速化し、精度を向上させます。メソッドはカプセル化されてから、登録パイプラインに埋め込まれ、完全な登録モデルが形成されます。
PCLドキュメント の次の図は、このような登録パイプラインを示しています。
ご覧のように、ペアワイズ登録は、さまざまな計算ステップを実行して最良のパフォーマンスを発揮するはずです。単一の手順は次のとおりです。
データ取得:入力クラウドと参照クラウドがアルゴリズムに供給されます。
推定キーポイント:キーポイント( interest point )は、以下の点群内のポイントです特徴:
点群のそのような顕著な点は、それらの合計が点群を特徴付け、その異なる部分を区別できるようにするのに役立つため、非常に便利です。
pcl::NarfKeypoint
pcl::ISSKeypoint3D< PointInT, PointOutT, NormalT >
pcl::HarrisKeypoint3D< PointInT, PointOutT, NormalT >
pcl::HarrisKeypoint6D< PointInT, PointOutT, NormalT >
pcl::SIFTKeypoint< PointInT, PointOutT >
pcl::SUSANKeypoint< PointInT, PointOutT, NormalT, IntensityT >
詳細情報: PCLキーポイント-ドキュメント
キーポイントの説明-機能記述子:キーポイントを検出した後、それらすべての記述子を計算します。 「ローカル記述子は、ポイントのローカル近傍のコンパクトな表現です。完全なオブジェクトまたは点群を説明するグローバル記述子とは対照的に、ローカル記述子は、ポイントの周囲のローカル近傍でのみ形状と外観に似ているため、それを表すのに非常に適しています。マッチングに関して」 (Dirk Holz et al。)
pcl::FPFHEstimation< PointInT, PointNT, PointOutT >
pcl::NormalEstimation< PointInT, PointOutT >
pcl::NormalEstimationOMP< PointInT, PointOutT >
pcl::OURCVFHEstimation< PointInT, PointNT, PointOutT >
pcl::PrincipalCurvaturesEstimation< PointInT, PointNT, PointOutT >
pcl::IntensitySpinEstimation< PointInT, PointOutT >
詳細情報: PCL機能-ドキュメント
対応推定:次のタスクは、点群で見つかったキーポイント間の対応を見つけることです。通常、計算されたローカル機能記述子を利用して、それぞれを他の点群の対応する対応機能と照合します。ただし、類似したシーンからの2つのスキャンは、1つのクラウドが他のクラウドよりも多くのデータを持つことができるため、必ずしも同じ数の特徴記述子を持たないという事実により、分離した対応拒否プロセスを実行する必要があります。
pcl::registration::CorrespondenceEstimation< PointSource, PointTarget, Scalar >
pcl::registration::CorrespondenceEstimationBackProjection< PointSource, PointTarget, NormalT, Scalar >
pcl::registration::CorrespondenceEstimationNormalShooting< PointSource, PointTarget, NormalT, Scalar >
通信拒否:通信拒否を実行する最も一般的なアプローチの1つは、 [〜#〜] ransac [〜# 〜] (ランダムサンプルコンセンサス)。しかし、PCLにはより多くの拒否アルゴリズムが付属しているので、PCLをより詳しく見ることができます。
pcl::registration::CorrespondenceRejectorSampleConsensus< PointT >
pcl::registration::CorrespondenceRejectorDistance
pcl::registration::CorrespondenceRejectorFeatures::FeatureContainer< FeatureT >
pcl::registration::CorrespondenceRejectorPoly< SourceT, TargetT >
詳細情報: PCLモジュール登録-ドキュメント
変換の推定:2つの点群間のロバストな対応が計算された後、絶対方位アルゴリズムを使用して、6DOF(6自由度)変換が計算されます。参照点群と一致するように入力群に適用されます。そのためのアルゴリズムアプローチは数多くありますが、PCLには Singular Value Decomposition (SVD)に基づく実装が含まれています。点群を一致させるために必要な回転と平行移動を表す4x4行列が計算されます。
pcl::registration::TransformationEstimationSVD< PointSource, PointTarget, Scalar >
詳細情報: PCLモジュール登録-ドキュメント
参考文献:
クラウドにノイズが多く、初期の配置があまり良くない場合は、最初からICPを適用することを忘れてください。クラウドでキーポイントを取得し、これらのキーポイントの機能を推定してみてください。さまざまなキーポイント/機能アルゴリズムをテストして、ケースに適したアルゴリズムを選択できます。
次に、これらの機能を一致させて通信を取得できます。 RANSACループでこれらの対応をフィルタリングして、初期変換を取得するために使用するインライアを取得します。 CorrespondenceRejectorSampleConsensus
は、このステップで役立ちます。
この変換を適用したら、ICPを使用して最終的な調整を行うことができます。
パイプラインは次のようなものです:
注:このパイプラインは、両方の点群が同じ縮尺である場合にのみ役立ちます。他の場合では、雲の間のスケール係数を計算する必要があります。
スーパー4pcsをグローバル登録に使用できます。 ICPは、最初の回答に依存する勾配降下法などのローカルな方法です。