VIO第4讲:基于滑动窗口法的vio系统可观性与一致性

2024-02-24 20:28

本文主要是介绍VIO第4讲:基于滑动窗口法的vio系统可观性与一致性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VIO第4讲基于滑动窗口算法的 VIO 系统:可观性和一致性

文章目录

  • VIO第4讲基于滑动窗口算法的 VIO 系统:可观性和一致性
  • 1 从高斯分布到信息矩阵
    • 1.1 SLAM和高斯分布
    • 1.2 协方差矩阵与信息矩阵
  • 2 舒尔补应用:边际概率、条件概率
    • 2.1 舒尔补
    • 2.2 舒尔补的应用
      • 2.2.1 结论1
      • 2.2.2 结论2
      • 2.2.3 总结
  • 3 滑动窗口算法与边缘化 Marginalization
    • 3.1 最小二乘的图表示
    • 3.2 最小二乘问题信息矩阵的构成
    • 3.3 信息矩阵的稀疏性
    • 3.4 信息矩阵组装过程的可视化
    • 3.5 基于边际概率(Marginalization)的滑动窗口算法
    • 3.6 VINS中的滑动窗口算法
  • 4 滑动窗口中的FEJ算法
    • 4.1 滑动窗口算法导致的问题
    • 4.2 可观性
      • 4.2.1 什么是可观?
        • ① 线性系统理论中的可观测性
        • ② SLAM系统中的可观测性
      • 4.2.2 单目SLAM系统的可观性
    • 4.3 FEJ算法
  • 5 滑动窗口算法中关键问题
  • 6 作业
    • 6.1
    • 6.2 补充程序

1 从高斯分布到信息矩阵

在这里插入图片描述

1.1 SLAM和高斯分布

  考虑某个状态 ξ \boldsymbol{\xi} ξ(如位姿T、路标点P),以及一次与该变量相关的观测 r i r_{i} ri。由于噪声的存在,观测服从概率分布 p ( r i ∣ ξ ) p\left(\mathbf{r}_i|\boldsymbol{\xi}\right) p(riξ)

  多次观测时,各个测量值相互独立,则多个测量 r = ( r 1 , … , r n ) ⊤ \mathbf{r}=\left(\mathbf{r}_1,\ldots,\mathbf{r}_n\right)^\top r=(r1,,rn)构建的似然概率为:
L ( ξ ) = L ( r 1 , r 2 , ⋯ , r n ; ξ ) = p ( r ∣ ξ ) = ∏ i p ( r i ∣ ξ ) L(\xi)=L(r_1,r_2,\cdots,r_n;\xi)=p(\mathbf{r}|\boldsymbol{\xi})=\prod_ip\left(\mathbf{r}_i|\boldsymbol{\xi}\right) L(ξ)=L(r1,r2,,rn;ξ)=p(rξ)=ip(riξ)
  此时,观测r就是样本,而状态如位姿T就是待估计参数 L ( ξ ) L(\xi) L(ξ)就是样本的似然函数,也是事件{ R 1 = r 1 , R 2 = r 2 , ⋯ , R n = r n R_{1}=r_{1},R_{2}=r_{2},\cdots,R_{n} = r_{n} R1=r1,R2=r2,,Rn=rn}发生的概率.

  如果知道机器人状态的先验信息 p ( ξ ) p(\boldsymbol{\xi}) p(ξ),即GPS,轮速计等提供了状态的初始值。利用贝叶斯法则,有后验概率分布:
p ( ξ ∣ r ) = p ( r ∣ ξ ) p ( ξ ) p ( r ) p(\boldsymbol{\xi}|\mathbf{r})=\frac{p(\mathbf{r}|\boldsymbol{\xi})p(\boldsymbol{\xi})}{p(\mathbf{r})} p(ξr)=p(r)p(rξ)p(ξ)
  但实际情况中很难具体求出这个后验概率分布,所以只能估计最大后验概率,就像下面图中绿色的点。
ξ M A P = arg ⁡ max ⁡ ξ p ( ξ ∣ r ) \boldsymbol{\xi}_{\mathrm{MAP}}=\arg\max_{\boldsymbol{\xi}}p(\boldsymbol{\xi}|\mathbf{r}) ξMAP=argξmaxp(ξr)
在这里插入图片描述

ξ M A P = arg ⁡ max ⁡ ξ ∏ i p ( r i ∣ ξ ) p ( ξ ) \boldsymbol{\xi}_\mathrm{MAP}=\arg\max_\xi\prod_ip\left(\mathbf{r}_i|\boldsymbol{\xi}\right)p(\boldsymbol{\xi}) ξMAP=argξmaxip(riξ)p(ξ)
  进一步,在没有先验的情况下,最大后验估计MAP就是最大似然估计MLP,通俗讲,就是说在什么样的状态下,最可能产生现在观测状态到的数据

  对上面式子取对数,再取负,那么求原函数最大也就是求下式最小!
ξ M A P = arg ⁡ min ⁡ ξ [ − ∑ i log ⁡ p ( r i ∣ ξ ) − log ⁡ p ( ξ ) ] \boldsymbol{\xi}_\mathrm{MAP}=\arg\min_{\boldsymbol{\xi}}\left[-\sum_i\log p\left(\mathbf{r}_i|\boldsymbol{\xi}\right)-\log p(\boldsymbol{\xi})\right] ξMAP=argξmin[ilogp(riξ)logp(ξ)]
  假设观测值r服从多元高斯分布,对应最大似然估计–参数估计—以位姿为例,估计位姿均值和协方差。(因为高斯分布的均值出概率最大!)
p ( r i ∣ ξ ) = N ( μ i , Σ i ) , p ( ξ ) = N ( μ ξ , Σ ξ ) p\left(\mathbf{r}_i|\boldsymbol{\xi}\right)=\mathcal{N}\left(\boldsymbol{\mu}_i,\boldsymbol{\Sigma}_i\right),p\left(\boldsymbol{\xi}\right)=\mathcal{N}\left(\boldsymbol{\mu}_\xi,\boldsymbol{\Sigma}_\xi\right) p(riξ)=N(μi,Σi),p(ξ)=N(μξ,Σξ)
  对应到最小二乘里面,有如下形式
ξ M A P = argmin ⁡ ξ ∑ i ∥ r i − μ i ∥ Σ i 2 + ∥ ξ − μ ξ ∥ Σ ξ 2 \boldsymbol{\xi_\mathrm{MAP}}=\underset{\boldsymbol{\xi}}{\operatorname*{argmin}}\sum_i\|\mathbf{r}_i-\boldsymbol{\mu}_i\|_{\boldsymbol{\Sigma}_i}^2+\left\|\boldsymbol{\xi}-\boldsymbol{\mu}_\xi\right\|_{\boldsymbol{\Sigma}_\xi}^2 ξMAP=ξargminiriμiΣi2+ ξμξ Σξ2

1.2 协方差矩阵与信息矩阵

  十四讲中讲过协方差矩阵与信息矩阵的关系:由于观测之间应该是不相关的,那么相应的协方差矩阵就会“小”,对于的信息矩阵就会“大”,所以这个误差项会在问题中占有较高的权重。

参考论文:The humble Gaussian distribution里面的例子很形象

2 舒尔补应用:边际概率、条件概率

2.1 舒尔补

维基百科

给定任意的矩阵块 M,如下所示:

M = [ A B C D ] \mathbf{M}=\begin{bmatrix}\mathbf{A}&\mathbf{B}\\\mathbf{C}&\mathbf{D}\end{bmatrix} M=[ACBD]

1 如果,矩阵块 D 是可逆的,则 A − B D − 1 C \mathbf{A}-\mathbf{B}\mathbf{D}^{-1}\mathbf{C} ABD1C称之为D关于M舒尔补

2 如果,矩阵块 A 是可逆的,则 D − C A − 1 B \mathbf{D}-\mathbf{CA}^{-1}\mathbf{B} DCA1B称之为A关于M舒尔补

  舒尔补是用于把一个矩阵进行高斯消元,变为上三角或下三角矩阵

[ I 0 − C A − 1 I ] [ A B C D ] = [ A B 0 Δ A ] [ A B C D ] [ I − A − 1 B 0 I ] = [ A 0 C Δ A ] \left.\left[\begin{array}{cc}\mathbf{I}&\mathbf{0}\\-\mathbf{CA}^{-1}&\mathbf{I}\end{array}\right.\right]\left[\begin{array}{cc}\mathbf{A}&\mathbf{B}\\\mathbf{C}&\mathbf{D}\end{array}\right]=\left[\begin{array}{cc}\mathbf{A}&\mathbf{B}\\\mathbf{0}&\Delta_\mathbf{A}\end{array}\right]\\\left[\begin{array}{cc}\mathbf{A}&\mathbf{B}\\\mathbf{C}&\mathbf{D}\end{array}\right]\left[\begin{array}{cc}\mathbf{I}&-\mathbf{A}^{-1}\mathbf{B}\\\mathbf{0}&\mathbf{I}\end{array}\right]=\left[\begin{array}{cc}\mathbf{A}&0\\\mathbf{C}&\Delta_\mathbf{A}\end{array}\right] [ICA10I][ACBD]=[A0BΔA][ACBD][I0A1BI]=[AC0ΔA]
  其中, Δ A = D − C A − 1 B \Delta_\mathbf{A}=\mathbf{D}-\mathbf{C}\mathbf{A}^{-1}\mathbf{B} ΔA=DCA1B。联合起来就可以把矩阵变为对角矩阵:
[ I 0 − C A − 1 I ] [ A B C D ] [ I − A − 1 B 0 I ] = [ A 0 0 Δ A ] \left.\left[\begin{array}{cc}\mathbf{I}&\mathbf{0}\\-\mathbf{C}\mathbf{A}^{-1}&\mathbf{I}\end{array}\right.\right]\left[\begin{array}{cc}\mathbf{A}&\mathbf{B}\\\mathbf{C}&\mathbf{D}\end{array}\right]\left[\begin{array}{cc}\mathbf{I}&-\mathbf{A}^{-1}\mathbf{B}\\\mathbf{0}&\mathbf{I}\end{array}\right]=\left[\begin{array}{cc}\mathbf{A}&\mathbf{0}\\\mathbf{0}&\Delta_\mathbf{A}\end{array}\right] [ICA10I][ACBD][I0A1BI]=[A00ΔA]
  反之,也可以从对角矩阵恢复为矩阵M
[ I 0 C A − 1 I ] [ A 0 0 Δ A ] [ I A − 1 B 0 I ] = [ A B C D ] \left.\left[\begin{array}{cc}\mathbf{I}&\mathbf{0}\\\mathbf{CA}^{-1}&\mathbf{I}\end{array}\right.\right]\left[\begin{array}{cc}\mathbf{A}&\mathbf{0}\\\mathbf{0}&\Delta_\mathbf{A}\end{array}\right]\left[\begin{array}{cc}\mathbf{I}&\mathbf{A}^{-1}\mathbf{B}\\\mathbf{0}&\mathbf{I}\end{array}\right]=\left[\begin{array}{cc}\mathbf{A}&\mathbf{B}\\\mathbf{C}&\mathbf{D}\end{array}\right] [ICA10I][A00ΔA][I0A1BI]=[ACBD]
  利用这个舒尔补,也可以快速的求解矩阵M的逆:
[ A B C D ] − 1 = [ I − A − 1 B 0 I ] [ A − 1 0 0 Δ A − 1 ] [ I 0 − C A − 1 I ] \left.\left[\begin{array}{cc}\mathbf{A}&\mathbf{B}\\\mathbf{C}&\mathbf{D}\end{array}\right.\right]^{-1}=\left[\begin{array}{cc}\mathbf{I}&-\mathbf{A}^{-1}\mathbf{B}\\\mathbf{0}&\mathbf{I}\end{array}\right]\left[\begin{array}{cc}\mathbf{A}^{-1}&\mathbf{0}\\\mathbf{0}&\Delta_\mathbf{A}^{-1}\end{array}\right]\left[\begin{array}{cc}\mathbf{I}&\mathbf{0}\\-\mathbf{C}\mathbf{A}^{-1}&\mathbf{I}\end{array}\right] [ACBD]1=[I0A1BI][A100ΔA1][ICA10I]

2.2 舒尔补的应用

  假设多元变量 x 服从高斯分布,且由两部分组成 x = [ a b ] \left.\mathbf{x}=\left[\begin{array}{c}a\\b\end{array}\right.\right] x=[ab],变量之间构成的协方差矩阵为:
K = [ A C ⊤ C D ] \left.\mathbf{K}=\left[\begin{array}{cc}A&C^\top\\C&D\end{array}\right.\right] K=[ACCD]
  其中, A = cov ⁡ ( a , a ) , D = cov ⁡ ( b , b ) , C = cov ⁡ ( a , b ) A=\operatorname{cov}(a,a),D=\operatorname{cov}(b,b),C=\operatorname{cov}(a,b) A=cov(a,a),D=cov(b,b),C=cov(a,b),由此变量x的概率分布为:
P ( a , b ) = P ( a ) P ( b ∣ a ) ∝ exp ⁡ ( − 1 2 [ a b ] ⊤ [ A C ⊤ C D ] − 1 [ a b ] ) \left.\left.P(a,b)=P(a)P(b|a)\propto\exp\left(-\frac{1}{2}\left[\begin{array}{c}a\\b\end{array}\right.\right.\right]^\top\left[\begin{array}{cc}A&C^\top\\C&D\end{array}\right]^{-1}\left[\begin{array}{c}a\\b\end{array}\right]\right) P(a,b)=P(a)P(ba)exp(21[ab][ACCD]1[ab])
  舒尔补对协方差的逆进行分解,得到边际概率 p ( a ) \mathsf{p(a)} p(a)条件概率 p ( b ∣ a ) \mathrm{\color{#c00}{p(b|a)}} p(b∣a).
P ( a , b ) ∝ exp ⁡ ( − 1 2 [ a b ] ⊤ [ A C ⊤ C D ] − 1 [ a b ] ) ∝ exp ⁡ ( − 1 2 [ a b ] ⊤ [ I − A − 1 C ⊤ 0 I ] [ A − 1 0 0 Δ A − 1 ] [ I 0 − C A − 1 I ] [ a b ] ) ∝ exp ⁡ ( − 1 2 [ a ⊤ ( b − C A − 1 a ) ⊤ ] [ A − 1 0 0 Δ A − 1 ] [ a b − C A − 1 a ] ) ∝ exp ⁡ ( − 1 2 ( a ⊤ A − 1 a ) + ( b − C A − 1 a ) ⊤ Δ A − 1 ( b − C A − 1 a ) ) ∝ exp ⁡ ( − 1 2 a ⊤ A − 1 a ) ⏟ p ( a ) exp ⁡ ( − 1 2 ( b − C A − 1 a ) ⊤ Δ A − 1 ( b − C A − 1 a ) ) ⏟ p ( b ∣ a ) \begin{aligned} &P(a,b) \\ &\left.\left.\propto\exp\left(-\frac{1}{2}\left[\begin{array}{c}a\\b\end{array}\right.\right.\right]^\top\left[\begin{array}{cc}A&C^\top\\C&D\end{array}\right]^{-1}\left[\begin{array}{c}a\\b\end{array}\right]\right) \\ &\left.\left.\propto\exp\left(-\frac{1}{2}\left[\begin{array}{c}a\\b\end{array}\right.\right.\right]^\top\left[\begin{array}{cc}I&-A^{-1}C^\top\\0&I\end{array}\right]\left[\begin{array}{cc}A^{-1}&0\\0&\Delta_\mathrm{A}^{-1}\end{array}\right]\left[\begin{array}{cc}I&0\\-CA^{-1}&I\end{array}\right]\left[\begin{array}{c}a\\b\end{array}\right]\right) \\ &\left.\left.\propto\exp\left(-\frac{1}{2}\left[\begin{matrix}a^\top&(b-CA^{-1}a)^\top\\\end{matrix}\right.\right.\right]\left[\begin{array}{cc}A^{-1}&0\\0&\Delta_{\mathbf{A}}^{-1}\\\end{array}\right]\left[\begin{array}{c}a\\b-CA^{-1}a\\\end{array}\right]\right) \\ &\propto\exp\left(-\frac{1}{2}\left(a^\top A^{-1}a\right)+\left(b-CA^{-1}a\right)^\top\Delta_{\mathbf{A}}^{-1}\left(b-CA^{-1}a\right)\right) \\ &\propto\underbrace{\exp\left(-\frac{1}{2}a^\top A^{-1}a\right)}_{p(a)}\underbrace{\exp\left(-\frac{1}{2}\left(b-CA^{-1}a\right)^\top\Delta_{\mathbf{A}}^{-1}\left(b-CA^{-1}a\right)\right)}_{p(b|a)} \end{aligned} P(a,b)exp(21[ab][ACCD]1[ab])exp(21[ab][I0A1CI][A100ΔA1][ICA10I][ab])exp(21[a(bCA1a)][A100ΔA1][abCA1a])exp(21(aA1a)+(bCA1a)ΔA1(bCA1a))p(a) exp(21aA1a)p(ba) exp(21(bCA1a)ΔA1(bCA1a))

2.2.1 结论1

在这里插入图片描述

2.2.2 结论2

在这里插入图片描述

  就是说边际概率的协方差本来应该是A,它的信息矩阵就是 A − 1 A^{-1} A1。然后就是说,在两个变量的协方差矩阵的逆,信息矩阵的组成元素中,可以通过下面38式得到边际概率的信息矩阵。

在这里插入图片描述

  下面这个例子也能看出来,比如说,我们求变量x1x2的一个信息矩阵,利用x1x2x3的信息矩阵就可以直接求出来,相当于消除了变量x3!把左上角看作一个块,就可以代入上面的公式!代入公式刚好就是相应x1x2的信息矩阵!

在这里插入图片描述

2.2.3 总结

在这里插入图片描述

3 滑动窗口算法与边缘化 Marginalization

3.1 最小二乘的图表示

在这里插入图片描述

3.2 最小二乘问题信息矩阵的构成

  上面最小二乘的高斯牛顿解:
J ⊤ Σ − 1 J ⏟ H o r Λ δ ξ = − J ⊤ Σ − 1 r ⏟ b \underbrace{\mathbf{J}^{\top}\boldsymbol{\Sigma}^{-1}\mathbf{J}}_{\textbf{H }or\boldsymbol{\Lambda}}\delta\boldsymbol{\xi}=\underbrace{-\mathbf{J}^{\top}\boldsymbol{\Sigma}^{-1}\mathbf{r}}_{\mathbf{b}} orΛ JΣ1Jδξ=b JΣ1r
  其中,雅可比矩阵为:
J = ∂ r ∂ ξ = [ ∂ r 12 ∂ ξ ∂ r 13 ∂ ξ ∂ r 14 ∂ ξ ∂ r 15 ∂ ξ ∂ r 56 ∂ ξ ] = [ J 1 J 2 J 3 J 4 J 5 ] , J ⊤ = [ J 1 ⊤ J 2 ⊤ J 3 ⊤ J 4 ⊤ J 5 ⊤ ] \mathbf{J}=\frac{\partial\mathbf{r}}{\partial\boldsymbol{\xi}}=\begin{bmatrix}\frac{\partial\mathbf{r}_{12}}{\partial\boldsymbol{\xi}}\\\frac{\partial\mathbf{r}_{13}}{\partial\boldsymbol{\xi}}\\\frac{\partial\mathbf{r}_{14}}{\partial\boldsymbol{\xi}}\\\frac{\partial\mathbf{r}_{15}}{\partial\boldsymbol{\xi}}\\\frac{\partial\mathbf{r}_{56}}{\partial\boldsymbol{\xi}}\end{bmatrix}=\begin{bmatrix}\mathbf{J}_1\\\mathbf{J}_2\\\mathbf{J}_3\\\mathbf{J}_4\\\mathbf{J}_5\end{bmatrix},\mathbf{J}^\top=\begin{bmatrix}\mathbf{J}_1^\top&\mathbf{J}_2^\top&\mathbf{J}_3^\top&\mathbf{J}_4^\top&\mathbf{J}_5^\top\end{bmatrix} J=ξr= ξr12ξr13ξr14ξr15ξr56 = J1J2J3J4J5 ,J=[J1J2J3J4J5]

  除了写为一个大的矩阵,还可以把矩阵写为连加求和的形式:
( ∑ i = 1 5 J i ⊤ Σ i − 1 J i ) δ ξ = − ∑ i = 1 5 J ⊤ Σ i − 1 r (\sum_{i=1}^5\mathbf{J}_i^\top\boldsymbol{\Sigma}_i^{-1}\mathbf{J}_i)\delta\boldsymbol{\xi}=-\sum_{i=1}^5\mathbf{J}^\top\boldsymbol{\Sigma}_i^{-1}\mathbf{r} (i=15JiΣi1Ji)δξ=i=15JΣi1r
  矩阵乘法的分配率 ( A + B ) x = A x + B x = b 1 + b 2 = b (A+B)x=Ax+Bx = b_1+b_2 = b (A+B)x=Ax+Bx=b1+b2=b,所以求和形式相当于矩阵的加法,其并不会改变实际的结果。(因为优化变量x就是固定那几个,所以求和展开是等效的)。
  假设我有n个误差边,m个优化变量,n>>m,不论n是多大,雅可比矩阵也仍然是m*m,由n个叠加而成。(注意m是指多个优化变量雅可比的维度叠加,m=位姿6p+路标点3l)

3.3 信息矩阵的稀疏性

  很明显,不可能所有的状态之间都存在着关联,所以雅可比矩阵大概率是一个稀疏矩阵
在这里插入图片描述

3.4 信息矩阵组装过程的可视化

  上面我们已经得知,可以将残差的信息矩阵加起来得到最终的信息矩阵,其结果不变
在这里插入图片描述

3.5 基于边际概率(Marginalization)的滑动窗口算法

这里可以看崔华坤推导vins里面的例子,滑动窗口的特点就是不能随意的抛弃某一帧,要通过舒尔补的方式将其转换为先验信息,加入到剔除这一帧的信息矩阵中!

  随着 VSLAM 系统不断往新环境探索,就会有新的相机姿态以及看到新的环境特征,最小二乘残差就会越来越多,信息矩阵越来越大,计算量将不断增加。
  为了保持优化变量的个数在一定范围内,需要使用滑动窗口算法动态增加或移除优化变量。

滑动窗口算法大致流程

1 增加新的变量进入最小二乘系统优化

2 如果变量数目达到了一定的维度,则利用边际概率移除老的变量

3 SLAM 系统不断循环前面两步

  论文Exactly sparse extended information filters for feature-based SLAM,如果直接丢弃,会损失那部分状态所带来的先验信息,不能保留状态直接按的约束关系。

在这里插入图片描述

marginalization边缘化使得信息矩阵变得稠密!

在这里插入图片描述

崔华坤VINS推导里面有一个很形象的例子,可以参考。下面这个图和上面例子基本一致
在这里插入图片描述

3.6 VINS中的滑动窗口算法

VINS 根据次新帧是否为关键帧,分为两种边缘化策略:通过对比次新帧和次次新帧的视差量,来决定 marg次新帧或者最老帧

在这里插入图片描述

① 当次新帧为关键帧时,MARGIN_OLD,将 marg最老帧,及其看到的路标点和相关联的 IMU 数据,将其转化为先验信息加到整体的目标函数中

② 当次新帧不是关键帧时,MARGIN_SECOND_NEW,我们将直接扔掉次新帧及它的视觉观测边,而不对次新帧进行 marg,因为我们认为当前帧和次新帧很相似,也就是说当前帧跟路标点之间的约束和次新帧与路标点的约束很接近,直接丢弃并不会造成整个约束关系丢失过多信息。但是值得注意的是,我们要保留次新帧的 IMU 数据,从而保证 IMU 预积分的连贯性。

直接扔掉不会保留相应的观测信息,边缘化则是将其转换为先验信息

4 滑动窗口中的FEJ算法

4.1 滑动窗口算法导致的问题

	边缘化marg会导致优化变量2自身的信息矩阵由两部分组成

在这里插入图片描述

  滑动窗口算法中,对于同一个变量,不同残差对其计算雅克比矩阵时线性化点可能不一致,导致信息矩阵可以分成两部分,相当于在信息矩阵中多加了一些信息,使得其零空间出现了变化。进而多个解的问题,变成了一个确定解,不可观的变量,变成了可观。比如后续的纯视觉实验中,本来有7个自由度不可观,但因为增加了一些其它信息,只有5个自由度不可观。

在这里插入图片描述

4.2 可观性

4.2.1 什么是可观?

① 线性系统理论中的可观测性

  线性系统可观性是判断系统是否能由系统的观测得到的一种性质。

  一个线性系统是可观测的,当且仅当通过观测器可以从系统的输出推断出系统的全部状态信息。这意味着,如果系统的某些状态不能从输出中推断出来,那么该系统就是不可观测的。

  线性系统的可观测性可以通过判断系统的观测矩阵的秩来进行。具体而言,如果系统的观测矩阵(通常称为可观测矩阵)的秩等于系统状态的个数,则该系统是可观测的。反之,如果观测矩阵的秩小于状态的个数,则该系统是不可观测的。

  也可以通过下面的奇异值SVD分解来做这个事情,如果分解之后存在为0的奇异值,那么说明这个系统存在不可观的维度!因为矩阵H不满秩。

② SLAM系统中的可观测性

如果一个系统完全能观,其一定满秩,不会存在零空间。对于单目VO系统,我们要优化的是位姿、路标点等状态量,但是实际的测量值像素位置是不会发生变化的,也就是说,输出不能推断出系统的状态的全部可能性,这个系统是不可观测的!就是是对于的信息矩阵必然存在着零空间。

也可以从下面公式51理解,不同的状态,本来应该是不同的观测,但我们这里却是相同的观测,这个系统不然不可观。

每种系统都对应有着不可观的维度!

在这里插入图片描述

4.2.2 单目SLAM系统的可观性

单目SLAM姿态不可观是因为其绝对坐标系位置!我们给下面的旋转平移同时乘以一个变换矩阵T,它们之间的关系不会发生改变!我们不知道它具体再那个地方,也就是绝对坐标系未知!尺度就更好理解了,单目SLAM只能估计深度-尺度,不能得到准确的尺度信息!

关于IMU由于重力存在使得roll和pitch变得可观----以一个刚体为例,它垂直地面时候,重力垂直向下,没有其它方向的分力,但是它roll和pitch就会使得其它方向存在重力的分力!但是对于偏航角yaw来说,不管怎么转,重力都不会再这里有分力的存在,所以yaw也是不可观的!还有IMU是有尺度的,因为其可以测量加速度,就知道速度以及位移,只不过可能单独使用没那么准确

在这里插入图片描述

4.3 FEJ算法

  滑动窗口算法中,对于同一个变量,不同残差对其计算雅克比矩阵时线性化点可能不一致,导致信息矩阵可以分成两部分,相当于在信息矩阵中多加了一些信息,使得其零空间出现了变化。

  FEJ 算法:不同残差对同一个状态求雅克比时,线性化点必须一致。这样就能避免零空间退化而使得不可观变量变得可观

在这里插入图片描述

注意VINS里面没有使用

5 滑动窗口算法中关键问题

如何更新先验残差

目的:虽然先验信息矩阵固定不变,但随着迭代的推进,变量被不断优化,先验残差需要跟随变化。否则,求解系统可能奔溃。

——直白点说,如果残差不变化,意味着优化变量虽然在变,但对系统没啥效果,我们本来的目的就是找到一个让残差不断变小的方向去优化变量,但此时算法可能找到方向了,但残差不发生变化,导致算法认为方向错误,这样系统可能会崩溃!

——在滑动窗口算法中,当前还在窗口内的变量其残差肯定是可以计算的,但之前的信息、状态已经被丢弃了,也就是带来的先验残差应该如何更新?

[ I − H p m H m m − 1 0 I ] [ H p p H p m H m p H m m ] [ Δ x p ∗ Δ x c ∗ ] = [ I − H p m H m m − 1 0 I ] [ b p p b m m ] . \begin{bmatrix}I&-H_{pm}H_{mm}^{-1}\\0&I\end{bmatrix}\begin{bmatrix}H_{pp}&H_{pm}\\H_{mp}&H_{mm}\end{bmatrix}\begin{bmatrix}\Delta x_\mathrm{p}^{*}\\\Delta x_c^{*}\end{bmatrix}=\begin{bmatrix}I&-H_{pm}H_{mm}^{-1}\\0&I\end{bmatrix}\begin{bmatrix}b_{pp}\\b_{mm}\end{bmatrix}. [I0HpmHmm1I][HppHmpHpmHmm][ΔxpΔxc]=[I0HpmHmm1I][bppbmm].

[ ( H p p − H p m H m m − 1 H m p ) 0 H m p H m m ] [ Δ x p ∗ Δ x c ∗ ] = [ b p p − H p m H m m − 1 b m m b m m ] \begin{bmatrix}\left(H_{pp}-H_{pm}H_{mm}^{-1}H_{mp}\right)&\mathbf{0}\\H_{mp}&H_{mm}\end{bmatrix}\begin{bmatrix}\Delta x_\mathrm{p}^{*}\\\Delta x_c^{*}\end{bmatrix}=\begin{bmatrix}b_{pp}-H_{pm}H_{mm}^{-1}b_{mm}\\b_{mm}\end{bmatrix} [(HppHpmHmm1Hmp)Hmp0Hmm][ΔxpΔxc]=[bppHpmHmm1bmmbmm]

​ 就是要注意到不仅信息矩阵中添加了之前变量的先验信息,残差中也带来了先验残差

方法:先验残差的变化可以使用一阶泰勒近似。这样不断更新残差,使其呈现下降趋势

b p ′ = b p + ∂ b p ∂ x p δ x p = b p + ∂ ( − J ⊤ Σ − 1 r ) ∂ x p δ x p = b p − Λ p δ x p \begin{aligned} \mathbf{b}_\mathrm{p}^{\prime}& \mathbf{=b_p}+\frac{\partial\mathbf{b_p}}{\partial\mathbf{x_p}}\delta\mathbf{x_p} \\ &=\mathbf{b}_\mathrm{p}+\frac{\partial\left(-\mathbf{J}^\top\mathbf{\Sigma}^{-1}\mathbf{r}\right)}{\partial\mathbf{x}_\mathrm{p}}\delta\mathbf{x}_\mathrm{p} \\ &\mathbf{=b_p-\Lambda_p\delta x_p} \end{aligned} bp=bp+xpbpδxp=bp+xp(JΣ1r)δxp=bpΛpδxp

6 作业

6.1

在这里插入图片描述

懒得画了,参考别人
在这里插入图片描述

6.2 补充程序

这里其实要证明的一件事情就是单目BA的信息矩阵H,其奇异值最后7维接近于0,也就是说明有7个维度是不可以观测的,零空间维度是7。----对应6自由度姿态+尺度

  奇异值分解(Singular Value Decomposition,SVD)可以用来分析矩阵的可观性和不可观性。

  对于一个线性系统,如果它的状态完全可以通过观测得到,那么称该系统是可观的。反之,如果存在一些状态无法被观测到,那么称该系统是不可观的。

  假设我们有一个线性系统的状态方程为x_dot = Ax + Bu,其中x表示状态向量,u表示控制输入。如果我们可以通过观测某些输出y来确定状态x,则该系统是可观的。这意味着我们可以找到一个观测矩阵C,使得y = Cx。

  现在,假设我们想要确定一个线性系统的可观性。我们可以使用奇异值分解来实现。具体地说,我们可以对矩阵C进行奇异值分解。如果矩阵C的奇异值中存在为0的奇异值,那么该系统是不可观的。反之,如果所有的奇异值都大于0,那么该系统是可观的。

  因此,奇异值分解可以用来分析线性系统的可观性和不可观性。

还有那个海瑟矩阵该怎么填

注意单目SLAM中只有对位姿和路标点的雅可比,所以就可以下为下面的形式----还有它这里相当于假设每个位姿都观测到所有的路标点

H.block(i*6,i*6,6,6) += jacobian_Ti.transpose() * jacobian_Ti;
/// 请补充完整作业信息矩阵块的计算
H.block(j*3 + 6*poseNums,j*3 + 6*poseNums,3,3) +=jacobian_Pj.transpose() * jacobian_Pj;
H.block(i*6,j*3 + 6*poseNums, 6,3) += jacobian_Ti.transpose() * jacobian_Pj;
H.block(j*3 + 6*poseNums,i*6 , 3,6) += jacobian_Pj.transpose() * jacobian_Ti;

在这里插入图片描述

HΔx=0实际验证了这件事情----奇异值从大到小进行排序!

     147.51129.146108.42...0.005023410.00484340.004510830.00426270.003862230.003516510.003029630.002534590.002302460.00172459
0.000422374
3.21708e-17
2.06732e-17
1.43188e-17
7.66992e-18
6.08423e-18
6.05715e-18
3.94363e-18

程序

#include <iostream>
#include <vector>
#include <random>  
#include <Eigen/Core>
#include <Eigen/Geometry>
#include <Eigen/Eigenvalues>struct Pose
{Pose(Eigen::Matrix3d R, Eigen::Vector3d t):Rwc(R),qwc(R),twc(t) {};Eigen::Matrix3d Rwc;Eigen::Quaterniond qwc;Eigen::Vector3d twc;
};int main()
{int featureNums = 20;       // 路标点数int poseNums = 10;          // 姿态数量// 对位姿的雅可比分为旋转和平移两部分,单目SLAM中是一个2*6的矩阵;对于路标点的雅可比是一个2*3的矩阵int diem = poseNums * 6 + featureNums * 3;      // 10*6+20*3=120double fx = 1.;     // 焦距f分别在x,y轴方向等价的像素个数double fy = 1.;Eigen::MatrixXd H(diem,diem);   // H = J^T*JH.setZero();std::vector<Pose> camera_pose;double radius = 8;// 这里就是模拟了10个姿态,旋转范围绕z轴旋转90°,平均到10个姿态里面,旋转矩阵Rwc,典型的绕动轴旋转。// 平移量xy肯定是负的,画个图就能看出来。以最开始为世界系,后面旋转为相机系for(int n = 0; n < poseNums; ++n ) {double theta = n * 2 * M_PI / ( poseNums * 4); // 1/4 圆弧// 绕 z轴 旋转Eigen::Matrix3d R;R = Eigen::AngleAxisd(theta, Eigen::Vector3d::UnitZ());// 每次还要进行一定量xyz上面的平移,Eigen::Vector3d t = Eigen::Vector3d(radius * cos(theta) - radius, radius * sin(theta), 1 * sin(2 * theta));camera_pose.push_back(Pose(R,t));}// 随机数生成20个三维特征点std::default_random_engine generator;std::vector<Eigen::Vector3d> points;for(int j = 0; j < featureNums; ++j){std::uniform_real_distribution<double> xy_rand(-4, 4.0);std::uniform_real_distribution<double> z_rand(8., 10.);double tx = xy_rand(generator);double ty = xy_rand(generator);double tz = z_rand(generator);Eigen::Vector3d Pw(tx, ty, tz);points.push_back(Pw);for (int i = 0; i < poseNums; ++i) {Eigen::Matrix3d Rcw = camera_pose[i].Rwc.transpose();Eigen::Vector3d Pc = Rcw * (Pw - camera_pose[i].twc);double x = Pc.x();double y = Pc.y();double z = Pc.z();double z_2 = z * z;Eigen::Matrix<double,2,3> jacobian_uv_Pc;jacobian_uv_Pc<< fx/z, 0 , -x * fx/z_2,0, fy/z, -y * fy/z_2;Eigen::Matrix<double,2,3> jacobian_Pj = jacobian_uv_Pc * Rcw;Eigen::Matrix<double,2,6> jacobian_Ti;jacobian_Ti << -x* y * fx/z_2, (1+ x*x/z_2)*fx, -y/z*fx, fx/z, 0 , -x * fx/z_2,-(1+y*y/z_2)*fy, x*y/z_2 * fy, x/z * fy, 0,fy/z, -y * fy/z_2;H.block(i*6,i*6,6,6) += jacobian_Ti.transpose() * jacobian_Ti;/// 请补充完整作业信息矩阵块的计算H.block(j*3 + 6*poseNums,j*3 + 6*poseNums,3,3) +=jacobian_Pj.transpose() * jacobian_Pj;H.block(i*6,j*3 + 6*poseNums, 6,3) += jacobian_Ti.transpose() * jacobian_Pj;H.block(j*3 + 6*poseNums,i*6 , 3,6) += jacobian_Pj.transpose() * jacobian_Ti;}}//    std::cout << H << std::endl;
//    Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> saes(H);
//    std::cout << saes.eigenvalues() <<std::endl;// 奇异值分解Eigen::JacobiSVD<Eigen::MatrixXd> svd(H, Eigen::ComputeThinU | Eigen::ComputeThinV);// 调用svd对象的singularValues()成员函数,矩阵H的奇异值std::cout << svd.singularValues() <<std::endl;// 于一个矩阵而言,它的奇异值越大,表示它的特征、结构和变换等信息越重要。// 而奇异值越小,则说明这部分信息对矩阵的影响越小return 0;
}

这篇关于VIO第4讲:基于滑动窗口法的vio系统可观性与一致性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/743276

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景