PCL 公式ウェブサイト参考:ランダム サンプル コンセンサス モデルの使用方法 — PCL
1. RANSAC の概要
RANSAC ( RA ndom SAmple Consensus 、Random Sampling Consensus) アルゴリズムは、「外れ値」を含むデータのセットから数学的モデルの パラメーターを正しく推定するための反復アルゴリズムです。「外れ値」とは通常、マッチングの不一致や推定曲線の外れ値など、データ内のノイズを指します。したがって、RANSAC は「外れ値」検出アルゴリズムでもあります。RANSAC アルゴリズムは不確実なアルゴリズムであり、1 つの確率の下でのみ結果を生成でき、この確率は反復回数が増加するにつれて増加します。
- 基本的な前提:データは「内側の点」と「外側の点」で構成されます。「インライア」はモデルのパラメータを構成するデータであり、「アウトライア」はモデルに適合しないデータです。もう 1 つの必要な前提は、RANSAC がデータから選択されたモデル パラメーターを最適に推定できるということです。
2. アルゴリズムの基本的な考え方とプロセス
2.1 RANSAC アルゴリズムのプロセス
RANSAC は、データ セットを繰り返し選択してモデルを推定し、より良いモデルが推定されるまで反復します。
具体的な実装手順は次の手順に分けることができます。
- モデルを推定できる最小のデータセットを選択します (直線フィッティングの場合は 2 点、ホモグラフィー行列の計算の場合は 4 点です)。
- このデータセットを使用してデータモデルを計算します。
- すべてのデータをこのモデルに取り込み、「インライア」の数を計算します (特定の誤差範囲内で現在の反復ロールアウト モデルに適したデータを蓄積します)。
- 現在のモデルと以前に起動された最良のモデルの「内部ポイント」の数を比較し、「内部ポイント」の数が最も多かったモデル パラメーターと「内部ポイント」の数を記録します。
- 反復が終了するか、現在のモデルが十分に良好になる (「内部点の数が特定の数を超える」) まで、手順 1 ~ 4 を繰り返します。
2.2 RANSACアルゴリズムの長所と短所
- RANSAC の利点の 1 つは、モデル パラメーターのロバストな推定が可能になることです。つまり、データセット内に多数の外れ値がある場合でも、パラメーターを高い精度で推定できます。
- RANSAC の欠点は、これらのパラメーターの計算にかかる時間に上限がないことです。限られた反復回数で計算を実行すると、得られる解は最適ではない可能性があり、データに適切に適合するものでさえない可能性があります。このように、RANSAC はトレードオフを提供し、より多くの反復を計算することで、合理的なモデルを生成する確率が増加します。RANSAC のもう 1 つの欠点は、問題固有のしきい値が必要なことです。
- RANSAC は、特定のデータセットに対して 1 つのモデルのみを推定できます。2 つ (またはそれ以上) のモデルが存在する場合、どのモデル アプローチでも、RANSAC はそれらのいずれも見つけられない可能性があります。
3. PCLでのRANSAC利用参考例
3.1 線形モデルと球面モデルのフィッティング
参考例:ランダムサンプルコンセンサスモデルの使い方 — PCL
///核心代码注释
std::vector<int> inliers;
// created RandomSampleConsensus object and compute the appropriated model
pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr
model_s(new pcl::SampleConsensusModelSphere<pcl::PointXYZ> (cloud));//球模型
pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr
model_p (new pcl::SampleConsensusModelPlane<pcl::PointXYZ> (cloud));//线模型
if(pcl::console::find_argument (argc, argv, "-f") >= 0)//判断主函数输入参数
{
//输入参数-f时为线模型model_p
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac (model_p);//设置RANSAC模型
ransac.setDistanceThreshold (.01);//设置阈值
ransac.computeModel();//迭代计算
ransac.getInliers(inliers);//获取内点inliners
}
else if (pcl::console::find_argument (argc, argv, "-sf") >= 0 )
{
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac (model_s);
ransac.setDistanceThreshold (.01);
ransac.computeModel();
ransac.getInliers(inliers);
}
3.2 2-2点群取得装置の自動校正
参考資料: PCL_ 「点群ライブラリPCLのエントリーからマスターまで」ルーチンより2-2点群取得装置の自動校正