NDT点云配准算法原理及PCL实现
source link: https://blog.csdn.net/weixin_37835423/article/details/112469422
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
NDT点云配准算法原理及PCL实现
NDT算法因其具有较强的鲁棒性而被广泛的应用,下面这些项目中的点云配准算法采用的都是NDT:
Autoware
hdl_graph_slam
hdl_localization
可见该配准方法的重要性,下面我将对这个算法进行分析.
目标函数(对应伪码中的 s c o r e score score)
总概率计算如下:
为了能使用高斯牛顿迭代法,需要将目标函数转换成求最小值,而我们的目标是要求取公式(6.5)的最大值,因此可通过下式进行转换,将求取公式(6.5)的最大值转换成求取公式(6.6)的最小值:
假设每个栅格内点的分布呈正态分布,按公式(6.6)对一个正态分布的PDF求取-log值会出现下图红线所示的没有最大边界问题,该问题会使得噪声对优化结果产生很大影响(如果噪声很大,-log值会非常大,导致优化算法主要的目标是去优化噪声了,结果将会被严重影响)
其中常数 c 1 , c 2 c_{1}, c_{2} c1,c2 可以通过要求 p ˉ ( x ⃗ ) \bar{p}(\vec{x}) pˉ(x ) 的概率质量在一个单元格跨越的空间内等于1来确定。公式(6.7)没有简单的一阶、二阶微分.但通过观察上图发现公式(6.7)可以被下式近似:
式中的 d 1 , d 2 , d 3 d_{1}, d_{2}, d_{3} d1,d2,d3 可通过令 x = 0 , x = σ , x = ∞ x=0,x=\sigma, x=\infty x=0,x=σ,x=∞建立方程求解,结果为: 该式具有简单的微分方程.基于高斯近似后的概率分布函数如下:
于是最终的目标函数由(6.6)转换成了下式:
注意:
虽然目标函数已确定,但目标函数中的协方差矩阵 Σ \Sigma Σ 的确定需要采取一些策略.因为目标函数中需要求取协方差矩阵的逆 Σ − 1 \Sigma ^{-1} Σ−1 ,如果栅格中的点是共面或共线的,协方差矩阵是奇异的,无法求取逆矩阵,因此由三维空间中三个及以下的点来求取协方差矩阵必然是奇异的.为了解决该问题,NDT算法中的PDF计算要求至少需要5个点,并且当 Σ \Sigma Σ 几乎为奇异值时,就对该协方差进行调整,调整的策略为: 如果 Σ \Sigma Σ 最大的特征值 λ 3 \lambda_{3} λ3 比 λ 1 , λ 2 \lambda_{1}, \lambda_{2} λ1,λ2 大100倍时,令 λ 1 = λ 2 = λ 3 / 100 \lambda_{1} = \lambda_{2} = \lambda_{3}/100 λ1=λ2=λ3/100 ,然后再令 Σ = V ∧ ′ V \Sigma = \mathbf{V}\boldsymbol{\wedge}^{'}\mathbf{V} Σ=V∧′V,其中 V \mathbf{V} V 包含了 Σ \Sigma Σ 的特征向量, ∧ ′ \wedge^{'} ∧′ 的计算如下: 至此确定了NDT算法的目标函数.
梯度向量的求解
令
可得梯度向量:
海森矩阵的求解
从上面的分析可知,NDT算法主要的任务是对梯度向量和海森矩阵的求解,而从公式(6.12)和(6.13)可以看出,针对不同场景,主要的差异体现
δ
x
⃗
k
′
δ
p
i
\frac{\delta\vec{\mathbf{x}}_{k}^{'}}{\delta\mathbf{p}_{i}}
δpiδx
k′和
δ
2
x
⃗
k
′
δ
p
i
δ
p
j
\frac{\delta^{2}\vec{\mathbf{x}}_{k}^{'}}{\delta\mathbf{p}_{i}\delta\mathbf{p}_{j}}
δpiδpjδ2x
k′.下面以2D场景为例对这两项进行解算.
假设位姿变换参数为
p
⃗
=
(
t
x
,
t
y
,
ϕ
)
\vec{\mathbf{p}}=(t_{x},t_{y},\phi)
p
=(tx,ty,ϕ),待转换的点为
x
⃗
=
(
x
1
,
x
2
)
\vec{\mathbf{x}} = (x_{1}, x_{2})
x
=(x1,x2),则转换位姿变换方程如下:
则
δ
x
⃗
k
′
δ
p
i
\frac{\delta\vec{\mathbf{x}}_{k}^{'}}{\delta\mathbf{p}_{i}}
δpiδx
k′结果为:
δ
2
x
⃗
k
′
δ
p
i
δ
p
j
\frac{\delta^{2}\vec{\mathbf{x}}_{k}^{'}}{\delta\mathbf{p}_{i}\delta\mathbf{p}_{j}}
δpiδpjδ2x
k′的结果为:
PCL实现(直接链接PCL库)
2D场景实现
3D场景实现
测试直接看官方demo吧,很简单.
NDT改进版本
改进1: 引入cpu多线程支持OpenMP
改进2: 搜索速度提升,提升策略如下
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK