总结:gicp引入了概率信息(使用协方差阵),提出了icp的统一模型,既可以解释点到点和点到面的icp,也在新模型理论的基础上,提出了一种面到面的icp。
论文原文:《Generalized-ICP》
gicp统一模型(Generalized-ICP)
在概率模型中假设存在配准中两个点集,
A
^
=
{
a
i
^
}
\hat{A}=\left\{\hat{a_{i}}\right\}
A^={ai^} and
B
^
=
{
b
i
^
}
\hat{B}=\left\{\hat{b_{i}}\right\}
B^={bi^},并且假设
A
A
A and
B
B
B 分别服从
a
i
∼
N
(
a
i
^
,
C
i
A
)
a_{i} \sim \mathcal{N}\left(\hat{a_{i}}, C_{i}^{A}\right)
ai∼N(ai^,CiA)and
b
i
∼
N
(
b
^
i
,
C
i
B
)
b_{i} \sim \mathcal{N}\left(\hat{b}_{i}, C_{i}^{B}\right)
bi∼N(b^i,CiB)正态分布.
{
C
i
A
}
\left\{C_{i}^{A}\right\}
{CiA} and
{
C
i
B
}
\left\{C_{i}^{B}\right\}
{CiB} 分别是点对应的协方差阵. 我们假设以及匹配完成,假设变换矩阵为
T
∗
\mathbf{T}^{*}
T∗, 因此:
b
^
i
=
T
∗
a
^
i
(1)
\hat{b}_{i}=\mathbf{T}^{*} \hat{a}_{i}\tag{1}
b^i=T∗a^i(1)
对于变换矩阵,
T
\mathbf{T}
T , 定义误差量
d
i
(
T
)
=
b
i
−
T
a
i
d_{i}^{(\mathbf{T})}= b_{i}-\mathbf{T} a_{i}
di(T)=bi−Tai, 因为假设
a
i
a_{i}
ai and
b
i
b_{i}
bi 服从正态分布(NDT也是假设服从正态分布), 因此
d
i
(
T
∗
)
d_{i}^{\left(\mathrm{T}^{*}\right)}
di(T∗) 也服从正态分布:
d
i
(
T
∗
)
∼
N
(
b
^
i
−
(
T
∗
)
a
^
i
,
C
i
B
+
(
T
∗
)
C
i
A
(
T
∗
)
T
)
=
N
(
0
,
C
i
B
+
(
T
∗
)
C
i
A
(
T
∗
)
T
)
(2)
\begin{aligned} d_{i}^{\left(\mathbf{T}^{*}\right)} & \sim \mathcal{N}\left(\hat{b}_{i}-\left(\mathbf{T}^{*}\right) \hat{a}_{i}, C_{i}^{B}+\left(\mathbf{T}^{*}\right) C_{i}^{A}\left(\mathbf{T}^{*}\right)^{T}\right) \\ &=\mathcal{N}\left(0, C_{i}^{B}+\left(\mathbf{T}^{*}\right) C_{i}^{A}\left(\mathbf{T}^{*}\right)^{T}\right) \end{aligned}\tag{2}
di(T∗)∼N(b^i−(T∗)a^i,CiB+(T∗)CiA(T∗)T)=N(0,CiB+(T∗)CiA(T∗)T)(2)
使用最大似然估计( MLE)计算
T
\mathbf{T}
T :
T
=
argmax
T
∏
i
p
(
d
i
(
T
)
)
=
argmax
T
∑
i
log
(
p
(
d
i
(
T
)
)
)
(3)
\mathbf{T}=\underset{\mathbf{T}}{\operatorname{argmax}} \prod_{i} p\left(d_{i}^{(\mathrm{T})}\right)=\underset{\mathbf{T}}{\operatorname{argmax}} \sum_{i} \log \left(p\left(d_{i}^{(\mathrm{T})}\right)\right)\tag{3}
T=Targmaxi∏p(di(T))=Targmaxi∑log(p(di(T)))(3)
进一步简化为:(这里从最大似然估计推导,具体过程需要研究)
T
=
argmin
T
∑
i
d
i
(
T
)
T
(
C
i
B
+
T
C
i
A
T
T
)
−
1
d
i
(
T
)
(4)
\mathbf{T}=\underset{\mathrm{T}}{\operatorname{argmin}} \sum_{i} d_{i}^{(\mathbf{T})^{T}}\left(C_{i}^{B}+\mathbf{T} C_{i}^{A} \mathbf{T}^{T}\right)^{-1} d_{i}^{(\mathbf{T})}\tag{4}
T=Targmini∑di(T)T(CiB+TCiATT)−1di(T)(4)
当:
C
i
B
=
I
C
i
A
=
0
(5)
C_{i}^{B} = I \\ C_{i}^{A} = 0\tag{5}
CiB=ICiA=0(5)
就得到标准ICP:
T
=
argmin
T
∑
i
d
i
(
T
)
T
d
i
(
T
)
=
argmin
T
∑
i
∥
d
i
(
T
)
∥
2
(6)
\begin{aligned} \mathbf{T} &=\underset{\mathbf{T}}{\operatorname{argmin}} \sum_{i} d_{i}^{(\mathrm{T})^{T}} d_{i}^{(\mathrm{T})} \\ &=\underset{\mathbf{T}}{\operatorname{argmin}} \sum_{i}\left\|d_{i}^{(\mathrm{T})}\right\|^{2} \end{aligned}\tag{6}
T=Targmini∑di(T)Tdi(T)=Targmini∑∥∥∥di(T)∥∥∥2(6)
当:
C
i
B
=
P
i
−
1
C
i
A
=
0
(7)
\begin{aligned} C_{i}^{B} &=\mathbf{P}_{\mathbf{i}}^{-1} \\ C_{i}^{A} &=0 \end{aligned}\tag{7}
CiBCiA=Pi−1=0(7)
得到点到面的ICP:
T
=
argmin
T
{
∑
i
∥
P
i
⋅
d
i
∥
2
}
(8)
\mathbf{T}=\underset{\mathbf{T}}{\operatorname{argmin}}\left\{\sum_{i}\left\|\mathbf{P}_{\mathbf{i}} \cdot d_{i}\right\|^{2}\right\}\tag{8}
T=Targmin{i∑∥Pi⋅di∥2}(8)
plane to plane ICP(gicp:相对于点到点和点到面加入概率模型(协方差阵))
点到平面算法的做法是,假设点云具有平面特征,这意味着在3D空间处理采样2D流形。
由于现实世界的曲面至少是分段可微的,我们可以假设我们的数据集是局部平面的。此外,由于我们从两个不同的角度对流形进行采样,因此通常不会对完全相同的点进行采样(即,对应关系永远不会是精确的)。
本质上,每个测量点仅提供沿其曲面法线的约束。为了对这种结构进行建模,我们考虑每个采样点沿其局部平面以高协方差分布,而在曲面法线方向(垂直于平面方向)以极低协方差分布(即点云分布在局部平面上)。假设局部拟合平面上某一点的法向量e1是沿X轴的,链接1,则该点协方差矩阵变为:
(
ϵ
0
0
0
1
0
0
0
1
)
(9)
\left(\begin{array}{lll} \epsilon & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right)\tag{9}
⎝⎛ϵ00010001⎠⎞(9)
ϵ
\epsilon
ϵ是沿着法线方向极小的常数。
因为实际上法向量并不一定是沿x轴方向,所以需要进行坐标转换。假设
b
i
,
a
i
b_i,a_i
bi,ai对应的法向量分别为
u
i
,
v
i
u_i,v_i
ui,vi,则它们对应的协方差阵为:
C
i
B
=
R
μ
i
⋅
(
ϵ
0
0
0
1
0
0
0
1
)
⋅
R
μ
i
T
C
i
A
=
R
ν
i
⋅
(
ϵ
0
0
0
1
0
0
0
1
)
⋅
R
ν
i
T
\begin{array}{l} C_{i}^{B}=\mathbf{R}_{\mu_{i}} \cdot\left(\begin{array}{ccc} \epsilon & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right) \cdot \mathbf{R}_{\mu_{i}}^{T} \\ C_{i}^{A}=\mathbf{R}_{\nu_{i}} \cdot\left(\begin{array}{ccc} \epsilon & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{array}\right) \cdot \mathbf{R}_{\nu_{i}}^{T} \end{array}
CiB=Rμi⋅⎝⎛ϵ00010001⎠⎞⋅RμiTCiA=Rνi⋅⎝⎛ϵ00010001⎠⎞⋅RνiT
R
ν
i
\mathbf{R}_{\nu_{i}}
Rνi为e1到vi旋转矩阵。
上述协方差计算过程可以表述如下图,链接2:文章来源:https://www.toymoban.com/news/detail-803385.html
确定协方差阵后利用公式(4)即为plane to plane ICP或者叫GICP。
这里其实就是怎么确定协方差阵。
显然可以通过pca计算协方差阵(代替上述求解过程):
C
=
1
N
⋅
∑
i
=
1
N
⋅
(
p
i
−
p
ˉ
)
⋅
(
p
i
−
p
ˉ
)
T
C=\frac{1}{N} \cdot \sum_{i=1}^{N} \cdot\left(p_{i}-\bar{p}\right) \cdot\left(p_{i}-\bar{p}\right)^{T}
C=N1⋅i=1∑N⋅(pi−pˉ)⋅(pi−pˉ)T
pca求解时要注意公式(4)对协方差有个求逆过程,需要注意当协方差阵奇异时,用微小量替代0值(类似NDT中处理方式)。文章来源地址https://www.toymoban.com/news/detail-803385.html
PCL中GICP代码应用
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/registration/gicp.h>
int gicp(const pcl::PointCloud<pcl::PointXYZ>::Ptr src_cloud,
const pcl::PointCloud<pcl::PointXYZ>::Ptr tgt_cloud,
pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_source)
{
pcl::GeneralizedIterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> gicp;
gicp.setInputSource(src_cloud);
gicp.setInputTarget(tgt_cloud);
//gicp.setMaximumIterations(max_iter);
gicp.align(*transformed_source);
return 1;
}
到了这里,关于点云配准--gicp原理与其在pcl中的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!