从零真正理解SLAM中的边缘化---------详细的理论细节推导

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(xy)P(y)=P(yx)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(yx)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(xv,y)=argxmaxp(yv)p(yx,v)p(xv)=argxmaxp(yx)p(xv)

接下来假设:

  • 运动噪声 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(yx)=k=0Kp(ykxk)
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(xv)=p(x0xˇ0)k=1Kp(xkxk1,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(x0xˇ0)=p(xkxk1,vk)=p(ykxk)=(2π)NdetPˇ0 1(2π)NdetQk 1exp(21(x0xˇ0)TPˇ01(x0xˇ0))(2π)MdetRk (21(xkAk1xk1vk)TQk1(xkAk1xk1vk))1×exp(21(ykCkxk)TRk1(ykCkxk))

对两侧取负对数,下面是推导过程

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(yx)p(xv))=lnp(x0xˇ0)+k=1Klnp(xkxk1,vk)+k=0Klnp(ykxk)

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(x0xˇ0)=21(x0xˇ0)TPˇ01(xxˇ0) x 无关  21ln((2π)NdetPˇ0)lnp(xkxk1,vk)=21(xkAk1xk1vk)TQk1(xkAk1xk1vk) x 无关  21ln((2π)Ndet(Qk))lnp(ykxk)=21(ykCkxk)TRk1(ykCkxk) 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(x0xˇ0)TPˇ01(x0xˇ0),21(xkAk1xk1vk)TQk1(xkAk1xk1vk),k=0k=1KJy,k(x)=21(ykCkxk)TRk1(ykCkxk),k=0K

这些都是马氏距离(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=0K(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(xk1,vk,wk),k=1Kyk=g(xk,nk),k=0K

构建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(xk1,vk,wk)g(xk,nk)xˇk+Fk1(xk1x^k1)+wkyˇk+Gk(xkxˇk)+nkxˇk=f(x^k1,vk,0),Fk1=xk1f(xk1,vk,wk) x^k1,vk,Cwk=wkf(xk1,vk,wk) x^k1,vk,0wkyˇk=g(xˇk,0),Gk=xkg(xk,nk) xˇk,0nk=nkg(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= x0x1xK

定义残差
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ˇ0x0f(xk1,vk,0)xkk=0k=1Kry,k(x)=ykg(xk,0),k=0K

目标函数为
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,k1rv,k(x)=21ry,k(x)TWy,k1ry,k(x)=k=0K(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)TW1r(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=W1

实际问题中我们都不需要用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)+(xu(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)+(xu(x) xop)Δx)T(u(xop)+(xu(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} ΔxJ(xop+Δx)=(u(xop)+(xu(x) xop)Δx)T(xu(x) xop)=0(xu(x) xop)T(xu(x) xop)Δx=(xu(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=Xargminihi(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} JiXihi(Xi) Xi0
其中 Δ i ≜ X i − X i 0 \Delta_i \triangleq X_i-X_i^0 ΔiXiXi0 就是我们的状态更新方程
带入上式

Δ ∗ = 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Δizi Σi2=Δargmini JiΔi{zihi(Xi0)} Σi2=ΔargminiJiΔiriΣ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={zihi(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=Σi1/2Ji=Σi1/2(zihi(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Σ2rΣ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} Δ=ΔargminiJiΔiri

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} Δ=ΔargminiJiΔiri
应用高斯牛顿方法,这个优化问题实际上是求解
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\| Δ=ΔargminiJniΔnirni

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Σnn11][ΣmmΣmnΣnn1Σnm00Σnn][1Σnn1Σ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Σmm101][Σmm00ΣnnΣnmΣmm1Σmn][10Σmm1Σ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] L1=[1ΣnmΣmm101]

最后化简

最终得到
( Σ 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Σmm1Σmn)Δn=bnΣnmΣmm1bm

那么 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Σmm1Σ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Σmm1bm

第四步:从 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=JT1Bn=(VS21)1Bn=S21V1Bn=S21VTBn

第五步:进而有 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\| Δ=ΔargminiJniΔnirni

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(XX0)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={zihi(Xi0)}

二者是相反的,所以符号不同。

Reference

  • 机器人学中状态估计
  • 机器人感知:因子图在SLAM中的应用
  • VINS论文推导及代码解析_V13_190317.pdf,崔华坤
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值