引言部分(废话)
SLAM作为机器人和自动驾驶领域的核心问题之一,其目标是在未知环境中实现同时的定位和地图构建。其中在求解多观测约束下的位姿估计问题时,GN和LM算法在求解非线性最小二乘问题方面扮演了重要的角色。为嘛呢?因为这俩思想非常简单实用。博主个人认为,这两种方法的一个共同的优点是快,简单,准确度可以接受。接下来,让我们从一个SLAMer的角度看待GN和LM算法。注意,本篇不涉及代码编程和复杂的理论说明,仅有公式推导,旨在用白话来讨论GN和LM算法。如有逻辑上的不严谨,欢迎各位批评指证。
1. 一个非线性优化问题的建模
一个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
\begin{matrix} \mathcal{P}_{B}= \mathbf{T}\mathcal{P}_{A} \\\\ \sum ||\mathbf{p}^{B}_{j} - \mathbf{T} \mathbf{p}^{A}_{i}||_{2} = 0\end{matrix}
PB=TPA∑∣∣pjB−TpiA∣∣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
\begin{align} \mathbf{T} & = \underset{\mathbf{T} }{argmax} \prod P(\mathbf{p}^{B}_{j} - \mathbf{T} \mathbf{p}^{A}_{i})\\ & \overset{log}{=} \underset{\mathbf{T} }{argmin} \sum \mathbf{d}_{ij}^{T}(\mathbf{\Sigma}_{j} + \mathbf{T}^{T} \mathbf{\Sigma}_{i} \mathbf{T})^{-1} \mathbf{d}_{ij}\\ & = {\color{Red} \underset{\mathbf{T} }{argmin} \sum \mathbf{d}_{ij}^{T}(\mathbf{\Sigma}_{ij})^{-1} \mathbf{d}_{ij}} \end{align}
T=Targmax∏P(pjB−TpiA)=logTargmin∑dijT(Σj+TTΣiT)−1dij=Targmin∑dijT(Σij)−1dij
解释一下,公式(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)
2. 高斯牛顿优化算法(Gauss-Newton)
我们现在有要解决的目标优化问题,那么该如何求解呢,梯度下降法教会了我们通过迭代求解最小值时,要往梯度(导数)下降最大的方向走,但是如何求梯度呢?这个时候高斯牛顿法对此有了新的方案。
话不多说,我们开始进入正题(原谅博主废话过多),第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
)
]
\begin{align} \bigtriangleup \mathbf{p} & = \underset{\mathbf{\bigtriangleup p} }{argmin} \sum \mathbf{e}_{k}^{T}(\mathbf{p} +\mathbf{\bigtriangleup p} )\mathbf{\Omega }_{k} \mathbf{e}_{k}(\mathbf{p} +\mathbf{\bigtriangleup p}) \\ & = \underset{\mathbf{\bigtriangleup p} }{argmin} \sum [\mathbf{e}_{k}(\mathbf{p}) + \mathbf{J}_{k} (\mathbf{p})\Delta\mathbf{p}]^{T} \mathbf{\Omega }_{k} [\mathbf{e}_{k}(\mathbf{p}) + \mathbf{J}_{k} (\mathbf{p})\Delta\mathbf{p}] \\ & = \underset{\mathbf{\bigtriangleup p} }{argmin} \sum (\mathbf{e}_{k}^{T}\Omega_{k}\mathbf{e}_{k} +\mathbf{e}_{k}^{T}\Omega_{k}\mathbf{J}_{k}\mathbf{\bigtriangleup p} + \mathbf{\bigtriangleup p}^{T}\mathbf{J}_{k}^{T}\Omega_{k}\mathbf{e}_{k}+\mathbf{\bigtriangleup p}^{T}\mathbf{J}_{k}^{T}\Omega_{k}\mathbf{J}_{k}\mathbf{\bigtriangleup p}) \\ & = \underset{\mathbf{\bigtriangleup p} }{argmin} \sum (\underbrace{\mathbf{e}_{k}^{T}\Omega_{k}\mathbf{e}_{k}}_{常数项} +2\cdot \mathbf{\bigtriangleup p}^{T}\mathbf{J}_{k}^{T}\Omega_{k}\mathbf{e}_{k}+\mathbf{\bigtriangleup p}^{T}\mathbf{J}_{k}^{T}\Omega_{k}\mathbf{J}_{k}\mathbf{\bigtriangleup p}) \\ & = \underset{\mathbf{\bigtriangleup p} }{argmin} \sum (2\cdot \mathbf{\bigtriangleup p}^{T}\mathbf{J}_{k}^{T}\Omega_{k}\mathbf{e}_{k}+\mathbf{\bigtriangleup p}^{T}\mathbf{J}_{k}^{T}\Omega_{k}\mathbf{J}_{k}\mathbf{\bigtriangleup p}) \\ & = \underset{\mathbf{\bigtriangleup p} }{argmin} [2 \mathbf{\bigtriangleup p}^{T}\cdot \sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{e}_{k}+\mathbf{\bigtriangleup p}^{T}\cdot \sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{J}_{k} \cdot \mathbf{\bigtriangleup p})] \\ \end{align}
△p=△pargmin∑ekT(p+△p)Ωkek(p+△p)=△pargmin∑[ek(p)+Jk(p)Δp]TΩk[ek(p)+Jk(p)Δp]=△pargmin∑(ekTΩkek+ekTΩkJk△p+△pTJkTΩkek+△pTJkTΩkJk△p)=△pargmin∑(常数项
ekTΩkek+2⋅△pTJkTΩkek+△pTJkTΩkJk△p)=△pargmin∑(2⋅△pTJkTΩkek+△pTJkTΩkJk△p)=△pargmin[2△pT⋅∑JkTΩkek+△pT⋅∑JkTΩkJk⋅△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
\begin{matrix}& [2 \mathbf{\bigtriangleup p}^{T}\cdot \sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{e}_{k}+\mathbf{\bigtriangleup p}^{T}\cdot \sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{J}_{k} \cdot \mathbf{\bigtriangleup p})]^{\prime } \\ \\ & = 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}\end{matrix}
[2△pT⋅∑JkTΩkek+△pT⋅∑JkTΩkJk⋅△p)]′=2∑JkTΩkek+2∑JkTΩkJk⋅△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
\begin{matrix} & \mathbf{H}\mathbf{\bigtriangleup p}-\mathbf{g} = \mathbf{0} \quad (GN中的增量方程) \\ where,\\ & \mathbf{H} = \sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{J}_{k},\\\\ & \mathbf{g} = -\sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{e}_{k}\end{matrix}
where,H△p−g=0(GN中的增量方程)H=∑JkTΩkJk,g=−∑JkTΩkek
这样就熟悉多了,这不就是在线性代数课上学的线性方程求解问题么。没错是的,我们通过化简最终将优化问题转化为一个求解线性方程的问题,怎么求解,这个就不用多说了。这里的
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。
综上所述,给读者朋友们找了(实则网上扒 😏)一个简单的算法流程:
3. 列文伯格-马夸尔特优化算法(Levenberg-Marquadt,LM)
我们在第2章逐步推导了GN算法,并且我们得到了其精髓:
- 优化问题的求解——>线性方程组的求解问题
- 海森矩阵的近似: H = ∑ J k T Ω k J k \mathbf{H} = \sum \mathbf{J}_{k}^{T}\Omega_{k}\mathbf{J}_{k} H=∑JkTΩkJk,即二阶导数可以用一阶导数近似
不难看出, GN算法通过在
p
\mathbf{p}
p附近进行一阶泰勒展开来简化计算,但这有个前提,那就是
Δ
p
\Delta \mathbf{p}
Δp不能太大,否则近似效果很差(因为
H
\mathbf{H}
H不一定总是正定的,有可能是半正定的)。用数学的语言来说,
Δ
p
\Delta \mathbf{p}
Δp是有一个置信区间的,只有在这个区间里面,我们才能信任它。这就给求解线性方程带来了很大的困扰,本来想着这个变换步长简单易求,但没想到这个步长长度不好把握,步长太短则老太太裹脚,步长太长则小鹿乱撞。
于是人们对GN算法作了进一步修正。所用的技巧是把一个绝对正定对角矩阵加到
H
\mathbf{H}
H上去 ,改变原矩阵的特征值结构 ,使其变成较好的对称正定矩阵。因此LM中的增量方程为:
(
H
+
λ
I
)
Δ
p
=
g
(
L
M
中的增量方程)
(\mathbf{H} +\lambda \mathbf{I} )\Delta p = \mathbf{g} \quad (LM中的增量方程)
(H+λI)Δp=g(LM中的增量方程)
其中,
λ
\lambda
λ是一个正实数
λ
>
0
\lambda > 0
λ>0,
I
\mathbf{I}
I是一个单位矩阵。哎?这么一操作,发现了一些有趣的事情:
- 当 λ = 0 \lambda = 0 λ=0 时,那LM算法就变成了GN算法了
- 当 λ → ∞ \lambda \to \infty λ→∞时,我们把 Δ p \Delta \mathbf{p} Δp显式写出来,可以看到LM算法就变成了梯度下降法
- 当 0 < λ < ∞ 0< \lambda < \infty 0<λ<∞时,LM算法的迭代步长介于GN算法与梯度下降法之间。
这样我们可以看出LM优化通过在增量方程中增加一个拉格朗日乘子 λ \lambda λ来改善GN方法,避免由于 Δ p \Delta \mathbf{p} Δp过大,优化解质量不稳定的问题。在一次迭代中, H \mathbf{H} H和 g \mathbf{g} g是不变的,如果我们发觉解出的 Δ p \Delta \mathbf{p} Δp过大,就适当调大 λ \lambda λ,并重新计算增量方程,以获得相对小一些的 Δ p \Delta \mathbf{p} Δp;反过来,如果发觉解出的 Δ p \Delta \mathbf{p} Δp在合理的范围内,则适当减小 λ \lambda λ,减小后的 λ \lambda λ将用于下次迭代,相当于允许下次迭代时 Δ p \Delta \mathbf{p} Δp有更大的取值,以尽可能地加快收敛速度。通过这样的调控,LM算法即保证了收敛的稳定性,又加快了收敛速度。一切都很nice!
不过还有一个问题,我们如何判断 Δ p \Delta \mathbf{p} Δp是否是合理的呢?
我们可以定义一个总体的loss,来判断 Δ p \Delta \mathbf{p} Δp的好坏,对于公式(3)这样一个优化问题来说,一般 l o s s = ∑ d i j loss = \sum \mathbf{d}_{ij} loss=∑dij,我们优化的目标当然是让loss最小。如果加上 Δ p \Delta \mathbf{p} Δp后loss反而增大了,就证明 Δ p \Delta \mathbf{p} Δp超出了置信区间,我们需要调大 λ \lambda λ,重新计算增量 Δ p \Delta \mathbf{p} Δp;如果loss变小,证明 Δ p \Delta \mathbf{p} Δp在合理区间内,调小 λ \lambda λ,算法继续。
综上所述,LM算法的流程如下:
参考博客
视觉SLAM笔记–第4篇: 高斯牛顿法(GN)和列文伯格-马夸特算法(LM)
书籍:《视觉slam十四讲》,《最优化理论与算法》第二版