文章目录
- 1 边缘化是什么
- 2 实际SLAM中的优化问题构建
- 3 边缘化(Marginalization)
- 3.1 边缘化想做什么事情
- 3.2 边缘化过程详细步骤(以VINS-MONO为例)
- 第一步:构建 A Δ = b A\Delta = b AΔ=b 方程
- 第二步:将待marg的变量排列到矩阵A的最左侧,残差b的最上方
- 第三步:对矩阵A执行marg操作,同步对b进行修改,得到 A n Δ n = B n A_n\Delta_n = B_n AnΔn=Bn
- 第四步:从 A n , B n A_n, B_n An,Bn中恢复 J n , r n J_n, r_n Jn,rn构建 J n T J n Δ n = J n T r n J_n^TJ_n \Delta_n = J_n^Tr_n JnTJnΔn=JnTrn求解问题
- 第五步:进而有 J n , r n J_n, r_n Jn,rn 恢复子jacobian和子residual J n i , r n i J_{ni}, r_{ni} Jni,rni
- 第六步:最终得到边缘化之后的先验因子: Δ ∗ = argmin Δ ∑ i ∥ J n i Δ n i − r n i ∥ \Delta^* =\underset{\Delta}{\operatorname{argmin}} \sum_i\left\|J_{ni} \Delta_{ni}- r_{ni} \right\| Δ∗=Δargmin∑i∥JniΔni−rni∥
- Reference
1 边缘化是什么
回顾联合概率分布公式
P
(
x
,
y
)
=
P
(
x
∣
y
)
P
(
y
)
=
P
(
y
∣
x
)
P
(
x
)
P(x, y) = P(x|y)P(y) = P(y|x)P(x)
P(x,y)=P(x∣y)P(y)=P(y∣x)P(x)
所谓边缘化就是从联合分布PDF计算其中一部分变量的PDF,如下面的公式描述
P
(
y
)
=
∫
P
(
x
,
y
)
d
x
=
∫
P
(
y
∣
x
)
P
(
x
)
d
x
P(y) = \int P(x, y) dx = \int P(y|x)P(x) dx
P(y)=∫P(x,y)dx=∫P(y∣x)P(x)dx
通俗点说我们想边缘化掉x,那么只需要对这个联合分布中的x变量进行积分即可。
这个公式是理想情况下边缘化的做法,实际情况中我们是先构建了一个离散化的优化问题,直接在优化问题中操作边缘化,接下来我们来阐述如何从这个理想的公式到实际边缘化工程中的做法。
2 实际SLAM中的优化问题构建
2.1 线性高斯系统优化问题的构建(参考状态估计这本书,本节只是简介使得文章前后保持连续性)
求解一个优化问题在机器人状态估计中一般有两种方式,
- Bayesian Estimation:估计后验PDF的均值和方差
- Map A Posteriori Estimation:估计后验PDF的模及其方差
无论使用那种方式去推导,都可以导出滤波和优化两种具体的问题求解方法。我们使用MAP方式来导出,最后使用优化算法来求解问题。
⾸先,⽤贝叶斯公式重写 MAP 估计
x
^
=
arg
max
x
p
(
x
∣
v
,
y
)
=
arg
max
x
p
(
y
∣
x
,
v
)
p
(
x
∣
v
)
p
(
y
∣
v
)
=
arg
max
x
p
(
y
∣
x
)
p
(
x
∣
v
)
\hat{\boldsymbol{x}}=\arg \max _{\boldsymbol{x}} p(\boldsymbol{x} \mid \boldsymbol{v}, \boldsymbol{y})=\arg \max _{\boldsymbol{x}} \frac{p(\boldsymbol{y} \mid \boldsymbol{x}, \boldsymbol{v}) p(\boldsymbol{x} \mid \boldsymbol{v})}{p(\boldsymbol{y} \mid \boldsymbol{v})}=\arg \max _{\boldsymbol{x}} p(\boldsymbol{y} \mid \boldsymbol{x}) p(\boldsymbol{x} \mid \boldsymbol{v})
x^=argxmaxp(x∣v,y)=argxmaxp(y∣v)p(y∣x,v)p(x∣v)=argxmaxp(y∣x)p(x∣v)
接下来假设:
- 运动噪声 w k \boldsymbol{w}_k wk 和观测噪声 n k \boldsymbol{n}_k nk 对于所有时刻都是彼此无关的
这样可以利用贝叶斯公式进行因子分解
p
(
y
∣
x
)
=
∏
k
=
0
K
p
(
y
k
∣
x
k
)
p(\boldsymbol{y} \mid \boldsymbol{x})=\prod_{k=0}^K p\left(\boldsymbol{y}_k \mid \boldsymbol{x}_k\right)
p(y∣x)=k=0∏Kp(yk∣xk)
p
(
x
∣
v
)
=
p
(
x
0
∣
x
ˇ
0
)
∏
k
=
1
K
p
(
x
k
∣
x
k
−
1
,
v
k
)
p(\boldsymbol{x} \mid \boldsymbol{v})=p\left(\boldsymbol{x}_0 \mid \check{\boldsymbol{x}}_0\right) \prod_{k=1}^K p\left(\boldsymbol{x}_k \mid \boldsymbol{x}_{k-1}, \boldsymbol{v}_k\right)
p(x∣v)=p(x0∣xˇ0)k=1∏Kp(xk∣xk−1,vk)
在线性高斯系统中,展开PDF。
p
(
x
0
∣
x
ˇ
0
)
=
1
(
2
π
)
N
det
P
ˇ
0
p
(
x
k
∣
x
k
−
1
,
v
k
)
=
1
exp
(
−
1
2
(
x
0
−
x
ˇ
0
)
T
P
ˇ
0
−
1
(
x
0
−
x
ˇ
0
)
)
(
2
π
)
N
det
Q
k
p
(
y
k
∣
x
k
)
=
1
(
2
π
)
M
det
R
k
(
−
1
2
(
x
k
−
A
k
−
1
x
k
−
1
−
v
k
)
T
Q
k
−
1
(
x
k
−
A
k
−
1
x
k
−
1
−
v
k
)
)
×
exp
(
−
1
2
(
y
k
−
C
k
x
k
)
T
R
k
−
1
(
y
k
−
C
k
x
k
)
)
\begin{aligned} p\left(\boldsymbol{x}_0 \mid \check{\boldsymbol{x}}_0\right)= & \frac{1}{\sqrt{(2 \pi)^N \operatorname{det} \check{\boldsymbol{P}}_0}} \\ p\left(\boldsymbol{x}_k \mid \boldsymbol{x}_{k-1}, \boldsymbol{v}_k\right)= & \frac{1 \exp \left(-\frac{1}{2}\left(\boldsymbol{x}_0-\check{\boldsymbol{x}}_0\right)^{\mathrm{T}} \check{\boldsymbol{P}}_0^{-1}\left(\boldsymbol{x}_0-\check{\boldsymbol{x}}_0\right)\right)}{\sqrt{(2 \pi)^N \operatorname{det} \boldsymbol{Q}_k}} \\ p\left(\boldsymbol{y}_k \mid \boldsymbol{x}_k\right)= & \frac{1}{\sqrt{(2 \pi)^M \operatorname{det} \boldsymbol{R}_k}\left(-\frac{1}{2}\left(\boldsymbol{x}_k-\boldsymbol{A}_{k-1} \boldsymbol{x}_{k-1}-\boldsymbol{v}_k\right)^{\mathrm{T}} \boldsymbol{Q}_k^{-1}\left(\boldsymbol{x}_k-\boldsymbol{A}_{k-1} \boldsymbol{x}_{k-1}-\boldsymbol{v}_k\right)\right)} \\ & \times \exp \left(-\frac{1}{2}\left(\boldsymbol{y}_k-\boldsymbol{C}_k \boldsymbol{x}_k\right)^{\mathrm{T}} \boldsymbol{R}_k^{-1}\left(\boldsymbol{y}_k-\boldsymbol{C}_k \boldsymbol{x}_k\right)\right) \end{aligned}
p(x0∣xˇ0)=p(xk∣xk−1,vk)=p(yk∣xk)=(2π)NdetPˇ01(2π)NdetQk1exp(−21(x0−xˇ0)TPˇ0−1(x0−xˇ0))(2π)MdetRk(−21(xk−Ak−1xk−1−vk)TQk−1(xk−Ak−1xk−1−vk))1×exp(−21(yk−Ckxk)TRk−1(yk−Ckxk))
对两侧取负对数,下面是推导过程
ln ( p ( y ∣ x ) p ( x ∣ v ) ) = ln p ( x 0 ∣ x ˇ 0 ) + ∑ k = 1 K ln p ( x k ∣ x k − 1 , v k ) + ∑ k = 0 K ln p ( y k ∣ x k ) \ln (p(\boldsymbol{y} \mid \boldsymbol{x}) p(\boldsymbol{x} \mid \boldsymbol{v}))=\ln p\left(\boldsymbol{x}_0 \mid \check{\boldsymbol{x}}_0\right)+\sum_{k=1}^K \ln p\left(\boldsymbol{x}_k \mid \boldsymbol{x}_{k-1}, \boldsymbol{v}_k\right)+\sum_{k=0}^K \ln p\left(\boldsymbol{y}_k \mid \boldsymbol{x}_k\right) ln(p(y∣x)p(x∣v))=lnp(x0∣xˇ0)+k=1∑Klnp(xk∣xk−1,vk)+k=0∑Klnp(yk∣xk)
ln p ( x 0 ∣ x ˇ 0 ) = − 1 2 ( x 0 − x ˇ 0 ) T P ˇ 0 − 1 ( x − x ˇ 0 ) − 1 2 ln ( ( 2 π ) N det P ˇ 0 ) ⏟ 与 x 无关 ln p ( x k ∣ x k − 1 , v k ) = − 1 2 ( x k − A k − 1 x k − 1 − v k ) T Q k − 1 ( x k − A k − 1 x k − 1 − v k ) − 1 2 ln ( ( 2 π ) N det ( Q k ) ) ⏟ 与 x 无关 ln p ( y k ∣ x k ) = − 1 2 ( y k − C k x k ) T R k − 1 ( y k − C k x k ) − 1 2 ln ( ( 2 π ) M det R k ) ⏟ 与 x 无关 \begin{aligned} & \ln p\left(\boldsymbol{x}_0 \mid \check{\boldsymbol{x}}_0\right)=-\frac{1}{2}\left(\boldsymbol{x}_0-\check{\boldsymbol{x}}_0\right)^{\mathrm{T}} \check{\boldsymbol{P}}_0^{-1}\left(\boldsymbol{x}-\check{\boldsymbol{x}}_0\right) \\ & -\underbrace{\frac{1}{2} \ln \left((2 \pi)^N \operatorname{det} \check{\boldsymbol{P}}_0\right)}_{\text {与 } \boldsymbol{x} \text { 无关 }} \\ & \ln p\left(\boldsymbol{x}_k \mid \boldsymbol{x}_{k-1}, \boldsymbol{v}_k\right)=-\frac{1}{2}\left(\boldsymbol{x}_k-\boldsymbol{A}_{k-1} \boldsymbol{x}_{k-1}-\boldsymbol{v}_k\right)^{\mathrm{T}} \boldsymbol{Q}_k^{-1}\left(\boldsymbol{x}_k-\boldsymbol{A}_{k-1} \boldsymbol{x}_{k-1}-\boldsymbol{v}_k\right) \\ & -\underbrace{\frac{1}{2} \ln \left((2 \pi)^N \operatorname{det}\left(\boldsymbol{Q}_k\right)\right)}_{\text {与 } \boldsymbol{x} \text { 无关 }} \\ & \ln p\left(\boldsymbol{y}_k \mid \boldsymbol{x}_k\right)=-\frac{1}{2}\left(\boldsymbol{y}_k-\boldsymbol{C}_k \boldsymbol{x}_k\right)^{\mathrm{T}} \boldsymbol{R}_k^{-1}\left(\boldsymbol{y}_k-\boldsymbol{C}_k \boldsymbol{x}_k\right) \\ & -\underbrace{\frac{1}{2} \ln \left((2 \pi)^M \operatorname{det} \boldsymbol{R}_k\right)}_{\text {与 } \boldsymbol{x} \text { 无关 }} \\ & \end{aligned} lnp(x0∣xˇ0)=−21(x0−xˇ0)TPˇ0−1(x−xˇ0)−与 x 无关 21ln((2π)NdetPˇ0)lnp(xk∣xk−1,vk)=−21(xk−Ak−1xk−1−vk)TQk−1(xk−Ak−1xk−1−vk)−与 x 无关 21ln((2π)Ndet(Qk))lnp(yk∣xk)=−21(yk−Ckxk)TRk−1(yk−Ckxk)−与 x 无关 21ln((2π)MdetRk)
上面推导中出现了⼀些与 x ⽆关的项,直接忽略掉,因为不包含我们的优化变量。
定义下面的变量:
J
v
,
k
(
x
)
=
{
1
2
(
x
0
−
x
ˇ
0
)
T
P
ˇ
0
−
1
(
x
0
−
x
ˇ
0
)
,
k
=
0
1
2
(
x
k
−
A
k
−
1
x
k
−
1
−
v
k
)
T
Q
k
−
1
(
x
k
−
A
k
−
1
x
k
−
1
−
v
k
)
,
k
=
1
…
K
J
y
,
k
(
x
)
=
1
2
(
y
k
−
C
k
x
k
)
T
R
k
−
1
(
y
k
−
C
k
x
k
)
,
k
=
0
…
K
\begin{aligned} & J_{v, k}(\boldsymbol{x})= \begin{cases}\frac{1}{2}\left(\boldsymbol{x}_0-\check{\boldsymbol{x}}_0\right)^{\mathrm{T}} \check{\boldsymbol{P}}_0^{-1}\left(\boldsymbol{x}_0-\check{\boldsymbol{x}}_0\right), & k=0 \\ \frac{1}{2}\left(\boldsymbol{x}_k-\boldsymbol{A}_{k-1} \boldsymbol{x}_{k-1}-\boldsymbol{v}_k\right)^{\mathrm{T}} \boldsymbol{Q}_k^{-1}\left(\boldsymbol{x}_k-\boldsymbol{A}_{k-1} \boldsymbol{x}_{k-1}-\boldsymbol{v}_k\right), & k=1 \ldots K\end{cases} \\ & J_{y, k}(\boldsymbol{x})=\frac{1}{2}\left(\boldsymbol{y}_k-\boldsymbol{C}_k \boldsymbol{x}_k\right)^{\mathrm{T}} \boldsymbol{R}_k^{-1}\left(\boldsymbol{y}_k-\boldsymbol{C}_k \boldsymbol{x}_k\right), \quad k=0 \ldots K \end{aligned}
Jv,k(x)={21(x0−xˇ0)TPˇ0−1(x0−xˇ0),21(xk−Ak−1xk−1−vk)TQk−1(xk−Ak−1xk−1−vk),k=0k=1…KJy,k(x)=21(yk−Ckxk)TRk−1(yk−Ckxk),k=0…K
这些都是马氏距离(Mahalanobis Distance),是个优雅的二次型形式。
定义我们的目标函数
J
(
x
)
=
∑
k
=
0
K
(
J
v
,
k
(
x
)
+
J
y
,
k
(
x
)
)
J(\boldsymbol{x})=\sum_{k=0}^K\left(J_{v, k}(\boldsymbol{x})+J_{y, k}(\boldsymbol{x})\right)
J(x)=k=0∑K(Jv,k(x)+Jy,k(x))
问题的最优解为
x
^
=
arg
min
x
J
(
x
)
\hat{\boldsymbol{x}}=\arg \min _{\boldsymbol{x}} J(\boldsymbol{x})
x^=argxminJ(x)
这个问题是⼀个无约束的优化问题(unconstrained optimization problem),对于状态变量 x 本⾝并没有任何约束
2.2 非线性非高斯系统(Non Linear Non Gaussian,NLNG)优化问题构建
考虑非线性系统的运动和观测模型
x
k
=
f
(
x
k
−
1
,
v
k
,
w
k
)
,
k
=
1
…
K
y
k
=
g
(
x
k
,
n
k
)
,
k
=
0
…
K
\begin{aligned} & \boldsymbol{x}_k=\boldsymbol{f}\left(\boldsymbol{x}_{k-1}, \boldsymbol{v}_k, \boldsymbol{w}_k\right), \quad k=1 \ldots K \\ & \boldsymbol{y}_k=\boldsymbol{g}\left(\boldsymbol{x}_k, \boldsymbol{n}_k\right), \quad k=0 \ldots K \end{aligned}
xk=f(xk−1,vk,wk),k=1…Kyk=g(xk,nk),k=0…K
构建NLNG系统的优化问题,考虑线性化方式(简单提一下:如果用滤波,你也可以用采样的方式,比如粒子滤波,sigma point kalman filter):
f ( x k − 1 , v k , w k ) ≈ x ˇ k + F k − 1 ( x k − 1 − x ^ k − 1 ) + w k ′ g ( x k , n k ) ≈ y ˇ k + G k ( x k − x ˇ k ) + n k ′ x ˇ k = f ( x ^ k − 1 , v k , 0 ) , F k − 1 = ∂ f ( x k − 1 , v k , w k ) ∂ x k − 1 ∣ x ^ k − 1 , v k , C w k ′ = ∂ f ( x k − 1 , v k , w k ) ∂ w k ∣ x ^ k − 1 , v k , 0 w k y ˇ k = g ( x ˇ k , 0 ) , G k = ∂ g ( x k , n k ) ∂ x k ∣ x ˇ k , 0 n k ′ = ∂ g ( x k , n k ) ∂ n k ∣ x ˇ k , 0 n k \begin{aligned} &\begin{aligned} \boldsymbol{f}\left(\boldsymbol{x}_{k-1}, \boldsymbol{v}_k, \boldsymbol{w}_k\right) & \approx \check{\boldsymbol{x}}_k+\boldsymbol{F}_{k-1}\left(\boldsymbol{x}_{k-1}-\hat{\boldsymbol{x}}_{k-1}\right)+\boldsymbol{w}_k^{\prime} \\ \boldsymbol{g}\left(\boldsymbol{x}_k, \boldsymbol{n}_k\right) & \approx \check{\boldsymbol{y}}_k+\boldsymbol{G}_k\left(\boldsymbol{x}_k-\check{\boldsymbol{x}}_k\right)+\boldsymbol{n}_k^{\prime} \end{aligned}\\ &\begin{gathered} \check{\boldsymbol{x}}_k=\boldsymbol{f}\left(\hat{\boldsymbol{x}}_{k-1}, \boldsymbol{v}_k, \mathbf{0}\right), \quad \boldsymbol{F}_{k-1}=\left.\frac{\partial \boldsymbol{f}\left(\boldsymbol{x}_{k-1}, \boldsymbol{v}_k, \boldsymbol{w}_k\right)}{\partial \boldsymbol{x}_{k-1}}\right|_{\hat{\boldsymbol{x}}_{k-1}, \boldsymbol{v}_k, \mathrm{C}} \\ \boldsymbol{w}_k^{\prime}=\left.\frac{\partial \boldsymbol{f}\left(\boldsymbol{x}_{k-1}, \boldsymbol{v}_k, \boldsymbol{w}_k\right)}{\partial \boldsymbol{w}_k}\right|_{\hat{\boldsymbol{x}}_{k-1}, \boldsymbol{v}_k, \mathbf{0}} \boldsymbol{w}_k \end{gathered}\\ &\begin{gathered} \check{\boldsymbol{y}}_k=\boldsymbol{g}\left(\check{\boldsymbol{x}}_k, \mathbf{0}\right), \quad \boldsymbol{G}_k=\left.\frac{\partial \boldsymbol{g}\left(\boldsymbol{x}_k, \boldsymbol{n}_k\right)}{\partial \boldsymbol{x}_k}\right|_{\check{\boldsymbol{x}}_k, \mathbf{0}} \\ \boldsymbol{n}_k^{\prime}=\left.\frac{\partial \boldsymbol{g}\left(\boldsymbol{x}_k, \boldsymbol{n}_k\right)}{\partial \boldsymbol{n}_k}\right|_{\check{\boldsymbol{x}}_k, \mathbf{0}} \boldsymbol{n}_k \end{gathered} \end{aligned} f(xk−1,vk,wk)g(xk,nk)≈xˇk+Fk−1(xk−1−x^k−1)+wk′≈yˇk+Gk(xk−xˇk)+nk′xˇk=f(x^k−1,vk,0),Fk−1=∂xk−1∂f(xk−1,vk,wk) x^k−1,vk,Cwk′=∂wk∂f(xk−1,vk,wk) x^k−1,vk,0wkyˇk=g(xˇk,0),Gk=∂xk∂g(xk,nk) xˇk,0nk′=∂nk∂g(xk,nk) xˇk,0nk
仿照线性高斯系统的MAP建模方式,NLNG系统优化问题建模如下
x
=
[
x
0
x
1
⋮
x
K
]
\boldsymbol{x}=\left[\begin{array}{c} \boldsymbol{x}_0 \\ \boldsymbol{x}_1 \\ \vdots \\ \boldsymbol{x}_K \end{array}\right]
x=
x0x1⋮xK
定义残差
r
v
,
k
(
x
)
=
{
x
ˇ
0
−
x
0
k
=
0
f
(
x
k
−
1
,
v
k
,
0
)
−
x
k
k
=
1
…
K
r
y
,
k
(
x
)
=
y
k
−
g
(
x
k
,
0
)
,
k
=
0
…
K
\begin{aligned} & \boldsymbol{r}_{v, k}(\boldsymbol{x})= \begin{cases}\check{\boldsymbol{x}}_0-\boldsymbol{x}_0 & k=0 \\ \boldsymbol{f}\left(\boldsymbol{x}_{k-1}, \boldsymbol{v}_k, \mathbf{0}\right)-\boldsymbol{x}_k & k=1 \ldots K\end{cases} \\ & \boldsymbol{r}_{y, k}(\boldsymbol{x})=\boldsymbol{y}_k-\boldsymbol{g}\left(\boldsymbol{x}_k, \mathbf{0}\right), \quad k=0 \ldots K \end{aligned}
rv,k(x)={xˇ0−x0f(xk−1,vk,0)−xkk=0k=1…Kry,k(x)=yk−g(xk,0),k=0…K
目标函数为
J
v
,
k
(
x
)
=
1
2
r
v
,
k
(
x
)
T
W
v
,
k
−
1
r
v
,
k
(
x
)
J
y
,
k
(
x
)
=
1
2
r
y
,
k
(
x
)
T
W
y
,
k
−
1
r
y
,
k
(
x
)
J
(
x
)
=
∑
k
=
0
K
(
J
v
,
k
(
x
)
+
J
y
,
k
(
x
)
)
\begin{aligned} J_{v, k}(\boldsymbol{x}) & =\frac{1}{2} \boldsymbol{r}_{v, k}(\boldsymbol{x})^{\mathrm{T}} \boldsymbol{W}_{v, k}^{-1} \boldsymbol{r}_{v, k}(\boldsymbol{x}) \\ J_{y, k}(\boldsymbol{x}) & =\frac{1}{2} \boldsymbol{r}_{y, k}(\boldsymbol{x})^{\mathrm{T}} \boldsymbol{W}_{y, k}^{-1} \boldsymbol{r}_{y, k}(\boldsymbol{x}) \\ J(\boldsymbol{x}) & =\sum_{k=0}^K\left(J_{v, k}(\boldsymbol{x})+J_{y, k}(\boldsymbol{x})\right) \end{aligned}
Jv,k(x)Jy,k(x)J(x)=21rv,k(x)TWv,k−1rv,k(x)=21ry,k(x)TWy,k−1ry,k(x)=k=0∑K(Jv,k(x)+Jy,k(x))
2.3 NLNG问题的Batch形式(实际SLAM优化多帧pose和多路标点的情况)
将上述目标函数写成矩阵形式
r
(
x
)
=
[
r
v
(
x
)
r
y
(
x
)
]
,
r
v
(
x
)
=
[
r
v
,
0
(
x
)
⋮
r
v
,
K
(
x
)
]
,
r
y
(
x
)
=
[
r
y
,
0
(
x
)
⋮
r
y
,
K
(
x
)
]
W
=
diag
(
W
v
,
W
y
)
W
v
=
diag
(
W
v
,
0
,
…
,
W
v
,
K
)
,
W
y
=
diag
(
W
y
,
0
,
…
,
W
y
,
K
)
\begin{gathered} \boldsymbol{r}(\boldsymbol{x})=\left[\begin{array}{c} \boldsymbol{r}_v(\boldsymbol{x}) \\ \boldsymbol{r}_y(\boldsymbol{x}) \end{array}\right], \quad \boldsymbol{r}_v(\boldsymbol{x})=\left[\begin{array}{c} \boldsymbol{r}_{v, 0}(\boldsymbol{x}) \\ \vdots \\ \boldsymbol{r}_{v, K}(\boldsymbol{x}) \end{array}\right], \quad \boldsymbol{r}_y(\boldsymbol{x})=\left[\begin{array}{c} \boldsymbol{r}_{y, 0}(\boldsymbol{x}) \\ \vdots \\ \boldsymbol{r}_{y, K}(\boldsymbol{x}) \end{array}\right] \\ \boldsymbol{W}=\operatorname{diag}\left(\boldsymbol{W}_v, \boldsymbol{W}_y\right) \\ \boldsymbol{W}_v=\operatorname{diag}\left(\boldsymbol{W}_{v, 0}, \ldots, \boldsymbol{W}_{v, K}\right), \quad \boldsymbol{W}_y=\operatorname{diag}\left(\boldsymbol{W}_{y, 0}, \ldots, \boldsymbol{W}_{y, K}\right) \end{gathered}
r(x)=[rv(x)ry(x)],rv(x)=
rv,0(x)⋮rv,K(x)
,ry(x)=
ry,0(x)⋮ry,K(x)
W=diag(Wv,Wy)Wv=diag(Wv,0,…,Wv,K),Wy=diag(Wy,0,…,Wy,K)
J ( x ) = 1 2 r ( x ) T W − 1 r ( x ) J(\boldsymbol{x})=\frac{1}{2} \boldsymbol{r}(\boldsymbol{x})^{\mathrm{T}} \boldsymbol{W}^{-1} \boldsymbol{r}(\boldsymbol{x}) J(x)=21r(x)TW−1r(x)
在实际问题求解中,我们会把噪声项和误差项进行合并写成
u
(
x
)
=
L
e
(
x
)
\boldsymbol{u}(\boldsymbol{x})=\boldsymbol{L} e(\boldsymbol{x})
u(x)=Le(x)
J
(
x
)
=
1
2
u
(
x
)
T
u
(
x
)
J(\boldsymbol{x})=\frac{1}{2} \boldsymbol{u}(\boldsymbol{x})^{\mathrm{T}} \boldsymbol{u}(\boldsymbol{x})
J(x)=21u(x)Tu(x)
这可以用Cholesky分解得到
L
T
L
=
W
−
1
\boldsymbol{L}^{\mathrm{T}} \boldsymbol{L}=\boldsymbol{W}^{-1}
LTL=W−1
实际问题中我们都不需要用Cholesky分解,用这个W是一个对角阵,只需要针对对角线元素求sqrt即可。
2.4 使用高斯牛顿法求解
对
u
(
x
)
u(x)
u(x)进行线性化(泰勒展开)
u
(
x
o
p
+
Δ
x
)
≈
u
(
x
o
p
)
+
(
∂
u
(
x
)
∂
x
∣
x
o
p
)
Δ
x
\boldsymbol{u}\left(\boldsymbol{x}_{\mathrm{op}}+\Delta \boldsymbol{x}\right) \approx \boldsymbol{u}\left(\boldsymbol{x}_{\mathrm{op}}\right)+\left(\left.\frac{\partial \boldsymbol{u}(\boldsymbol{x})}{\partial \boldsymbol{x}}\right|_{\boldsymbol{x}_{\mathrm{op}}}\right) \Delta \boldsymbol{x}
u(xop+Δx)≈u(xop)+(∂x∂u(x)
xop)Δx
将其代⼊目标函数 J 中
J
(
x
o
p
+
Δ
x
)
≈
1
2
(
u
(
x
o
p
)
+
(
∂
u
(
x
)
∂
x
∣
x
o
p
)
Δ
x
)
T
(
u
(
x
o
p
)
+
(
∂
u
(
x
)
∂
x
∣
x
o
p
)
Δ
x
)
J\left(\boldsymbol{x}_{\mathrm{op}}+\Delta \boldsymbol{x}\right) \approx \frac{1}{2}\left(\boldsymbol{u}\left(\boldsymbol{x}_{\mathrm{op}}\right)+\left(\left.\frac{\partial \boldsymbol{u}(\boldsymbol{x})}{\partial \boldsymbol{x}}\right|_{\boldsymbol{x}_{\mathrm{op}}}\right) \Delta \boldsymbol{x}\right)^{\mathrm{T}}\left(\boldsymbol{u}\left(\boldsymbol{x}_{\mathrm{op}}\right)+\left(\left.\frac{\partial \boldsymbol{u}(\boldsymbol{x})}{\partial \boldsymbol{x}}\right|_{\boldsymbol{x}_{\mathrm{op}}}\right) \Delta \boldsymbol{x}\right)
J(xop+Δx)≈21(u(xop)+(∂x∂u(x)
xop)Δx)T(u(xop)+(∂x∂u(x)
xop)Δx)
针对
Δ
x
\Delta_x
Δx 最⼩化
∂
J
(
x
o
p
+
Δ
x
)
∂
Δ
x
=
(
u
(
x
o
p
)
+
(
∂
u
(
x
)
∂
x
∣
x
o
p
)
Δ
x
∗
)
T
(
∂
u
(
x
)
∂
x
∣
x
o
p
)
=
0
⇒
(
∂
u
(
x
)
∂
x
∣
x
o
p
)
T
(
∂
u
(
x
)
∂
x
∣
x
o
p
)
Δ
x
∗
=
−
(
∂
u
(
x
)
∂
x
∣
x
o
p
)
T
u
(
x
o
p
)
\begin{array}{r} \frac{\partial J\left(\boldsymbol{x}_{\mathrm{op}}+\Delta \boldsymbol{x}\right)}{\partial \Delta \boldsymbol{x}}=\left(\boldsymbol{u}\left(\boldsymbol{x}_{\mathrm{op}}\right)+\left(\left.\frac{\partial \boldsymbol{u}(\boldsymbol{x})}{\partial \boldsymbol{x}}\right|_{\boldsymbol{x}_{\mathrm{op}}}\right) \Delta \boldsymbol{x}^*\right)^{\mathrm{T}}\left(\left.\frac{\partial \boldsymbol{u}(\boldsymbol{x})}{\partial \boldsymbol{x}}\right|_{\boldsymbol{x}_{\mathrm{op}}}\right)=\mathbf{0} \\ \Rightarrow\left(\left.\frac{\partial \boldsymbol{u}(\boldsymbol{x})}{\partial \boldsymbol{x}}\right|_{\boldsymbol{x}_{\mathrm{op}}}\right)^{\mathrm{T}}\left(\left.\frac{\partial \boldsymbol{u}(\boldsymbol{x})}{\partial \boldsymbol{x}}\right|_{\boldsymbol{x}_{\mathrm{op}}}\right) \Delta \boldsymbol{x}^*=-\left(\left.\frac{\partial \boldsymbol{u}(\boldsymbol{x})}{\partial \boldsymbol{x}}\right|_{\boldsymbol{x}_{\mathrm{op}}}\right)^{\mathrm{T}} \boldsymbol{u}\left(\boldsymbol{x}_{\mathrm{op}}\right) \end{array}
∂Δx∂J(xop+Δx)=(u(xop)+(∂x∂u(x)
xop)Δx∗)T(∂x∂u(x)
xop)=0⇒(∂x∂u(x)
xop)T(∂x∂u(x)
xop)Δx∗=−(∂x∂u(x)
xop)Tu(xop)
至此可以求解出 Δ x \Delta_x Δx,然后 x ^ k + 1 = x ^ k + Δ x \hat{x}_{k+1} = \hat{x}_k + \Delta_x x^k+1=x^k+Δx,完成了一次迭代优化,持续迭代到 Δ x \Delta_x Δx足够小完成优化问题求解。
2.5 考虑一个小的优化问题:仅包含观测模型
X
M
A
P
=
argmin
X
∑
i
∥
h
i
(
X
i
)
−
z
i
∥
Σ
i
2
X^{M A P}=\underset{X}{\operatorname{argmin}} \sum_i\left\|h_i\left(X_i\right)-z_i\right\|_{\Sigma_i}^2
XMAP=Xargmini∑∥hi(Xi)−zi∥Σi2
对观测模型进行线性化
h
i
(
X
i
)
=
h
i
(
X
i
0
+
Δ
i
)
≈
h
i
(
X
i
0
)
+
J
i
Δ
i
h_i\left(X_i\right)=h_i\left(X_i^0+\Delta_i\right) \approx h_i\left(X_i^0\right)+J_i \Delta_i
hi(Xi)=hi(Xi0+Δi)≈hi(Xi0)+JiΔi
J
i
≜
∂
h
i
(
X
i
)
∂
X
i
∣
X
i
0
\left.J_i \triangleq \frac{\partial h_i\left(X_i\right)}{\partial X_i}\right|_{X_i^0}
Ji≜∂Xi∂hi(Xi)
Xi0
其中
Δ
i
≜
X
i
−
X
i
0
\Delta_i \triangleq X_i-X_i^0
Δi≜Xi−Xi0 就是我们的状态更新方程
带入上式
Δ
∗
=
argmin
Δ
∑
i
∥
h
i
(
X
i
0
)
+
J
i
Δ
i
−
z
i
∥
Σ
i
2
=
argmin
Δ
∑
i
∥
J
i
Δ
i
−
{
z
i
−
h
i
(
X
i
0
)
}
∥
Σ
i
2
=
argmin
Δ
∑
i
∥
J
i
Δ
i
−
r
i
∥
Σ
i
2
\begin{aligned} \Delta^* & =\underset{\Delta}{\operatorname{argmin}} \sum_i\left\|h_i\left(X_i^0\right)+J_i \Delta_i-z_i\right\|_{\Sigma_i}^2 \\ & =\underset{\Delta}{\operatorname{argmin}} \sum_i\left\|J_i \Delta_i-\left\{z_i-h_i\left(X_i^0\right)\right\}\right\|_{\Sigma_i}^2 \\ & =\underset{\Delta}{\operatorname{argmin}} \sum_i\left\|J_i \Delta_i- r_i \right\|_{\Sigma_i}^2 \end{aligned}
Δ∗=Δargmini∑
hi(Xi0)+JiΔi−zi
Σi2=Δargmini∑
JiΔi−{zi−hi(Xi0)}
Σi2=Δargmini∑∥JiΔi−ri∥Σi2
其中
J
i
J_i
Ji 称为Jacobian,
r
i
=
{
z
i
−
h
i
(
X
i
0
)
}
r_i = \left\{z_i-h_i\left(X_i^0\right)\right\}
ri={zi−hi(Xi0)} 称为残差
我们把观测误差的协方差矩阵合并到
J
i
,
r
i
J_i, r_i
Ji,ri中去,变成一个完美的二次型形式
J
i
=
Σ
i
−
1
/
2
J
i
r
i
=
Σ
i
−
1
/
2
(
z
i
−
h
i
(
X
i
0
)
)
\begin{aligned} J_i & =\Sigma_i^{-1 / 2} J_i \\ r_i & =\Sigma_i^{-1 / 2}\left(z_i-h_i\left(X_i^0\right)\right) \end{aligned}
Jiri=Σi−1/2Ji=Σi−1/2(zi−hi(Xi0))
上面的公式之所以成立,是因为
∥
r
∥
Σ
2
≜
r
⊤
Σ
−
1
r
=
(
Σ
−
1
/
2
r
)
⊤
(
Σ
−
1
/
2
r
)
=
∥
Σ
−
1
/
2
r
∥
2
2
\|r\|_{\Sigma}^2 \triangleq r^{\top} \Sigma^{-1} r=\left(\Sigma^{-1 / 2} r\right)^{\top}\left(\Sigma^{-1 / 2} r\right)=\left\|\Sigma^{-1 / 2} r\right\|_2^2
∥r∥Σ2≜r⊤Σ−1r=(Σ−1/2r)⊤(Σ−1/2r)=
Σ−1/2r
22
这里我们没有对jacobian和residual重新赋值一个新的名字,是为了方便。 因为实际工程中比如使用ceres构建factor的时候,会在factor evaluate函数中直接把信息矩阵(测量噪声)合并到jacobian和residual中。如下图
residual = sqrt_info * residual;
jacobian_pose_j.leftCols<6>() = sqrt_info * jaco_j;
所以最终的优化目标函数为
Δ
∗
=
argmin
Δ
∑
i
∥
J
i
Δ
i
−
r
i
∥
\begin{aligned} \Delta^* & =\underset{\Delta}{\operatorname{argmin}} \sum_i\left\|J_i \Delta_i- r_i \right\| \end{aligned}
Δ∗=Δargmini∑∥JiΔi−ri∥
3 边缘化(Marginalization)
3.1 边缘化想做什么事情
定义 X = [ x m x n ] X = \left[\begin{array}{c} x_{m} \\ x_{n} \end{array}\right] X=[xmxn]
在滑动窗口算法中,经历完以次优化之后,我们希望把 x m x_{m} xm从优化问题中移除,进而限制优化问题规模的增长,只保留 x n x_{n} xn。
如果直接把 x m x_m xm 相关的变量和协方差直接移除,会导致 x m x_m xm对系统的约束直接就丢掉了,那么我们能不能丢掉 x m x_m xm的同时,保留 x m x_m xm对系统的约束呢?
需要先弄明白所谓对系统的约束是什么?
2.5 中我们考了一个简单的优化问题,其最终的目标函数为
Δ
∗
=
argmin
Δ
∑
i
∥
J
i
Δ
i
−
r
i
∥
\begin{aligned} \Delta^* & =\underset{\Delta}{\operatorname{argmin}} \sum_i\left\|J_i \Delta_i- r_i \right\| \end{aligned}
Δ∗=Δargmini∑∥JiΔi−ri∥
应用高斯牛顿方法,这个优化问题实际上是求解
J
T
J
Δ
=
J
T
r
J^TJ\Delta = J^Tr
JTJΔ=JTr
其中 J , r J, r J,r是 J i , r i J_i, r_i Ji,ri 拼接成的大型稀疏矩阵
我们系统中不同变量之间的约束就是 J T J J^TJ JTJ 这个矩阵中的那些不为0的元素。
令
A
=
J
J
T
,
b
=
J
T
r
A = JJ^T, b = J^Tr
A=JJT,b=JTr,可以写成
A
Δ
=
b
A\Delta = b
AΔ=b
至此我们知道了我们希望边缘化做什么事情:
- 构建 A Δ = b A\Delta = b AΔ=b 方程
- 将待marg的变量排列到矩阵A的最左侧,残差b的最上方
- 对矩阵A执行marg操作,同步对b进行修改,得到 A n Δ n = B n A_n\Delta_n = B_n AnΔn=Bn
- 从 A n , B n A_n, B_n An,Bn中恢复 J n , r n J_n, r_n Jn,rn构建 J n T J n Δ n = J n T r n J_n^TJ_n \Delta_n = J_n^Tr_n JnTJnΔn=JnTrn求解问题
- 进而有 J n , r n J_n, r_n Jn,rn 恢复子jacobian和子residual J n i , r n i J_{ni}, r_{ni} Jni,rni
- 最终得到边缘化之后的先验因子: Δ ∗ = argmin Δ ∑ i ∥ J n i Δ n i − r n i ∥ \Delta^* =\underset{\Delta}{\operatorname{argmin}} \sum_i\left\|J_{ni} \Delta_{ni}- r_{ni} \right\| Δ∗=Δargmin∑i∥JniΔni−rni∥
3.2 边缘化过程详细步骤(以VINS-MONO为例)
第一步:构建 A Δ = b A\Delta = b AΔ=b 方程
在VINS-MONO中构建这个方程的过程就是 ThreadsConstructA
函数。
矩阵A 可视化如下
第二步:将待marg的变量排列到矩阵A的最左侧,残差b的最上方
A
=
[
Σ
m
m
Σ
m
n
Σ
n
m
Σ
n
n
]
b
=
[
b
m
b
n
]
A = \left[\begin{array}{cc} \boldsymbol{\Sigma}_{m m} & \boldsymbol{\Sigma}_{m n} \\ \boldsymbol{\Sigma}_{n m} & \boldsymbol{\Sigma}_{n n} \end{array}\right] \\ b = \left[\begin{array}{cc} \boldsymbol{b_m} \\ \boldsymbol{b_n} \end{array}\right]
A=[ΣmmΣnmΣmnΣnn]b=[bmbn]
第三步:对矩阵A执行marg操作,同步对b进行修改,得到 A n Δ n = B n A_n\Delta_n = B_n AnΔn=Bn
代码对应于marginalize()函数
marg操作,本质就是通过矩阵变换来消除掉
x
m
x_m
xm 变量,过程如下
对矩阵A执行LDU分解(同理如果想边缘化掉
x
n
x_n
xn,就执行UDL分解),
UDL分解
[
Σ
m
m
Σ
m
n
Σ
n
m
Σ
n
n
]
=
[
1
Σ
m
n
Σ
n
n
−
1
0
1
]
[
Σ
m
m
−
Σ
m
n
Σ
n
n
−
1
Σ
n
m
0
0
Σ
n
n
]
[
1
0
Σ
n
n
−
1
Σ
n
m
1
]
\left[\begin{array}{cc} \boldsymbol{\Sigma}_{m m} & \boldsymbol{\Sigma}_{m n} \\ \boldsymbol{\Sigma}_{n m} & \boldsymbol{\Sigma}_{n n} \end{array}\right]=\left[\begin{array}{cc} \mathbf{1} & \boldsymbol{\Sigma}_{m n} \boldsymbol{\Sigma}_{n n}^{-1} \\ \mathbf{0} & \mathbf{1} \end{array}\right]\left[\begin{array}{cc} \boldsymbol{\Sigma}_{m m}-\boldsymbol{\Sigma}_{m n} \boldsymbol{\Sigma}_{n n}^{-1} \boldsymbol{\Sigma}_{n m} & \mathbf{0} \\ 0 & \boldsymbol{\Sigma}_{n n} \end{array}\right]\left[\begin{array}{cc} \mathbf{1} & \mathbf{0} \\ \boldsymbol{\Sigma}_{n n}^{-1} \boldsymbol{\Sigma}_{n m} & \mathbf{1} \end{array}\right]
[ΣmmΣnmΣmnΣnn]=[10ΣmnΣnn−11][Σmm−ΣmnΣnn−1Σnm00Σnn][1Σnn−1Σnm01]
LDU分解
[
Σ
m
m
Σ
m
n
Σ
n
m
Σ
n
n
]
=
[
1
0
Σ
n
m
Σ
m
m
−
1
1
]
[
Σ
m
m
0
0
Σ
n
n
−
Σ
n
m
Σ
m
m
−
1
Σ
m
n
]
[
1
Σ
m
m
−
1
Σ
m
n
0
1
]
\left[\begin{array}{cc} \boldsymbol{\Sigma}_{m m} & \boldsymbol{\Sigma}_{m n} \\ \boldsymbol{\Sigma}_{n m} & \boldsymbol{\Sigma}_{n n} \end{array}\right] =\left[\begin{array}{cc} \mathbf{1} & \mathbf{0}\\ \boldsymbol{\Sigma}_{n m} \boldsymbol{\Sigma}_{m m}^{-1} & \mathbf{1} \end{array}\right] \left[\begin{array}{cc} \boldsymbol{\Sigma}_{m m} & \mathbf{0} \\ 0 & \boldsymbol{\Sigma}_{n n}-\boldsymbol{\Sigma}_{n m} \boldsymbol{\Sigma}_{m m}^{-1} \boldsymbol{\Sigma}_{m n} \end{array}\right] \left[\begin{array}{cc} \mathbf{1} & \boldsymbol{\Sigma}_{m m}^{-1} \boldsymbol{\Sigma}_{m n}\\ \mathbf{0} & \mathbf{1} \end{array}\right]
[ΣmmΣnmΣmnΣnn]=[1ΣnmΣmm−101][Σmm00Σnn−ΣnmΣmm−1Σmn][10Σmm−1Σmn1]
然后方程两边同时乘以
L
−
1
=
[
1
0
−
Σ
n
m
Σ
m
m
−
1
1
]
L^{-1} = \left[\begin{array}{cc} \mathbf{1} & \mathbf{0}\\ -\boldsymbol{\Sigma}_{n m} \boldsymbol{\Sigma}_{m m}^{-1} & \mathbf{1} \end{array}\right]
L−1=[1−ΣnmΣmm−101]
最后化简
最终得到
(
Σ
n
n
−
Σ
n
m
Σ
m
m
−
1
Σ
m
n
)
Δ
n
=
b
n
−
Σ
n
m
Σ
m
m
−
1
b
m
\left(\boldsymbol{\Sigma}_{n n}-\boldsymbol{\Sigma}_{n m} \boldsymbol{\Sigma}_{m m}^{-1} \boldsymbol{\Sigma}_{m n} \right)\Delta_n = b_n - \boldsymbol{\Sigma}_{n m} \boldsymbol{\Sigma}_{m m}^{-1} b_m
(Σnn−ΣnmΣmm−1Σmn)Δn=bn−ΣnmΣmm−1bm
那么
A
n
=
(
Σ
n
n
−
Σ
n
m
Σ
m
m
−
1
Σ
m
n
)
A_n = \left(\boldsymbol{\Sigma}_{n n}-\boldsymbol{\Sigma}_{n m} \boldsymbol{\Sigma}_{m m}^{-1} \boldsymbol{\Sigma}_{m n} \right)
An=(Σnn−ΣnmΣmm−1Σmn)
B
n
=
b
n
−
Σ
n
m
Σ
m
m
−
1
b
m
B_n = b_n - \boldsymbol{\Sigma}_{n m} \boldsymbol{\Sigma}_{m m}^{-1} b_m
Bn=bn−ΣnmΣmm−1bm
第四步:从 A n , B n A_n, B_n An,Bn中恢复 J n , r n J_n, r_n Jn,rn构建 J n T J n Δ n = J n T r n J_n^TJ_n \Delta_n = J_n^Tr_n JnTJnΔn=JnTrn求解问题
- 最简单的可以对 A n A_n An直接做cholesky分解, A n = J n T J n A_n = J_n^TJ_n An=JnTJn
- VINS MONO中使用了特征值分解
A n = V S V T = V S 1 2 S 1 2 V T = ( S 1 2 V T ) T S 1 2 V T A_n = VSV^T \\ = V S^{\frac{1}{2}} S^{\frac{1}{2}} V^T \\ = (S^{\frac{1}{2}} V^T)^{T} S^{\frac{1}{2}} V^T An=VSVT=VS21S21VT=(S21VT)TS21VT
因此
J
n
=
S
1
2
V
T
J_n = S^{\frac{1}{2}} V^T
Jn=S21VT
J
n
T
=
V
S
1
2
J_n^T = V S^{\frac{1}{2}}
JnT=VS21
而
J
T
r
n
=
B
n
J^T r_n = B_n
JTrn=Bn,所以
r
n
=
J
T
−
1
B
n
=
(
V
S
1
2
)
−
1
B
n
=
S
−
1
2
V
−
1
B
n
=
S
−
1
2
V
T
B
n
r_n = {J^T}^{-1} B_n \\ = (V S^{\frac{1}{2}})^{-1} B_n \\ = S^{-\frac{1}{2}} V^{-1} B_n \\ = S^{-\frac{1}{2}} V^T B_n
rn=JT−1Bn=(VS21)−1Bn=S−21V−1Bn=S−21VTBn
第五步:进而有 J n , r n J_n, r_n Jn,rn 恢复子jacobian和子residual J n i , r n i J_{ni}, r_{ni} Jni,rni
这一步实际中并没有拆出来,而是直接在第六步中批量计算了,因为所有的优化子factor最后还是汇聚成一个大矩阵,现在我们已经有了这个矩阵,自然不需要再重复操作了。
这个主要是展示构建先验项每一个小factor的组成
第六步:最终得到边缘化之后的先验因子: Δ ∗ = argmin Δ ∑ i ∥ J n i Δ n i − r n i ∥ \Delta^* =\underset{\Delta}{\operatorname{argmin}} \sum_i\left\|J_{ni} \Delta_{ni}- r_{ni} \right\| Δ∗=Δargmin∑i∥JniΔni−rni∥
bool MarginalizationFactor::Evaluate(double const *const *parameters,
double *residuals,
double **jacobians) const {
- 注意Evaluate中函数的jacobian项就是 J n i J_{ni} Jni,
- 残差的计算为
residual = J n ( X − X 0 ) − r n \text{residual} = J_n \left(X - X_0\right) - r_n residual=Jn(X−X0)−rn
这个 VINS-MONO中最后实现的不同,VINS-MONO是
+
r
n
+ r _n
+rn,原因是vins-mono中定义的
r
=
h
(
x
)
−
z
r = h(x) - z
r=h(x)−z
本文定义残差为
r
i
=
{
z
i
−
h
i
(
X
i
0
)
}
r_i = \left\{z_i-h_i\left(X_i^0\right)\right\}
ri={zi−hi(Xi0)}
二者是相反的,所以符号不同。
Reference
- 机器人学中状态估计
- 机器人感知:因子图在SLAM中的应用
- VINS论文推导及代码解析_V13_190317.pdf,崔华坤