赞
踩
SLAM作为机器人和自动驾驶领域的核心问题之一,其目标是在未知环境中实现同时的定位和地图构建。其中在求解多观测约束下的位姿估计问题时,GN和LM算法在求解非线性最小二乘问题方面扮演了重要的角色。为嘛呢?因为这俩思想非常简单实用。博主个人认为,这两种方法的一个共同的优点是快,简单,准确度可以接受。接下来,让我们从一个SLAMer的角度看待GN和LM算法。注意,本篇不涉及代码编程和复杂的理论说明,仅有公式推导,旨在用白话来讨论GN和LM算法。如有逻辑上的不严谨,欢迎各位批评指证。
一个SLAM问题通常可以被描述为一个最大后验概率问题,也叫MAP(Maximum )问题, 即我们想根据历史时刻已观测到的数据
z
z
z和状态
x
x
x,以及控制量
u
u
u,得到最有可能的下一时刻的状态
x
t
+
1
x_{t+1}
xt+1(因为SLAM的核心本质是Localization嘛),用公式来描述就是
x
t
+
1
=
a
r
g
m
a
x
x
P
(
x
t
+
1
∣
z
0
:
t
,
x
0
:
t
,
u
0
:
t
)
x_{t+1} = \underset{x}{argmax} P(x_{t+1}|z_{0:t}, x_{0:t},u_{0:t})
xt+1=xargmaxP(xt+1∣z0:t,x0:t,u0:t)
这其实是一个很抽象的描述公式,因为我们能通过公式看到SLAM问题的目的是什么,但是我们无法找到一个具体的代入方法和求解方法。并且,求解MAP问题本身是一个比较复杂的问题,求解方法也有很多种,比如 粒子滤波,卡尔曼滤波等等。而本章所说的非线性优化,也是求解MAP问题的一个有效的途径。
我们以一个纯激光SLAM为例,激光雷达带来的是一系列的点云,我们可以把每一个点都看作是一次对环境的观测,对一个SLAM(或者是Localization)问题,最重要的是要推算出雷达的当前位置
x
t
L
\mathbf{x}^{L}_{t}
xtL,而且我们还知道在一个3维空间下的刚性变换
T
\mathbf{T}
T可以用旋转矩阵
R
\mathbf{R}
R和平移向量
t
\mathbf{t}
t来表示,那么我们可以将雷达的当前位置表示为
x t L = ∏ i = 0 t − 1 △ T i ⋅ x 0 L \mathbf{x}^{L}_{t} = \prod_{i=0}^{t-1} \mathbf{\bigtriangleup T}_{i} \cdot \mathbf{x}^{L}_{0} xtL=i=0∏t−1△Ti⋅x0L
用大白话讲,雷达当前的位置相当于对雷达初始位置
x
0
L
\mathbf{x}^{L}_{0}
x0L逐步进行变换
△
T
i
\mathbf{\bigtriangleup T}_{i}
△Ti即可,那么我们的问题就转换为如何求取
△
T
i
\mathbf{\bigtriangleup T}_{i}
△Ti。
现在我们假设,经过一个刚性变换
T
\mathbf{T}
T的前后两帧雷达点云分别为
P
A
=
{
p
i
A
}
P_{A}=\{ p^{A}_{i} \}
PA={piA}和
P
B
=
{
p
j
}
\mathcal{P}_{B}=\{ \mathbf{p}_{j} \}
PB={pj},并我们在不考虑噪声和异常点(outlier)的前提下,这两坨点云理应满足
P
B
=
T
P
A
∑
∣
∣
p
j
B
−
T
p
i
A
∣
∣
2
=
0
这两个式子意思就是,变换前的雷达帧历经一次刚性变换
T
\mathbf{T}
T后,应该与变换后的点云完全重合(在点的对应关系已知的情况下)。But!这只是一个非常理想的情况,现实情境下,是不可以忽略噪声和异常点的!
OK,那么我们现在将这些因素考虑进去。假设我们给每个点加一个高斯白噪声,即 p i ∼ N ( p i , Σ i ) \mathbf{p}_{i}\sim N(\mathbf{p}_{i}, \mathbf{\Sigma}_{i}) pi∼N(pi,Σi), 这里由于一个点可做是一个3维向量,因此每个点服从一个多维高斯分布。也就是每个点的位置分布情况是涉及到一个概率的,我们知道高斯分布有个优雅的性质,多个独立的高斯分布的线性组合依旧是高斯分布,那么我们可以推出
(
p
j
B
−
T
p
i
A
)
∼
N
(
d
i
j
,
Σ
j
+
T
T
Σ
i
T
)
(\mathbf{p}^{B}_{j} - \mathbf{T} \mathbf{p}^{A}_{i}) \sim N(\mathbf{d}_{ij}, \mathbf{\Sigma}_{j} + \mathbf{T}^{T} \mathbf{\Sigma}_{i} \mathbf{T})
(pjB−TpiA)∼N(dij,Σj+TTΣiT)
哎!?这个好,这个公式看起来很优雅,这时我们就在想,如果每个点之间都是独立的,这个
T
\mathbf{T}
T只要能让每个点对的差值
d
i
j
\mathbf{d}_{ij}
dij为0的联合概率最大不就完了么!!吆西,那么说做就做,我们得到下面这个式子
T
=
a
r
g
m
a
x
T
∏
P
(
p
j
B
−
T
p
i
A
)
=
l
o
g
a
r
g
m
i
n
T
∑
d
i
j
T
(
Σ
j
+
T
T
Σ
i
T
)
−
1
d
i
j
=
a
r
g
m
i
n
T
∑
d
i
j
T
(
Σ
i
j
)
−
1
d
i
j
解释一下,公式(1)表示的是联合概率最大化,但是求积操作不好算,况且高斯分布里含有指数
e
x
p
(
⋅
)
exp(\cdot)
exp(⋅),所以在这里两边取对数操作来去掉指数和常数项,化积为和。最终化简出来的公式(3)正式描述了一个非线性最小二乘问题,也是ICP配准问题的核心公式。
现在我们换一个思路来理解上面公式(3)并且将里面的符号转换成一个易于理解的形式。众所周知,最小二乘问题的本质思想是:让真实值与理论值的差距之和(即残差)最小。从这个思路出发,我们可以发现,公式(3)中的
d
i
j
T
d
i
j
\mathbf{d}_{ij}^{T}\mathbf{d}_{ij}
dijTdij其实就是最小二乘中的残差项,而
(
Σ
i
j
)
−
1
(\mathbf{\Sigma}_{ij})^{-1}
(Σij)−1只不过是给每一个残差项成了一个权重系数,因此博主习惯把
(
Σ
i
j
)
−
1
(\mathbf{\Sigma}_{ij})^{-1}
(Σij)−1称为权重矩阵(当然这个矩阵的名号很多,比如说信息矩阵,马氏距离…)。这个如果点对的协方差越小,代表对位置的信任程度,就越高,自然权重就越大。OK,这样一个针对非线性优化的最小二乘问题就描述完了! 下面呢,为了便于理解,我们还是用
e
i
j
\mathbf{e}_{ij}
eij表示残差,用
Ω
i
j
\mathbf{\Omega}_{ij}
Ωij表示权重矩阵(信息矩阵),即
T
=
a
r
g
m
i
n
T
∑
e
i
j
T
Ω
i
j
e
i
j
(
L
S
Q
)
\mathbf{T} = \underset{\mathbf{T} }{argmin} \sum \mathbf{e}_{ij}^{T}\mathbf{\Omega }_{ij} \mathbf{e}_{ij} \quad\ \ \ (LSQ)
T=Targmin∑eijTΩijeij (LSQ)
我们现在有要解决的目标优化问题,那么该如何求解呢,梯度下降法教会了我们通过迭代求解最小值时,要往梯度(导数)下降最大的方向走,但是如何求梯度呢?这个时候高斯牛顿法对此有了新的方案。
话不多说,我们开始进入正题(原谅博主废话过多),第1章中每一个残差项可以看作是一个关于
p
A
\mathbf{p}^{A}
pA的函数(因为我们是想让通过调整
P
A
\mathbf{P}_{A}
PA来对齐
P
B
\mathbf{P}_{B}
PB),以下简称
e
(
p
)
\mathbf{e}(\mathbf{p})
e(p)。现在我们对
e
(
p
)
\mathbf{e}(\mathbf{p})
e(p)在
p
\mathbf{p}
p附近进行一阶泰勒展开。
e
(
p
+
Δ
p
)
=
e
(
p
)
+
J
(
p
)
Δ
p
(
T
a
y
l
o
r
)
\mathbf{e}(\mathbf{p}+\Delta\mathbf{p}) = \mathbf{e}(\mathbf{p}) + \mathbf{J} (\mathbf{p})\Delta\mathbf{p} \quad \ \ \ \ (Taylor)
e(p+Δp)=e(p)+J(p)Δp (Taylor)
这里的
J
(
p
)
=
d
e
(
p
)
d
p
\mathbf{J} (\mathbf{p})=\frac{d \mathbf{e} (\mathbf{p} )}{d\mathbf{p} }
J(p)=dpde(p) ,也就是江湖上令人闻风丧胆的雅可比矩阵(Jacobian Matrix),为啥闻风丧胆?且看后续推导,现在我们只需要假设已知
J
(
p
)
\mathbf{J} (\mathbf{p})
J(p)就好啦。
这里需要说明两点:
- 泰勒的意义是什么,在G-N优化中,我们并不是直接求两坨点云之间的变换 T \mathbf{T} T,而是通过迭代求解,每次迭代会寻找一个的增量 Δ T \Delta\mathbf{T} ΔT,使得 ∑ e k T ( Δ T p k ) Ω k e k ( Δ T p k ) \sum \mathbf{e}_{k}^{T}(\Delta\mathbf{T}\mathbf{p}_{k})\mathbf{\Omega }_{k} \mathbf{e}_{k}(\Delta\mathbf{T}\mathbf{p}_{k}) ∑ekT(ΔTpk)Ωkek(ΔTpk)尽可能的小
- 符号的说明,有人就要怼我了,怎么还一会用 Δ T p \Delta\mathbf{T}\mathbf{p} ΔTp,一会用 p + Δ p \mathbf{p}+\Delta\mathbf{p} p+Δp。其实这里两个表示方法是同一个意思,都表示为对一个点做一次刚性变换,只不过在推导数学公式时,我们可能更习惯使用求和而已。
这里我们旨在求解每次迭代过程中的最优
Δ
p
\Delta \mathbf{p}
Δp即可, 我们将上面泰勒展开式子代入到公式(LSQ)中,并进行推导
△
p
=
a
r
g
m
i
n
△
p
∑
e
k
T
(
p
+
△
p
)
Ω
k
e
k
(
p
+
△
p
)
=
a
r
g
m
i
n
△
p
∑
[
e
k
(
p
)
+
J
k
(
p
)
Δ
p
]
T
Ω
k
[
e
k
(
p
)
+
J
k
(
p
)
Δ
p
]
=
a
r
g
m
i
n
△
p
∑
(
e
k
T
Ω
k
e
k
+
e
k
T
Ω
k
J
k
△
p
+
△
p
T
J
k
T
Ω
k
e
k
+
△
p
T
J
k
T
Ω
k
J
k
△
p
)
=
a
r
g
m
i
n
△
p
∑
(
e
k
T
Ω
k
e
k
⏟
常数项
+
2
⋅
△
p
T
J
k
T
Ω
k
e
k
+
△
p
T
J
k
T
Ω
k
J
k
△
p
)
=
a
r
g
m
i
n
△
p
∑
(
2
⋅
△
p
T
J
k
T
Ω
k
e
k
+
△
p
T
J
k
T
Ω
k
J
k
△
p
)
=
a
r
g
m
i
n
△
p
[
2
△
p
T
⋅
∑
J
k
T
Ω
k
e
k
+
△
p
T
⋅
∑
J
k
T
Ω
k
J
k
⋅
△
p
)
]
其中,博主为了简化表示,将
e
k
(
p
)
\mathbf{e}_{k}(\mathbf{p})
ek(p)简化为
e
k
\mathbf{e}_{k}
ek,得到的公式(9)非常重要,它表明,该目标优化问题是一个关于
Δ
p
\Delta\mathbf{p}
Δp的二次型问题!这个发现很重要,决定了优化求解的稳定性。
接下来,这里我们计算公式(9)中的目标函数关于
Δ
p
\Delta \mathbf{p}
Δp的导数,可以得到
[
2
△
p
T
⋅
∑
J
k
T
Ω
k
e
k
+
△
p
T
⋅
∑
J
k
T
Ω
k
J
k
⋅
△
p
)
]
′
=
2
∑
J
k
T
Ω
k
e
k
+
2
∑
J
k
T
Ω
k
J
k
⋅
△
p
令其导数
2
∑
J
k
T
Ω
k
e
k
+
2
∑
J
k
T
Ω
k
J
k
⋅
△
p
=
0
2\sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{e}_{k} +2\sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{J}_{k} \cdot \mathbf{\bigtriangleup p} = 0
2∑JkTΩkek+2∑JkTΩkJk⋅△p=0,我们可以得到
2
∑
J
k
T
Ω
k
J
k
⋅
△
p
+
2
∑
J
k
T
Ω
k
e
k
=
0
2\sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{J}_{k} \cdot \mathbf{\bigtriangleup p} + 2\sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{e}_{k} = 0
2∑JkTΩkJk⋅△p+2∑JkTΩkek=0
可能你还觉得不够面熟,我们找个符号代替一下:
H
△
p
−
g
=
0
(
G
N
中的增量方程)
w
h
e
r
e
,
H
=
∑
J
k
T
Ω
k
J
k
,
g
=
−
∑
J
k
T
Ω
k
e
k
这样就熟悉多了,这不就是在线性代数课上学的线性方程求解问题么。没错是的,我们通过化简最终将优化问题转化为一个求解线性方程的问题,怎么求解,这个就不用多说了。这里的
H
\mathbf{H}
H,通常被称为海森矩阵(Hessian Matrix),而且海森矩阵
H
\mathbf{H}
H要求必须是正定矩阵,上述的化简才是有意义的,为啥嘞?我们能够看到这个线性方程的导数就是
H
\mathbf{H}
H(目标函数的二阶导数),我们知道只有当一阶导数为0,二阶导数>0时(
H
\mathbf{H}
H为正定矩阵),我们求出来的才是严格意义上的最小值点。当然这只是一次迭代所求解的变换
Δ
T
\Delta \mathbf{T}
ΔT,多次迭代收敛后,我们就可以得到完整的刚性变换
T
=
∏
Δ
T
\mathbf{T} = \prod \Delta \mathbf{T}
T=∏ΔT。
综上所述,给读者朋友们找了(实则网上扒
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。