OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
没有匹配项
ICP 逐点到平面里程计算法

本文说明了一种 ICP 算法,该算法用于深度融合管道(例如 KinectFusion)。

ICP 的目标是排列两个点云,旧点云(3D 模型中现有的点和法向量)和新点云(新点和法向量,我们要将其整合到现有的模型中)。ICP 会返回这两个点云之间的旋转和平移变换。

迭代最近点 (ICP) 会最小化目标函数,该函数为两个点云中相应点之间的点到平面距离 (PPD)

什么是 ppd(p, q, n)?

具体而言,对于每个相应点PQ,它为点P到由点Q和位于点Q中的法向量N确定的平面的距离。如果给定当前照相机姿势,两个点PQ投射到同一像素中,则认为它们是相互对应的。

p - 新点云中的第 i 个点

q - 旧点云中的第 i 个点

n - 旧点云中点q中的法向量

因此,ppd(...)可以表示为(pq之间的差)和(n)的点积

T(p)为点p的刚性变换

其中R - 旋转,t - 平移。

T是我们通过 ICP 搜索的变换,其目的是在点到平面的距离方面使每个点p更接近相应的点q

如何最小化目标函数?

我们使用高斯-牛顿方法最小化函数。

在高斯-牛顿方法中,我们通过改变Rt来让函数 E 减小的方向(即梯度方向)进行顺序步骤

  1. 在每个步骤中,我们通过将其当前值加上雅可比矩阵乘以串联的delta Rdelta t向量的delta x来线性地估计函数E
  2. 我们通过求解方程E_approx(delta_x) = 0来求delta Rdelta t
  3. 我们将delta Rdelta t应用于当前的 Rt 变换,然后继续执行下一次迭代

如何将 E 线性化?

让我们在无限小邻域内对其进行估计。

以下是要通过改变Rt最小化的公式

虽然点到平面的距离对Rt都是线性的,但是旋转空间本身是线性的。你可以从如何从旋转角度生成R中看到这一点

但是由于我们的旋转是无限小的,所以R可以使用以下形式估算

其中I - 单位矩阵,A - 三维特殊正交组so(3) 的成员。

通过将所有 sin(t) 与 cos(t) 项逼近到其t --> 0 的极限,我们得到以下表示

将近似的R 再代入到表达E 中,我们得到

让我们引入一个函数 f 来逼近变换偏移

如何使 <em>E_approx</em> 最小化?

E_approx 的微分(即按自变量增量求导数)为零时E_approx 最小,因此让我们找到该微分

让我们对ppd 求导

下面是我们在向量 x 中对所有变量 x_j 所获得的结果

设新变量:

f(x, p) 可表示为矩阵向量乘积。为了证明这一点,我们必须记住

引入G(p) 是一项简化操作。

由于 我们得到

设新值为

让我们做替换

通过求解此方程,我们为每次高斯-牛顿迭代获得刚性变换偏移。

我们如何运用变换偏移?

我们从偏移生成旋转和平移矩阵,然后将当前姿势矩阵乘以我们获得的矩阵。

尽管平移部分的偏移按原样加到结果矩阵中,但旋转部分的生成要稍微棘手一些。通过指数作用获得从so(3)SO(3) 的旋转偏移。事实上,3 x 1 rshift 向量表示旋转轴乘以旋转角度。我们用罗德里格斯变换来从该变量中获得旋转矩阵。有关更多详情,请参阅 维基页面