引言
ISAM的全称为增量式平滑和建图(Incremental Smoothing and Mapping),它是一种用于SLAM问题的非线性优化算法,与常见的高斯牛顿法、LM等非线性优化算法不同,ISAM可以增量式的求解非线性优化问题。目前有ISAM1和ISAM2两个版本,这个两个版本的主要区别在于做重新线性化(relinearization)的时机不同。ISAM1只支持周期性重新线性化而ISAM2则会通过贝叶斯树自动判断重新线性化的时机,该机制比较复杂,后续会再写一篇博客专门讲解ISAM2重新线性化的机制。本篇博客主要讲解ISAM1,下面我们将详细讲解一下ISAM中增量式到底是怎么实现的。
一、SLAM中的非线性最小二乘问题
第一步: 我们对SLAM中的最小二乘问题建模:
假设运动方程为和观测方程如下所示:
运动方程:
x
i
=
f
i
(
x
i
−
1
,
u
i
)
+
w
i
x_i = f_i(x_{i-1}, u_i) + w_i
xi=fi(xi−1,ui)+wi 观测方程:
z
k
=
h
k
(
x
i
k
,
l
j
k
)
+
v
k
z_k = h_k(x_{i_k}, l_{j_k}) + v_k
zk=hk(xik,ljk)+vk
第二步: 那么对应的最小二乘问题则如下所示:
X
∗
,
L
∗
=
arg min
X
,
L
∑
i
=
1
M
∣
∣
f
i
(
x
i
−
1
,
u
i
)
−
x
i
∣
∣
Λ
2
+
∑
i
=
1
K
∣
∣
h
k
(
X
i
k
,
I
j
k
)
−
z
k
∣
∣
Γ
2
X^{*}, L^{*} = \argmin_{X,L} \sum_{i = 1} ^{M} ||f_i(x_{i-1}, u_i) - x_i||^{2}_{\Lambda} + \sum_{i = 1} ^{K}||h_k(X_{i_k}, I_{j_k}) - z_k||_{\Gamma}^2
X∗,L∗=X,Largmini=1∑M∣∣fi(xi−1,ui)−xi∣∣Λ2+i=1∑K∣∣hk(Xik,Ijk)−zk∣∣Γ2
第三步:对上述运动方程的残差进行线性化(一阶泰勒展开)有:
f
i
(
x
i
−
1
,
u
i
)
−
x
i
≈
{
f
i
(
x
i
−
1
0
,
u
i
)
+
F
i
i
−
1
δ
x
i
−
1
}
−
{
x
i
0
+
δ
x
i
}
=
{
F
i
i
−
1
δ
x
i
−
1
−
δ
x
i
}
−
a
i
\begin{aligned} f_i(x_{i - 1}, u_i) - x_i & \approx \{f_i(x_{i-1}^0, u_i) + F_i^{i - 1}\delta x_{i-1}\} - \{ x_i^0 + \delta x_i \} \\ & = \{F_i^{i-1} \delta x_{i-1} - \delta x_i \} -a_i \end{aligned}
fi(xi−1,ui)−xi≈{fi(xi−10,ui)+Fii−1δxi−1}−{xi0+δxi}={Fii−1δxi−1−δxi}−ai
其中
F
i
i
−
1
:
=
∂
f
i
(
x
i
−
1
,
u
i
)
∂
x
i
−
1
∣
x
i
−
1
0
F_i^{i-1} :=\left. \frac{ \partial f_i(x_{i-1}, u_i) } {\partial x_{i-1}} \right|_{x_{i-1}^0}
Fii−1:=∂xi−1∂fi(xi−1,ui)
xi−10
a
i
=
x
i
0
−
f
i
(
x
i
−
1
0
,
u
i
)
a_i = x_i^0 - f_i(x_{i-1}^0, u_i)
ai=xi0−fi(xi−10,ui)
第四步:对上述观测方程的残差进行线性化(一阶泰勒展开)有:
h
k
(
x
i
k
,
l
j
k
)
−
z
k
≈
{
h
k
(
x
i
k
0
,
l
j
k
0
)
+
H
k
i
δ
x
i
k
+
J
k
j
δ
l
j
k
}
−
z
k
=
{
H
k
i
δ
x
i
k
+
J
k
j
δ
l
j
k
}
−
c
k
\begin{aligned} h_k(\mathbf{x}_{ik}, \mathbf{l}_{jk}) - \mathbf{z}_k & \approx \left\{ h_k(\mathbf{x}_{ik}^0, \mathbf{l}_{jk}^0) + H_k^i \delta \mathbf{x}_{ik} + J_k^j \delta \mathbf{l}_{jk} \right\} - \mathbf{z}_k \\ & = \left\{ H_k^i \delta \mathbf{x}_{ik} + J_k^j \delta \mathbf{l}_{jk} \right\} - \mathbf{c}_k \end{aligned}
hk(xik,ljk)−zk≈{hk(xik0,ljk0)+Hkiδxik+Jkjδljk}−zk={Hkiδxik+Jkjδljk}−ck
其中
H
k
i
k
:
=
∂
h
k
(
x
i
k
,
l
j
k
)
∂
x
i
k
∣
x
i
k
0
,
l
j
k
0
H_k^{ik} :=\left. \frac{ \partial h_k(x_{ik}, l_{jk}) } {\partial x_{ik}} \right|_{x_{ik}^0, l_{jk}^0}
Hkik:=∂xik∂hk(xik,ljk)
xik0,ljk0
J
k
j
k
:
=
∂
h
k
(
x
i
k
,
l
j
k
)
∂
l
j
k
∣
x
i
k
0
,
l
j
k
0
J_k^{jk} :=\left. \frac{ \partial h_k(x_{ik}, l_{jk}) } {\partial l_{jk}} \right|_{x_{ik}^0, l_{jk}^0}
Jkjk:=∂ljk∂hk(xik,ljk)
xik0,ljk0
c
k
=
z
k
−
h
k
(
x
i
k
0
,
l
j
k
0
)
c_k = z_k - h_k(x_{ik}^0, l_{jk}^0)
ck=zk−hk(xik0,ljk0)
第五步:那么最小二乘可化简为:
δ
θ
∗
=
arg min
δ
θ
∑
i
=
1
M
∣
∣
F
i
i
−
1
δ
x
i
−
1
+
G
i
i
δ
x
i
−
a
i
∣
∣
Λ
2
+
∑
i
=
1
K
∣
∣
H
k
i
k
δ
x
i
k
+
J
k
j
k
δ
l
j
k
−
c
k
∣
∣
Γ
2
\delta \theta ^ * = \argmin_{\delta \theta} \sum_{i = 1} ^{M} ||F_i^{i -1}\delta x_{i-1} + G_i^i \delta x_i - a_i||^{2}_{\Lambda} + \sum_{i = 1} ^{K}||H_k^{ik}\delta x_{ik} + J_k^{jk} \delta l_{jk} - c_k||_{\Gamma}^2
δθ∗=δθargmini=1∑M∣∣Fii−1δxi−1+Giiδxi−ai∣∣Λ2+i=1∑K∣∣Hkikδxik+Jkjkδljk−ck∣∣Γ2
第六步:将上述最小二乘写成矩阵形式,把雅可比矩阵放到矩阵
A
A
A中,把
a
i
a_i
ai和
c
k
c_k
ck放到向量
b
b
b中,那么最终的最小二乘形式如下:
δ
θ
∗
=
arg min
δ
θ
∣
∣
A
δ
θ
−
b
∣
∣
2
\delta \theta ^ * = \argmin_{\delta \theta} ||A\delta \theta - b||^2
δθ∗=δθargmin∣∣Aδθ−b∣∣2
二、通过QR分解求解上述最小二乘
对测量雅可比
A
A
A进行QR分解可得:
A
=
Q
[
R
0
]
A = Q \begin{bmatrix} R \\ 0 \end{bmatrix}
A=Q[R0]
注:这里的
R
R
R等于
A
T
A
A^TA
ATA的Cholesky分解的上三角矩阵。
将QR分解结果应用到上面的最小二乘中可得:
∥
A
θ
−
b
∥
2
=
∥
Q
[
R
0
]
θ
−
b
∥
2
=
∥
Q
T
[
R
0
]
θ
−
Q
T
b
∥
2
=
∥
[
R
0
]
θ
−
[
d
e
]
∥
2
=
∥
R
θ
−
d
∥
2
+
∥
e
∥
2
\begin{aligned} \| A \boldsymbol{\theta} - \boldsymbol{b} \|^2 & = \left\| Q \begin{bmatrix} R \\ 0 \end{bmatrix} \boldsymbol{\theta} - \boldsymbol{b} \right\|^2 \\ &= \left\| Q^T \begin{bmatrix} R \\ 0 \end{bmatrix} \boldsymbol{\theta} - Q^T \boldsymbol{b} \right\|^2 \\ &= \left\| \begin{bmatrix} R \\ 0 \end{bmatrix} \boldsymbol{\theta} - \begin{bmatrix} \boldsymbol{d} \\ \boldsymbol{e} \end{bmatrix} \right\|^2 \\ &= \| R \boldsymbol{\theta} - \boldsymbol{d} \|^2 + \| \boldsymbol{e} \|^2 \end{aligned}
∥Aθ−b∥2=
Q[R0]θ−b
2=
QT[R0]θ−QTb
2=
[R0]θ−[de]
2=∥Rθ−d∥2+∥e∥2
由此便可得到最小二乘解为:
R
θ
∗
=
d
R \boldsymbol{\theta}^* = \boldsymbol{d}
Rθ∗=d
这里由于
R
R
R是上三角矩阵,因此我们可通过从下往上的回代很快的求出
θ
∗
\boldsymbol{\theta}^*
θ∗
三、通过Givens旋转,增量式更新矩阵 R R R
到这一步就是整个算法最核心的步骤:增量式更新,常规的高斯牛顿法是构造一个 J T J J^TJ JTJ形式的信息矩阵来迭代求解 θ \theta θ,每次迭代的时候都需要重新做线性化并构造 J T J J^TJ JTJ,然后通过Cholesky分解或者QR分解求解正规方程,而ISAM则是从始至终只会维护一个 R R R矩阵,每当有新的观测时,可通过Given旋转直接更新R矩阵,无需再做QR分解或者Cholesky分解(关于Givens旋转含义可参考博客下方链接[2]),具体过程如下:
假设新的测量雅可比矩阵为
w
T
\boldsymbol{w}^T
wT,RHS(right hand side)向量为
γ
\gamma
γ,将其插入到之前的最小二乘中有:
[
Q
T
1
]
[
A
w
T
]
=
[
R
w
T
]
,
new rhs:
[
d
γ
]
.
\begin{bmatrix} Q^T \\ 1 \end{bmatrix} \begin{bmatrix} A \\ \mathbf{w}^T \end{bmatrix} = \begin{bmatrix} R \\ \mathbf{w}^T \end{bmatrix}, \quad \text{new rhs: } \begin{bmatrix} \mathbf{d} \\ \gamma \end{bmatrix}.
[QT1][AwT]=[RwT],new rhs: [dγ].
最终通过Givens旋转便可求得更新后的正规方程
R
′
θ
′
=
b
′
R^{'} \theta^{'} = b^{'}
R′θ′=b′,完整的更新过程如下图所示:
四: 回环和变量重排序
当发生回环时,直接通过Given旋转更新 R R R会使得矩阵中出现很多的非零项,也称fill-in现象,ISAM中通过变量重排序来避免fill-in现象的发生。ISAM1中会周期性的执行变量重排序,在重排序的同时也会重新做线性化重置 R R R矩阵。为啥是周期性的执行重排序呢,是因为它不知道什么时候要做重排序,但为了防止fill-in的发生,它就周期性的执行重排序。在ISAM2中,通过贝叶斯解决了这个问题,ISAM2会判断当前状态是否需要做重排序,只有当需要做重排序的时候才会做重排序。
五: 小结
- ISAM通过Giens旋转增量式的更新QR分解中的 R R R矩阵,避免了每次求解释从头构造 J T J J^TJ JTJ,也避免了每次都对这个大的 J T J J^TJ JTJ做Cholesky分解,极大的提高了效率。
- 但是ISAM每次观测来的时候默认只会更新一次 R R R矩阵,精度应该会比常用的GN、LM差一点,应为GN和LM每次优化的时候都会多次迭代。
- ISAM1无法判断时候该做重新线性化,所以为了防止fill-in的现象,它只能周期性的执行重新线性化和重排序,ISAM2通过贝叶斯树解决了这个问题。
参考资料
- Michael Kaess. iSAM: Incremental Smoothing and Mapping
- Given旋转: https://zhuanlan.zhihu.com/p/136551885