· 本篇你将学到
一、为何需要边缘化
第 10 篇 established:滑动窗口固定大小(WINDOW_SIZE=10,11 帧),新帧入窗必须丢一帧。问题是–丢掉的帧携带的信息怎么办?
考虑要丢掉最老帧 f0f_0f0。f0f_0f0 与窗口内其他帧的关联:
- IMU 预积分:f0→f1f_0 \\to f_1f0→f1 的预积分约束 f0f_0f0 与 f1f_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)dx0。x0x_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}f1…f10 + 共视路标)的先验。
→ 触发完整舒尔补边缘化,更新 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}f9→f10 的 IMU 预积分合并进 f10f_{10}f10 的预积分,f9f_9f9 状态直接删除,不调用舒尔补。
→ 不生成新的边缘化先验,沿用上一轮 last_marginalization_info。
2.3 对比
| 触发 | 关键帧(视差大) | 非关键帧(重复) |
| 丢谁 | 最老帧 f0f_0f0 | 次新帧 f9f_9f9 |
| 舒尔补 | ✅ 完整边缘化 | ❌ 直接丢弃 |
| 先验更新 | 更新 last_marginalization_info | 沿用上轮 |
| IMU 预积分 | f0→f1f_0\\to f_1f0→f1 进先验 | f9→f10f_9\\to f_{10}f9→f10 合并入 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=i∑Ji⊤Σi−1Ji=[HmmHrmHmrHrr],b=i∑Ji⊤Σi−1ri=[bmbr]
其中 HmmH_{mm}Hmm(m×mm\\times mm×m)是边缘化变量块,HrrH_{rr}Hrr(n×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(−21∥x−x^∥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=Hrr−HrmHmm−1Hmr
br′=br−Hrm Hmm−1 bm
b_r' = b_r – H_{rm}\\,H_{mm}^{-1}\\,b_m
br′=br−HrmHmm−1bm
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(xr−x^r)⊤Hr(xr−x^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边际信息矩阵 HrHrr−HrmHmm−1Hmr
各块含义:
| HmmH_{mm}Hmm | 边缘化变量自信息 | 被 Hmm−1H_{mm}^{-1}Hmm−1 求逆后消去 |
| Hmr/HrmH_{mr}/H_{rm}Hmr/Hrm | 边缘化-保留耦合 | 经 HrmHmm−1HmrH_{rm}H_{mm}^{-1}H_{mr}HrmHmm−1Hmr 注入 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}HrmHmm−1Hmr 是"经由边缘化变量传过来的耦合信息"。舒尔补把后者从前者中扣除–因为边缘化变量被积分掉后,它原本提供的独立约束不能再算全额(其不确定性已被边际化放大)。结果 HrH_rHr 比 HrrH_{rr}Hrr 小,保留变量的不确定性略增(信息略减),但 xmx_mxm 的影响被正确保留。
4.4 数值实现
Hmm−1H_{mm}^{-1}Hmm−1 不显式求逆(数值不稳),而是对 HHH 做 LDLT 分解,通过解方程组 Hmm−1HmrH_{mm}^{-1}H_{mr}Hmm−1Hmr 等完成舒尔补。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,Hr−1)。但 Ceres 优化需要残差+雅可比形式,而非协方差。转换:
边际分布的对数似然(去掉常数):
−lnp(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(xr−x^r)⊤Hr(xr−x^r)=21∥Jmarg(xr−x^r)∥2
其中 JmargJ_{\\text{marg}}Jmarg 是 HrH_rHr 的 Cholesky 因子(Jmarg⊤Jmarg=HrJ_{\\text{marg}}^\\top J_{\\text{marg}} = H_rJmarg⊤Jmarg=Hr)。故先验残差:
rprior=e0+Jmarg (xr−x0)
\\boxed{\\;r_{\\text{prior}} = e_0 + J_{\\text{marg}}\\,(x_r – x_0)\\;}
rprior=e0+Jmarg(xr−x0)
- 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(para−x0),雅可比即 JmargJ_{\\text{marg}}Jmarg(固定);
- 参数块:所有保留变量(keep_block_data 对应的状态)。
于是下一轮 BA 的代价函数(第 11 篇总览)里多了 ∥rmarg∥2\\|r_{\\text{marg}}\\|^2∥rmarg∥2 项,把历史信息软约束进来。
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(x−x0) 随 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}Hmm−1 可能病态(弱约束变量) | 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 管理、线程化舒尔补等)。
小结与下一篇预告
本篇完成边缘化的理论铺垫:
下一篇(第 14 篇):边缘化原理(下)- 代码实现与坑点。精读 marginalization_factor.cpp/.h–MarginalizationInfo 的 preMarginalize/marginalize 流程、ResidualBlockInfo 的残差块聚合、多线程舒尔补、localSize(7)=6 流形处理、estimator.cpp 的 marginOld/marginNew 调度。本篇的 HrH_rHr、JmargJ_{\\text{marg}}Jmarg、FEJ 都将落地成具体代码行。
本篇为纯理论推导,公式与 marginalization_factor.h 结构对齐。舒尔补与 FEJ 的更严格论证见 Hager 因子图教程或 VINS-Mono 论文附录。如发现表述有误,欢迎评论区指正。


