欢迎光临
我们一直在努力

VIINS源码解读 -- 第 13 篇 · 边缘化原理(上)- 舒尔补与先验构建

· 本篇你将学到

  • 为何边缘化:滑窗丢帧若直接删,共视路标与 IMU 约束随之丢失,信息断层–边缘化用边际概率把出窗变量信息压缩成对保留变量的先验;
  • 两种丢帧策略:MARGIN_OLD(关键帧丢最老,完整舒尔补边缘化)vs MARGIN_SECOND_NEW(非关键帧丢次新,直接丢弃+合并预积分,不舒尔补);
  • 舒尔补:分块信息矩阵 H=[Hmm,Hmr;Hrm,Hrr]H=[H_{mm},H_{mr};H_{rm},H_{rr}]H=[Hmm,Hmr;Hrm,Hrr] 消去边缘化变量,得保留变量边际信息 Hr=Hrr−HrmHmm−1HmrH_r=H_{rr}-H_{rm}H_{mm}^{-1}H_{mr}Hr=HrrHrmHmm1Hmr
  • 先验表达:边际高斯转成 r=e0+Jmarg(xr−x0)r=e_0+J_{\\text{marg}}(x_r-x_0)r=e0+Jmarg(xrx0),linearized_jacobians+linearized_residuals,作为 MarginalizationFactor 挂回 BA;
  • FEJ:先验雅可比固定为第一次估计值,规避线性化不一致与 nullspace 膨胀。

  • 一、为何需要边缘化

    第 10 篇 established:滑动窗口固定大小(WINDOW_SIZE=10,11 帧),新帧入窗必须丢一帧。问题是–丢掉的帧携带的信息怎么办?

    考虑要丢掉最老帧 f0f_0f0f0f_0f0 与窗口内其他帧的关联:

    • IMU 预积分:f0→f1f_0 \\to f_1f0f1 的预积分约束 f0f_0f0f1f_1f1 的状态(第 11 篇);
    • 视觉共视:f0f_0f0 观测的某些路标,可能在 f2,f3,…f_2,f_3,\\dotsf2,f3, 仍被观测(第 12 篇);
    • 上轮先验:上一轮边缘化留下的先验约束也可能涉及 f0f_0f0

    若直接删 f0f_0f0 的状态变量,这些约束的参数块少了一个,残差无法计算–约束失效。等于白白丢弃了 f0f_0f0 观测时段的全部信息,窗口越滑信息越少,估计退化。

    边缘化(marginalization)的解法:不直接删,而是用边际概率把 f0f_0f0 的变量"积分掉",把它对剩余变量的影响浓缩成一个先验约束,挂回 BA。这样信息不丢,窗口又能滑动。

    类比:联合概率 p(x0,x1,…,xn)p(x_0, x_1, \\dots, x_n)p(x0,x1,,xn) 里积分掉 x0x_0x0 得边际 p(x1,…,xn)=∫p(x0,…,xn) dx0p(x_1,\\dots,x_n)=\\int p(x_0,\\dots,x_n)\\,dx_0p(x1,,xn)=p(x0,,xn)dx0x0x_0x0 虽消失,但它对 x1,…,xnx_1,\\dots,x_nx1,,xn 的影响保留在边际分布里。边缘化即此操作的线性高斯版本。

    与 BA 求解中舒尔补的区别

    BA 求解时也用舒尔补(如 DENSE_SCHUR,第 15 篇)–那是求解技巧:消去路标变量加速方程求解,路标事后回代,变量不丢。边缘化的舒尔补是概率操作:积分掉变量,变量永久消失,只剩先验。两者数学同源(舒尔补),目的不同。


    二、丢最老帧 vs 丢次新帧

    第 4 篇关键帧判据决定 marginalization_flag,对应两种丢帧策略,边缘化处理截然不同:

    2.1 MARGIN_OLD(关键帧,丢最老帧)

    当前帧视差大/信息足,是关键帧,应保留。丢窗口最老帧 f0f_0f0,其余左移,新帧入末尾(第 10 篇图)。

    边缘化对象:f0f_0f0 的状态 [p0,q0,v0,ba,0,bg,0][p_0,q_0,v_0,b_{a,0},b_{g,0}][p0,q0,v0,ba,0,bg,0](16 维局部)+ f0f_0f0 独有的路标(仅 f0f_0f0 观测、窗口内无其他帧共视的)。这些变量要被积分掉,信息经舒尔补转成对保留变量(f1…f10f_1\\dots f_{10}f1f10 + 共视路标)的先验。

    → 触发完整舒尔补边缘化,更新 last_marginalization_info(本轮先验)。

    2.2 MARGIN_SECOND_NEW(非关键帧,丢次新帧)

    当前帧与上一帧重复(静止/纯旋转),是非关键帧。直接丢掉次新帧 f9f_9f9(上一帧),新帧替换其位置。

    为何不边缘化:次新帧 f9f_9f9 与最新帧 f10f_{10}f10 几乎重复观测同一场景,f9f_9f9 的约束可被 f10f_{10}f10 完全替代–丢弃 f9f_9f9 不损失信息。处理方式:把 f9→f10f_9 \\to f_{10}f9f10 的 IMU 预积分合并进 f10f_{10}f10 的预积分,f9f_9f9 状态直接删除,不调用舒尔补。

    → 不生成新的边缘化先验,沿用上一轮 last_marginalization_info。

    2.3 对比

    MARGIN_OLDMARGIN_SECOND_NEW
    触发 关键帧(视差大) 非关键帧(重复)
    丢谁 最老帧 f0f_0f0 次新帧 f9f_9f9
    舒尔补 ✅ 完整边缘化 ❌ 直接丢弃
    先验更新 更新 last_marginalization_info 沿用上轮
    IMU 预积分 f0→f1f_0\\to f_1f0f1 进先验 f9→f10f_9\\to f_{10}f9f10 合并入 f10f_{10}f10

    关键结论:边缘化先验只在丢最老帧时更新。丢次新帧是无损的"窗口压缩"。这解释了为何静止场景下(频繁 MARGIN_SECOND_NEW)先验长期不变。


    三、边缘化的概率基础:边际分布

    3.1 联合信息矩阵

    把所有与被边缘化变量相关的残差块(IMU 残差、视觉残差、上轮先验)聚合。每个残差 rir_iri 对状态 x=[xm;xr]x=[x_m; x_r]x=[xm;xr]xmx_mxm 边缘化变量、xrx_rxr 保留变量)有雅可比 JiJ_iJi,信息加权后贡献信息矩阵:

    H=∑iJi⊤Σi−1Ji=[HmmHmrHrmHrr],b=∑iJi⊤Σi−1ri=[bmbr]
    H = \\sum_i J_i^\\top \\Sigma_i^{-1} J_i = \\begin{bmatrix} H_{mm} & H_{mr} \\\\ H_{rm} & H_{rr} \\end{bmatrix},\\qquad b = \\sum_i J_i^\\top \\Sigma_i^{-1} r_i = \\begin{bmatrix} b_m \\\\ b_r \\end{bmatrix}
    H=iJiΣi1Ji=[HmmHrmHmrHrr],b=iJiΣi1ri=[bmbr]

    其中 HmmH_{mm}Hmmm×mm\\times mm×m)是边缘化变量块,HrrH_{rr}Hrrn×nn\\times nn×n)是保留变量块,Hmr=Hrm⊤H_{mr}=H_{rm}^\\topHmr=Hrm 是耦合块。

    3.2 边际分布

    联合高斯 p(xm,xr)∝exp⁡(−12∥x−x^∥H2)p(x_m,x_r)\\propto\\exp(-\\tfrac12\\|x-\\hat x\\|_H^2)p(xm,xr)exp(21xx^H2)。边缘化 xmx_mxm 即积分:

    p(xr)=∫p(xm,xr) dxm
    p(x_r) = \\int p(x_m, x_r)\\,dx_m
    p(xr)=p(xm,xr)dxm

    高斯分布的边际仍是高斯。其信息矩阵与残差由舒尔补给出(下一节)。

    推导留白:边际分布的均值/协方差推导见 Hager 或 Kummerle 的因子图教程。本篇直接用结论:边际信息矩阵 = 舒尔补。


    四、舒尔补详解

    4.1 舒尔补公式

    对分块矩阵 H=[Hmm,Hmr;Hrm,Hrr]H=[H_{mm},H_{mr};H_{rm},H_{rr}]H=[Hmm,Hmr;Hrm,Hrr],消去 xmx_mxm 后保留变量 xrx_rxr 的边际信息矩阵:

      Hr=Hrr−Hrm Hmm−1 Hmr  
    \\boxed{\\;H_r = H_{rr} – H_{rm}\\,H_{mm}^{-1}\\,H_{mr}\\;}
    Hr=HrrHrmHmm1Hmr

    br′=br−Hrm Hmm−1 bm
    b_r' = b_r – H_{rm}\\,H_{mm}^{-1}\\,b_m
    br=brHrmHmm1bm

    HrH_rHr 即保留变量的边际信息矩阵,br′b_r'br 是对应的边际残差向量。边际分布 p(xr)∝exp⁡(−12(xr−x^r)⊤Hr(xr−x^r))p(x_r)\\propto\\exp(-\\tfrac12(x_r-\\hat x_r)^\\top H_r (x_r-\\hat x_r))p(xr)exp(21(xrx^r)Hr(xrx^r))

    4.2 舒尔补分块图

    [HmmHmrHrmHrr]⏟联合信息矩阵 H  →舒尔补消去 xm  Hrr−HrmHmm−1Hmr⏟边际信息矩阵 Hr
    \\underbrace{\\begin{bmatrix} H_{mm} & H_{mr} \\\\ H_{rm} & H_{rr} \\end{bmatrix}}_{\\text{联合信息矩阵 } H}
    \\;\\xrightarrow{\\text{舒尔补消去 } x_m}\\;
    \\underbrace{H_{rr} – H_{rm}H_{mm}^{-1}H_{mr}}_{\\text{边际信息矩阵 } H_r}
    联合信息矩阵 H[HmmHrmHmrHrr]舒尔补消去 xm边际信息矩阵 HrHrrHrmHmm1Hmr

    各块含义:

    块含义舒尔补后的去向
    HmmH_{mm}Hmm 边缘化变量自信息 Hmm−1H_{mm}^{-1}Hmm1 求逆后消去
    Hmr/HrmH_{mr}/H_{rm}Hmr/Hrm 边缘化-保留耦合 HrmHmm−1HmrH_{rm}H_{mm}^{-1}H_{mr}HrmHmm1Hmr 注入 HrH_rHr
    HrrH_{rr}Hrr 保留变量自信息 保留,减去注入的耦合部分

    图 1 · 舒尔补流程(边缘化与先验构建)

    联合信息矩阵 H 按保留/边缘化变量分块,经舒尔补消去边缘化变量 xmx_mxm 得到保留变量的边际信息矩阵 HrH_rHr,再转成「雅可比+残差」先验因子挂回 BA。图中配色区分三类块:绿色=保留块 HrrH_{rr}Hrr、橙色=边缘化块 HmmH_{mm}Hmm、黄色=交叉块 Hmr/HrmH_{mr}/H_{rm}Hmr/Hrm

    #mermaid-svg-hYSol0AwXFyf70Ph{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hYSol0AwXFyf70Ph .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hYSol0AwXFyf70Ph .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hYSol0AwXFyf70Ph .error-icon{fill:#552222;}#mermaid-svg-hYSol0AwXFyf70Ph .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hYSol0AwXFyf70Ph .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hYSol0AwXFyf70Ph .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hYSol0AwXFyf70Ph .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hYSol0AwXFyf70Ph .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hYSol0AwXFyf70Ph .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hYSol0AwXFyf70Ph .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hYSol0AwXFyf70Ph .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hYSol0AwXFyf70Ph .marker.cross{stroke:#333333;}#mermaid-svg-hYSol0AwXFyf70Ph svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hYSol0AwXFyf70Ph p{margin:0;}#mermaid-svg-hYSol0AwXFyf70Ph .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-hYSol0AwXFyf70Ph .cluster-label text{fill:#333;}#mermaid-svg-hYSol0AwXFyf70Ph .cluster-label span{color:#333;}#mermaid-svg-hYSol0AwXFyf70Ph .cluster-label span p{background-color:transparent;}#mermaid-svg-hYSol0AwXFyf70Ph .label text,#mermaid-svg-hYSol0AwXFyf70Ph span{fill:#333;color:#333;}#mermaid-svg-hYSol0AwXFyf70Ph .node rect,#mermaid-svg-hYSol0AwXFyf70Ph .node circle,#mermaid-svg-hYSol0AwXFyf70Ph .node ellipse,#mermaid-svg-hYSol0AwXFyf70Ph .node polygon,#mermaid-svg-hYSol0AwXFyf70Ph .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hYSol0AwXFyf70Ph .rough-node .label text,#mermaid-svg-hYSol0AwXFyf70Ph .node .label text,#mermaid-svg-hYSol0AwXFyf70Ph .image-shape .label,#mermaid-svg-hYSol0AwXFyf70Ph .icon-shape .label{text-anchor:middle;}#mermaid-svg-hYSol0AwXFyf70Ph .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hYSol0AwXFyf70Ph .rough-node .label,#mermaid-svg-hYSol0AwXFyf70Ph .node .label,#mermaid-svg-hYSol0AwXFyf70Ph .image-shape .label,#mermaid-svg-hYSol0AwXFyf70Ph .icon-shape .label{text-align:center;}#mermaid-svg-hYSol0AwXFyf70Ph .node.clickable{cursor:pointer;}#mermaid-svg-hYSol0AwXFyf70Ph .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hYSol0AwXFyf70Ph .arrowheadPath{fill:#333333;}#mermaid-svg-hYSol0AwXFyf70Ph .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hYSol0AwXFyf70Ph .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hYSol0AwXFyf70Ph .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hYSol0AwXFyf70Ph .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hYSol0AwXFyf70Ph .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hYSol0AwXFyf70Ph .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hYSol0AwXFyf70Ph .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hYSol0AwXFyf70Ph .cluster text{fill:#333;}#mermaid-svg-hYSol0AwXFyf70Ph .cluster span{color:#333;}#mermaid-svg-hYSol0AwXFyf70Ph div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hYSol0AwXFyf70Ph .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hYSol0AwXFyf70Ph rect.text{fill:none;stroke-width:0;}#mermaid-svg-hYSol0AwXFyf70Ph .icon-shape,#mermaid-svg-hYSol0AwXFyf70Ph .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hYSol0AwXFyf70Ph .icon-shape p,#mermaid-svg-hYSol0AwXFyf70Ph .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hYSol0AwXFyf70Ph .icon-shape rect,#mermaid-svg-hYSol0AwXFyf70Ph .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hYSol0AwXFyf70Ph .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hYSol0AwXFyf70Ph .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hYSol0AwXFyf70Ph :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-hYSol0AwXFyf70Ph .keep>*{fill:#efe!important;stroke:#3c3!important;}#mermaid-svg-hYSol0AwXFyf70Ph .keep span{fill:#efe!important;stroke:#3c3!important;}#mermaid-svg-hYSol0AwXFyf70Ph .cross>*{fill:#ffe!important;stroke:#fc6!important;}#mermaid-svg-hYSol0AwXFyf70Ph .cross span{fill:#ffe!important;stroke:#fc6!important;}#mermaid-svg-hYSol0AwXFyf70Ph .margin>*{fill:#fee!important;stroke:#f88!important;}#mermaid-svg-hYSol0AwXFyf70Ph .margin span{fill:#fee!important;stroke:#f88!important;}

    联合信息矩阵 H = Σ JiᵀΣ⁻¹Ji(残差聚合)

    求 Hmm⁻¹

    耦合注入

    耦合注入

    保留,减去注入

    Hmm 边缘化块

    Hmr 交叉块

    Hrm 交叉块

    Hrr 保留块

    Hmm⁻¹特征分解+eps截断

    舒尔补Hr = Hrr − Hrm·Hmm⁻¹·Hmr

    Hr 边际信息矩阵(保留变量)

    先验 p(xr)雅可比+残差

    先验因子挂回BAMarginalizationFactor

    4.3 几何直觉

    HrrH_{rr}Hrr 是保留变量"自己"的信息,HrmHmm−1HmrH_{rm}H_{mm}^{-1}H_{mr}HrmHmm1Hmr 是"经由边缘化变量传过来的耦合信息"。舒尔补把后者从前者中扣除–因为边缘化变量被积分掉后,它原本提供的独立约束不能再算全额(其不确定性已被边际化放大)。结果 HrH_rHrHrrH_{rr}Hrr 小,保留变量的不确定性略增(信息略减),但 xmx_mxm 的影响被正确保留。

    4.4 数值实现

    Hmm−1H_{mm}^{-1}Hmm1 不显式求逆(数值不稳),而是对 HHH 做 LDLT 分解,通过解方程组 Hmm−1HmrH_{mm}^{-1}H_{mr}Hmm1Hmr 等完成舒尔补。VINS 还用多线程(NUM_THREADS=4,marginalization_factor.h:22)分块累加 HHH。具体代码第 14 篇精读 MarginalizationInfo::marginalize()。


    五、先验表达:雅可比 + 残差

    5.1 从边际高斯到先验残差

    舒尔补得边际高斯 p(xr)∼N(x^r,Hr−1)p(x_r)\\sim\\mathcal{N}(\\hat x_r, H_r^{-1})p(xr)N(x^r,Hr1)。但 Ceres 优化需要残差+雅可比形式,而非协方差。转换:

    边际分布的对数似然(去掉常数):

    −ln⁡p(xr)∝12(xr−x^r)⊤Hr(xr−x^r)=12∥Jmarg(xr−x^r)∥2
    -\\ln p(x_r) \\propto \\tfrac12 (x_r-\\hat x_r)^\\top H_r (x_r-\\hat x_r) = \\tfrac12 \\|J_{\\text{marg}}(x_r-\\hat x_r)\\|^2
    lnp(xr)21(xrx^r)Hr(xrx^r)=21Jmarg(xrx^r)2

    其中 JmargJ_{\\text{marg}}JmargHrH_rHr 的 Cholesky 因子(Jmarg⊤Jmarg=HrJ_{\\text{marg}}^\\top J_{\\text{marg}} = H_rJmargJmarg=Hr)。故先验残差:

      rprior=e0+Jmarg (xr−x0)  
    \\boxed{\\;r_{\\text{prior}} = e_0 + J_{\\text{marg}}\\,(x_r – x_0)\\;}
    rprior=e0+Jmarg(xrx0)

    • x0x_0x0:边缘化时的线性化点(parameter_block_data);
    • e0e_0e0:边缘化时的残差(linearized_residuals);
    • JmargJ_{\\text{marg}}Jmarg:先验雅可比,由 HrH_rHr Cholesky 得(linearized_jacobians)。

    5.2 作为先验因子挂回 BA

    MarginalizationFactor(marginalization_factor.h:85)封装这个先验,作为 Ceres CostFunction 挂回下次 BA:

    • Evaluate:rprior=e0+Jmarg(para−x0)r_{\\text{prior}} = e_0 + J_{\\text{marg}}(\\text{para} – x_0)rprior=e0+Jmarg(parax0),雅可比即 JmargJ_{\\text{marg}}Jmarg(固定);
    • 参数块:所有保留变量(keep_block_data 对应的状态)。

    于是下一轮 BA 的代价函数(第 11 篇总览)里多了 ∥rmarg∥2\\|r_{\\text{marg}}\\|^2rmarg2 项,把历史信息软约束进来。

    5.3 与第 11/12 篇残差的聚合

    边缘化时聚合的残差块包括:

    • 被边缘化帧相关的 IMU 残差(第 11 篇 IMUFactor);
    • 被边缘化帧观测的视觉残差(第 12 篇 ProjectionFactor);
    • 上轮先验(若涉及被边缘化帧)。

    这些残差的雅可比/残差由 ResidualBlockInfo::Evaluate(marginalization_factor.h:29)计算,聚合进 HHH。drop_set(:34)标记每个残差块里哪些参数块属于 xmx_mxm(要丢)。第 14 篇详述。


    六、FEJ:固定第一次估计雅可比

    6.1 线性化不一致问题

    边缘化先验在线性化点 x0x_0x0 处展开,雅可比 JmargJ_{\\text{marg}}Jmarg 是那里的导数。但下一轮 BA 迭代时,状态 xxx 会更新偏离 x0x_0x0。若先验雅可比随当前 xxx 重新计算(正常 BA 做法),会出现线性化不一致:

    • 先验信息矩阵 HrH_rHr 是在 x0x_0x0 算的;
    • 新残差雅可比是在新 xxx 算的;
    • 两者拼在同一优化里,信息矩阵的零空间(不可观测方向)会被错误"填充"–原本不可观测的方向(如全局 yaw)被先验错误约束,导致nullspace 膨胀、估计漂移。

    6.2 FEJ(First Estimate Jacobian)

    解法:先验因子的雅可比固定为边缘化时的 JmargJ_{\\text{marg}}Jmarg(第一次估计),不随迭代更新。即 MarginalizationFactor::Evaluate 永远返回同一个 JmargJ_{\\text{marg}}Jmarg(linearized_jacobians 常量),只有残差 e0+Jmarg(x−x0)e_0 + J_{\\text{marg}}(x-x_0)e0+Jmarg(xx0)xxx 线性变化。

    这样所有残差(先验 + 新 IMU/视觉)的信息矩阵都在同一 x0x_0x0 线性化,零空间一致,可观测性保持。

    代价:FEJ 牺牲了二阶精度(雅可比不随 xxx 更新),但保证了可观性一致性–对 SLAM 这种弱可观系统更重要。VINS 采用 FEJ。

    6.3 何时失效

    若状态偏离 x0x_0x0 过远,FEJ 的线性化误差累积,先验变得不准。VINS 通过滑窗持续滑动(每丢一帧重新边缘化、重置 x0x_0x0)来限制这种漂移–先验"保质期"大致一个滑窗周期。


    七、边缘化的代价与局限

    问题说明缓解
    线性化误差 先验在 x0x_0x0 线性化,xxx 漂远则误差大 滑窗周期性重新边缘化重置 x0x_0x0
    数值稳定性 Hmm−1H_{mm}^{-1}Hmm1 可能病态(弱约束变量) LDLT 分解 + 阈值截断(eps=1e-8,:80)
    nullspace FEJ 缓解但不彻底,平面运动等退化场景仍可能膨胀 退化检测(第 17 篇局限性)
    计算开销 舒尔补 O(m3+n2m)O(m^3+n^2 m)O(m3+n2m),多线程加速 NUM_THREADS=4 分块累加
    先验污染 错误初始化/外点会经先验传播 failureDetection(estimator.cpp:955)+ 外点剔除(第 4 篇)

    工程权衡:边缘化是紧耦合 VIO 的"记忆",让窗口外的信息持续发挥作用;但它是线性高斯近似的"记忆",会失真、会累积。VINS 的设计在"保留信息"与"避免污染"间走钢丝–第 14 篇代码会看到大量为这个权衡服务的工程细节(valid 标志、drop_set 管理、线程化舒尔补等)。


    小结与下一篇预告

    本篇完成边缘化的理论铺垫:

  • 为何:丢帧不丢信息,边际概率浓缩历史约束;
  • 两种策略:MARGIN_OLD 完整舒尔补、MARGIN_SECOND_NEW 直接丢弃+合并预积分;
  • 舒尔补:Hr=Hrr−HrmHmm−1HmrH_r=H_{rr}-H_{rm}H_{mm}^{-1}H_{mr}Hr=HrrHrmHmm1Hmr,消去边缘化变量得边际信息;
  • 先验表达:r=e0+Jmarg(x−x0)r=e_0+J_{\\text{marg}}(x-x_0)r=e0+Jmarg(xx0),linearized_jacobians+linearized_residuals,MarginalizationFactor 挂回 BA;
  • FEJ:固定雅可比保证可观性一致,代价是二阶精度。
  • 下一篇(第 14 篇):边缘化原理(下)- 代码实现与坑点。精读 marginalization_factor.cpp/.h–MarginalizationInfo 的 preMarginalize/marginalize 流程、ResidualBlockInfo 的残差块聚合、多线程舒尔补、localSize(7)=6 流形处理、estimator.cpp 的 marginOld/marginNew 调度。本篇的 HrH_rHrJmargJ_{\\text{marg}}Jmarg、FEJ 都将落地成具体代码行。


    本篇为纯理论推导,公式与 marginalization_factor.h 结构对齐。舒尔补与 FEJ 的更严格论证见 Hager 因子图教程或 VINS-Mono 论文附录。如发现表述有误,欢迎评论区指正。

    赞(0)
    未经允许不得转载:171主机测评 » VIINS源码解读 -- 第 13 篇 · 边缘化原理(上)- 舒尔补与先验构建
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址