Skip to content
wangguanbei edited this page Dec 14, 2020 · 5 revisions

Iterative Closest Point(ICP)匹配算法

算法功能简介

  • ICP(Iterative Closest Point,迭代最近点)算法是一种点集-点集的匹配方法,基于最小二乘法,计算一个匹配变换以使得点集与点集尽量重叠。

  • ICP算法的输入为两帧待匹配的点云,数据格式为[x, y, z],即点云的三维坐标。

  • 重要的接口函数:

    • 【输入】void pcl::IterativeClosestPoint::setInputCloud(const PointCloudSourceConstPtr& cloud)

      设置源点云(被变换以进行匹配的点云),在匹配过程中不断迭代变换位置。需要的数据格式为[x, y, z],即点云的三维坐标。

    • 【输入】void pcl::IterativeClosestPoint::setInputTarget(const PointCloudTargetConstPtr& cloud)

      设置目标点云(通常是地图点云),在匹配过程中保持不变。需要的数据格式为[x, y, z],即点云的三维坐标。

    • 【输出】void pcl::IterativeClosestPoint::align(PointCloudSource& output)

      进行ICP匹配,参数返回匹配后的源点云。产生的数据格式为[x, y, z],即点云的三维坐标。

    • 【可选输入】void setMaximumIterations(int nr_iterations)

      设置最大迭代次数。

    • 【可选输入】void setMaxCorrespondenceDistance(double distance_threshold)

      设置搜寻最近点时的搜寻范围半径。

    • 【可选输入】void setTransformationEpsilon(double epsilon)

      设置判断收敛的迭代步长阈值。

    • 【可选输入】void setEuclideanFitnessEpsilon(double epsilon)

      设置判断收敛的误差精度阈值。

    • 【可选输出】double getFitnessScore(double max_range = std::numeric_limits<double>::max());

      函数返回两帧点云匹配的均方误差值。

    • 【可选输出】Matrix4 getFinalTransformation()

      函数返回两帧点云匹配使用的4*4变换矩阵。

算法计算流程

todo:KD树的建立算法流程。

其中,计算变换矩阵的具体数学推导过程如下。

关于矩阵求解数学推导:https://zhuanlan.zhihu.com/p/107218828

两组对应的点集: [公式]

求欧式变换 [公式] 使得: [公式]

ICP 算法基于最小二乘法进行迭代计算,使得误差平方和达到极小值:

[公式]

(1)求解 translation

[公式]

[公式][公式] 求偏导,可得:

[公式]

[公式] ,求得:

[公式]

定义质心:

[公式]

因而,

[公式]

[公式] 代入 [公式] 可得:

[公式]

定义去质心坐标:

[公式]

因此,目标函数变为:

[公式]

(2)求解 rotation

[公式]

[公式] 是标量,对于任意标量 [公式] ,都满足 [公式] ,因此,

[公式]

[公式]

将其代入目标函数,可得:

[公式]

因而,

[公式]

img

由上图可知,

[公式]

其中, [公式][公式][公式] 维矩阵。

定义协方差矩阵 [公式] ,对 [公式]SVD 分解

[公式]

因而,求解问题变为使下式最大化:

[公式]

[公式] ,由于满足MMT = E,故M是正交阵,其列向量 [公式] 是 orthonormal vectors,即 [公式] 。因此, 对[公式] 的所有元素都有 [公式]

[公式]

[公式] 时, [公式] 最大; [公式] 又是正交阵,因此 [公式] 必为单位阵。

[公式]

(3)SVD计算方法

[公式]

  1. 计算 SST 和 STS;
  2. 分别计算 SST 和 STS 的特征向量及其特征值;
  3. SST 的特征向量组成 U;而 STS 的特征向量组成 V;
  4. 对 SST 和 STS 的非零特征值求平方根,对应上述特征向量的位置,填入 Σ 的对角元。

样例效果展示

白色代表目标点云(通常为地图点云)。

红色代表本次迭代前的源点云,绿线代表源点云及其在目标点云中找到的对应点。

蓝色代表本次迭代后的源点云,作为下次迭代前的输入。

Clone this wiki locally