做视觉惯性SLAM(VIO)的朋友,对Bundle Adjustment(BA)应该都有一种又爱又恨的情绪。爱的是它能把历史观测的误差均匀地分摊到轨迹与地图上,后端精度的天花板基本由它决定;恨的是它太慢了,状态量一多、旧帧一积攒,一次全量BA就可能把实时性拖垮。ICE-BA这篇论文,核心就是在解决一对矛盾:既要保留BA的一致性精度,又不能让BA成为实时系统的瓶颈。这个名字里的三个词——Incremental(增量)、Consistent(一致)、Efficient(高效)——几乎把作者的思路全写在脸上了。
这篇论文对应的方向,是面向视觉惯性紧耦合SLAM的束调整方法。它适合正在做VIO后端优化、滑窗边缘化、因子图增量推理相关工作的研究者,也适合那些手里有实时定位项目、想理解后端优化为什么慢、以及怎么加速的人。读这篇论文之前,建议先对视觉重投影误差、惯性预积分、Schur补、iSAM这类增量推理概念有基本印象,否则几个关键设计容易被当成黑盒略过,那损失就大了。
1. 这篇论文到底在解决什么问题
1.1 视觉惯性BA为什么这么重
VIO系统的后端,本质上是一个持续不断的状态估计问题。优化变量包括一串相机位姿、三维路标点、速度、陀螺仪和加速度计零偏。约束来自两类残差:视觉重投影残差,以及相邻关键帧之间的惯性预积分残差。把这些残差堆起来做非线性最小二乘,就是BA。
问题在于:随着探索范围扩大,历史关键帧不断增多,路标点数也在增多。一次BA需要在每次迭代里计算整个系统的雅可比矩阵、组装信息矩阵(或Hessian)、求解一个大型线性系统。Hessian的维度一路涨上去,求解耗时呈非线性增长。这就让"每个新关键帧就把所有历史状态全部重新优化一遍"变成了一种奢侈品。
有些人可能会问:滑窗技术不是已经在解决这个问题了吗?确实,滑窗把历史状态限制在一个固定大小的窗口内,窗口外的信息通过边缘化压缩成先验项。但滑窗方案有个隐含问题:窗口一旦滚动,那些被边缘化的信息就固定成先验,不会再参与后续任何新约束的联合优化。时间长了,先验项叠加带来的线性化误差会累积,影响长期一致性。
1.2 已有思路的取舍
业界常见的后端方案大体能分成两类。
一类是固定规模的优化。这类方案把优化窗口定在一个较小范围内,边缘化旧状态,只维护当前附近的位姿和路标点。优点是计算量可控,适合嵌入式平台;缺点是历史信息一旦被压缩成摘要就难以更改,如果新观测与历史摘要存在冲突,或发生回环,摘要很难被修正。
另一类是增量式平滑与建图思路。这类方案用因子图组织状态,记录每个因子的线性化点,每次新增测量只对受影响的部分重新线性化与更新,不需要从头构建全量Hessian。它在位姿图这种稀疏结构上表现很好,但直接套到视觉BA里有尴尬:路标点与相机位姿之间高度耦合,路标点的数目又远大于相机位姿,增量更新时涉及的子图依然很大。
ICE-BA的思路是绕着这个问题寻找第三条路:用尽可能小的信息损失,把视觉BA压缩成一种既能增量更新、又能保持全局一致性的结构。
1.3 核心贡献怎么概括
这篇论文的关键贡献可以总结成三点。
第一,论文提出了一种对视觉BA状态进行分区的策略,通过两次Schur补操作,将旧状态中包含的信息压缩到新状态的摘要中,使得BA问题可以随时间递推维护。
第二,论文把增量推理框架与这种压缩后的BA结构结合起来,使系统在加入新位姿和新路标点时,只需要更新受影响的部分,而不是每个周期重建整个问题。
第三,论文通过delta近似与重新线性化的结合,减轻了传统边缘化方案中"冻结线性化点"导致的不一致累积风险,在增量更新的前提下尽量维持与批处理BA一致的精度。
说实话,光看摘要会觉得这几个点平平无奇,真正有意思的是这些设计在工程上怎么衔接。下面拆开看。
2. 增量、一致、高效,三个词是怎么落地的
2.1 状态分区的直觉:新旧分开处理
ICE-BA的第一步,是把每个优化周期涉及的状态分成两大类:旧状态和新状态。
旧状态对应那些已经出现在系统里、且与当前帧存在共视关系的关键帧位姿,以及它们关联的历史路标点。新状态则是刚刚加入的关键帧位姿,以及在这些新关键帧中新观测到、尚未被旧状态充分约束的路标点。
为什么要分区?因为旧状态的数量会一直增长,如果不加限制,系统规模迟早爆炸。分区之后,可以对旧状态做一次压缩。这个压缩不是丢弃,而是把它们的约束关系折算成一个关于新状态的摘要信息。
这就像一个小组讨论:老成员之间的恩怨纠葛没必要全部复述给新成员,只需要把老成员对议题的整体倾向总结一个摘要传下去。摘要细节有损失,但核心倾向保留住了。
2.2 两次Schur补到底做了什么
Schur补在BA里不是新鲜操作。经典做法是通过消元把路标点从Hessian里消掉,得到只关于相机位姿的约化系统。ICE-BA在此基础上多走了一步,按顺序做了两次消元。
第一次,固定新状态涉及的变量,将旧状态里的路标点作为被消元量消去,得到只与旧相机位姿有关的项。这一步处理的是路标点与相机之间的共视关系,把几千个点的投影约束压缩成相机之间的相对约束。
第二次,继续固定新状态,将旧相机位姿消去,得到只包含新状态变量的二次项。到这一步,所有旧状态的信息都被吸收进了新状态的摘要项。
有人会疑惑:一次性把所有旧状态消掉不行吗?理论上可以,但工程上不行,原因有两方面。一是矩阵的稀疏结构:直接把大量旧位姿和旧路标点同时消元,填充会非常严重,信息矩阵的稀疏性被破坏,后面的增量更新就没有意义了。二是数值稳定性:分批消元、保持每一步的中间矩阵结构可控,比一次性消元更容易调试和验证。
这两步Schur补的本质,是在"保留信息"和"压缩结构"之间找一个平衡点。从理论上讲,如果一切都在同一个线性化点下操作,Schur补是不会损失信息的,它只是换了一种表示方式。但文献里真正的难点在于:这些被消掉的项在线性化时被冻结了,后续新状态更新时,旧状态的信息不会跟着重新线性化。
2.3 视觉项的压缩与保留原则
在BA里,视觉残差处理起来比惯性残差麻烦,因为路标点的数量可能是相机位姿的几十倍。ICE-BA处理视觉项时,遵循的原则可以表述为:旧状态的路标点一旦被压缩,就不再作为单独变量参与后续迭代;新状态新增的路标点保留完整自由度,在窗口内正常参与优化。
这个设计带来的直接好处是:旧状态持续增长,但需要维护的活跃变量规模始终有限。从信息论角度看,被压缩的视觉项携带了旧状态对新状态的约束信息,结构上反而简化了。
但代价也很明显:如果新观测与旧状态的信息存在明显不一致(比如回环闭合带来的大修正),被冻结的摘要项会拖住整体调整。这也是几乎所有边缘化类方案共同的软肋,ICE-BA并没有彻底消除它,而是尽量延后并缓解它。
2.4 增量更新的流程如何看待
ICE-BA没有重新发明一个推理引擎,而是在已有的增量推理框架基础上做适配。大致流程是:
系统维护一个因子图,包含三类因子:惯性预积分因子、视觉重投影因子、以及由Schur补压缩得到的摘要因子。每来一帧新关键帧,系统先做预积分和特征匹配,再把新的视觉因子和惯性因子加入因子图。随后,做一次局部增量更新,只对新增因子波及的状态执行线性化与更新,而不是全图重算。
配合摘要因子的作用,历史信息对当前状态的约束不需要靠保留一个不断增宽的窗口来体现,而是被压缩成一条边,参与后续更新。
增量推理在这里的价值,不只是省去了重算全部Hessian的时间,更重要的是重新线性化的范围被局部化了。传统批处理BA在每次迭代时,对所有因子重新求雅可比、重新组装矩阵、重新求解;增量方式只在新增测量影响到的区域做这些事。
3. 一致性设计:最容易被忽略也最关键的部分
3.1 简单挪用iSAM能行吗
读到这,熟悉增量优化的人可能会想:这不就是iSAM的思路套到VIO上吗?表面上很像,但有个根本差异——iSAM面向的典型问题是位姿图或稀疏地标图,其中因子相对独立,新增观测带来的增量改动范围有限。而视觉BA里,每个相机位姿关联大量路标点,路标点之间通过相机形成稠密耦合,直接套用iSAM的增量策略,局部更新范围依然很大,甚至可能退化成大范围重算。
ICE-BA的应对方式是:先把旧状态视觉项压缩掉,让图中剩下的视觉因子基本都集中在活跃的新状态附近。这样增量更新的范围才真正被限制住。
但压缩是有代价的。Schur补得到的摘要因子,本质上是某一线性化点上的高斯近似。当系统不断推进,新状态不断加入,这个线性化点与真实状态之间的偏差会逐渐变大,如果不做处理,累积误差会直接影响一致性。
3.2 delta近似的思路
论文里针对这个问题提出了一个近似策略:增量更新时,系统会解出整个活跃状态相对上一次线性化点的变化量delta。对于那些已经被压缩、不再重新线性化的视觉项,这个delta被用来补偿它们的线性化点误差,而不是放任不管或者强制重新线性化。
可以把这理解为:旧信息虽然是冻结的,但系统知道当前状态相对冻结时刻移动了多少,于是先把冻结位置校正到当前估计值的邻域,再参与后续的增量优化。
这个补偿不是完美的。它假设冻结的摘要项在delta较小的情况下能保持足够精度。也就是说,只要系统状态没有发生剧烈跳变,这种近似的误差就是可控的。回环闭合或运动突变时delta可能很大,这种情况下,一致性会相对脆弱。
3.3 与批处理BA的精度差距
批处理BA的一致性之所以好,是因为每次迭代都对全部状态重新线性化,没有任何信息被冻结。ICE-BA显然做不到这一点。论文在实验中表明,在多数常规场景下,ICE-BA的精度与批处理BA非常接近,因为增量更新过程中新增的因子持续修正误差,同时也受益于被压缩但未被丢弃的旧信息。
精度接近的原因之一是:被压缩的摘要项并不是被完全丢弃的信息,而是被改写了一部分结构。它在信息论意义上的损失主要来自线性化点不一致,而不是信息本身缺失。
在工程实践中,这个设计的直接收益是:可以用接近批处理的精度,获得明显更低的每帧计算延迟,让算法有机会跑在计算资源有限、但精度要求很高的平台上。
4. 与主流VIO方案对比,ICE-BA的位置在哪
4.1 滑窗方案的内存与时间特征
滑窗方案的时间开销主要集中在每次滑动边缘化旧帧、以及窗口内BA优化两步。窗口规模通常不大,单次优化时间相对可控。但随着系统运行时间变长,被边缘化的信息会累积成越来越多的先验项,每次新增先验虽然只是矩阵运算,但多次累积后,信息矩阵的高频部分会越来越稠密,拖慢求解。
滑窗方案的一致性问题是逐渐暴露的。边缘化时没被妥善处理的零空间、线性化点漂移,会让长期运行的系统产生漂移增大。很多工程团队都有经验:短时间内精度很好,长时间跑之后轨迹开始悄悄弯曲。
4.2 增量平滑方案的时间特征
增量平滑的优势在于避免重复线性化,其时间开销集中在增量变量的重新线性化和矩阵分解更新上。在纯位姿图场景里表现非常好,树形结构让每次更新只触及少量节点。但在视觉SLAM里,路标点规模远超位姿,且观测关系稠密,增量更新触及的子图依然庞大,效率优势打了折扣。
ICE-BA把两侧优点做了一个拼接:用Schur补把历史视觉信息压缩成摘要,让增量更新能够集中在当前活跃状态附近,从而把增量推理的优势真正发挥到视觉惯性场景里。
4.3 一张表看差异
| 方案类型 | 历史信息维护方式 | 一致性风险来源 | 计算瓶颈 | 适合场景 |
|---|---|---|---|---|
| 批处理全量BA | 全部状态保留 | 无(理论最优) | 状态规模导致求解耗时上涨 | 离线建图、小规模研究 |
| 固定窗口滑窗BA | 边缘化摘要 | 摘要固定引入误差累积 | 窗口优化与矩阵边缘化 | 实时VIO、嵌入式平台 |
| 增量平滑 | 因子图增量维护 | 线性化点冻结 | 视觉路标稠密导致更新范围大 | 位姿图优化、稀疏地图场景 |
| ICE-BA | Schur补摘要+增量更新 | 摘要冻结与delta近似误差 | 增量更新与摘要构建 | 大规模实时VIO |
此表不是要证明谁绝对优势,而是要说明不同方案在"精度、时间、内存、实现复杂度"四者间的取舍位置。ICE-BA选择的路径是:牺牲一部分理论最优性,换取可预测的实时代价和接近批处理的精度。
5. 读懂这篇论文的实操视角
5.1 关注信息矩阵的维护与边缘化顺序
ICE-BA这种方案在实现阶段,最容易被忽略的细节是信息矩阵的维护方式。一旦对旧状态做两次Schur补,原本稀疏的视觉项结构会被打破,信息矩阵中会出现新的稠密块。如果只是照着普通BA的数据结构硬套,很容易在后续求解时产生意外的高内存占用。
我在看这类论文时,会首先确认每个步骤最终产出的矩阵维度与稠密模式。按照论文思路,摘要因子最终应该落成一条连接新状态的边,它的信息矩阵不该像旧状态那样继续膨胀。如果代码或实现中出现摘要矩阵持续扩张的迹象,大概率是边缘化范围控制出了问题。
5.2 触发更新的时机怎么设计
增量更新并非越快越好。每来一帧都触发全量增量更新,虽然能保证最新状态最准,但计算开销也会频繁出现尖峰。实际中,更合理的做法是判断新增因子对旧状态的影响程度:若当前帧与活跃状态共视较少,或者惯性信息足够稳定,可以延迟更新;若出现强共视或大位姿变化,则立刻触发一次增量BA。
论文里更关注算法的核心循环,对调度策略没有做过多的工程渲染。这一点在应用时要靠自己做实验调参。大概原则是:更新频率与轨迹变化幅度成正比,与共视数量正相关。
5.3 回环场景下的注意点
ICE-BA针对的典型运行场景是持续探索式运动,并非大回环闭合。一旦系统出现回环,新的视觉约束会与冻结的摘要因子形成冲突。此时即便触发增量更新,被压缩的旧状态摘要也很难被有效修正。
如果想把ICE-BA方式应用到存在明显回环的系统里,建议单独保留回环检测与全局位姿图优化作为后台线程,周期性地修正长期漂移。这与许多实时VIO系统叠加全局优化的思路类似,但注意别让回环修正产生的跳变直接反馈到增量BA的旧摘要上,否则会出现信息重复使用与不一致风险。
5.4 调参时的几个直观指标
- 维护的活跃关键帧数量:影响增量更新范围的直接参数,更大更准但也更慢。
- 旧状态摘要的保留粒度:摘要压缩得越狠,计算越快,但一致性损失越大。
- 新旧状态分界的滑动频率:频繁滑动会增加摘要更新次数,降低压缩收益。
- 视觉路标的最小观测次数:太少会导致三角化不稳定,生成大量低质量视觉因子。
6. 读论文时常见的几个困惑
6.1 为什么要做两次Schur补,而不是一次消到位
如果只做一次消元,把旧路标点和旧相机位姿一次性都消掉,理论结果与两次消元最终一致。但矩阵填充和中间结构的可维护性会很差。两次消元的中间产物刚好是"路标点压缩到位姿"和"位姿压缩到新状态"这两层,每一层的稀疏结构都还能解释,便于调试。
换句话说,两次Schur补更多是工程结构上的选择,而不是数学必要性的选择。
6.2 被压缩的视觉信息会不会彻底丢失
不会。Schur补从数学上等价于条件分布,只要线性化点一致,信息是不丢的。真正丢信息的是后续线性化点发生漂移后,旧状态没有重新线性化。所以"压缩"本身无损,"冻结"才是误差来源。理解这一点,才能理解论文里delta近似的价值:它试图缓解的正是冻结误差,而不是压缩误差。
6.3 增量更新是否一定比批处理快
不一定。若每次新增观测波及的范围接近全体状态,增量更新退化为一种带复杂数据结构的全量重算,可能比批处理更慢。ICE-BA能快,前提是压缩后图中大部分因子集中在活跃状态附近。换个场景,比如大范围乱序回环,ICE-BA的效率优势就不明显了。
6.4 什么情况下不建议使用这个方案
状态规模很小(几十帧以内)时,批处理BA的简单实现已经足够,直接用ICE-BA属于杀鸡用牛刀且工程成本高。另一个情况是地图中需要长期保留大量路标点参与优化,比如高精度离线重建,此时压缩旧路标点会影响精度,不适合这种设计。
论文里的实验数据集中在典型的室内外视觉惯性序列上,评估指标一般包括轨迹精度、效率、内存占用等。这类结论能否迁移到极端动态环境、稀疏纹理场景,需要另行验证。
最后说一点个人体会。读ICE-BA这篇文章,最大的收获不是某一行公式,而是它展示了一种很务实的工程研究方法:先把问题剖成增量、一致、高效三个子问题,然后每个子问题分别用成熟工具去解决——增量靠因子图,一致靠Schur补与delta近似,高效靠状态分区。这种"从名字到方法"的对应关系,比记住论文里的具体矩阵形式更有迁移价值。如果你所在的项目正被实时性与精度拉扯,不妨先按这个思路审视一下自己的后端架构:哪些历史信息是必须完整保留的,哪些其实可以被压缩成摘要,当前状态的更新范围能不能限制住——答案可能比想象中更简单。