☰
DM-VIO:延迟边缘化让单目VIO精度逆袭双目
2026/10/5 8:30:50 网站建设 项目流程

单目VIO在精度和鲁棒性上追平甚至超过双目VIO,放在几年前,这话说出去是要被人笑话的。双目有固定基线、能直接恢复尺度,单目却要面对尺度不可观这个老大难问题。但DM-VIO这篇论文确实做到了,而且不是靠堆算力,是把“信息该在什么时候用、什么时候丢”这件事彻底想明白了。

这篇文章我精读了三遍,每次都有新收获。DM-VIO全称Delayed Marginalization VIO,出自我很尊敬的一个研究组,核心贡献可以概括为两点:第一,提出“延迟边缘化”,让单目VIO不再急于丢弃历史信息;第二,把位姿图BA嵌入到VIO框架中,在边缘化之前先让位姿约束充分收敛。再加上与DSO的紧耦合,最终在EuRoC等公开数据集上取得了优于不少双目系统的精度。如果你是做SLAM、VIO相关研究或者工程落地的,这篇论文非常值得精读。它不只是一篇精度刷榜的工作,更提供了一套“如何在计算受限条件下最大化信息利用”的方法论。接下来我就按自己的理解,从问题出发,把DM-VIO的每个核心模块掰开揉碎讲清楚。

1. 单目VIO的“天生劣势”与DM-VIO的破局思路

1.1 单目VIO难在哪儿:尺度为什么是老大难

单目VIO由相机和IMU组成。相机提供图像,IMU提供角速度和加速度。两者融合,短时间内的运动估计可以非常准,但时间一长,位姿会漂移,尤其是尺度方向。

为什么单目会有尺度问题?因为单个相机无法直接感知深度。一个远处的物体和一个近处但运动缓慢的物体,在图像上的投影可能完全一致。也就是说,从单帧图像中无法区分“相机移动了1米”和“相机移动了2米”这两个世界状态,除非有其他信息介入。

IMU能帮上忙吗?能,但帮得有限。IMU的加速度计可以感知真实的物理尺度,加速度是有量纲的,所以单目VIO理论上是可观尺度。问题是这个观测过程“慢”,模型需要一个长期的信息积累才能把尺度估稳。在积累完成之前,系统已经因为尺度的不确定性而产生了大量误差。

更麻烦的是,尺度不是在初始化时定准就一劳永逸。相机焦距漂移、IMU噪声、运动激励不足,都会导致尺度在运行过程中慢慢发生变化。单目VIO的尺度漂移(scale drift)是所有做单目系统的人最头疼的问题之一,也是工程落地时被客户质疑最多的一点。

1.2 双目的尺度优势其实没想象中可靠

双目相机通过左右两帧图像的视差估计深度。在近距离,双目深度估计非常可靠;但距离一远,视差会变得极小,可能只有亚像素量级,深度不确定性急剧上升。所以双目的“尺度可观测”是有限度的,它只能在一个较窄的距离范围内提供可靠的尺度约束。

除此之外,双目系统还增加了成本、体积和标定复杂度。要在无人机、机器人上装一个基线足够长的双目,对结构设计本身就是一种考验。如果双目图像的帧率不一致、同步不好,反而会引入更大的系统误差。很多做实际项目的朋友都有体会:双目标定一旦没做好,后续的VIO精度还不如一个标定良好的单目。

从算法角度看,不少双目VIO系统只是把双目当成“深度传感器”来用,把两帧图像的多视几何约束简单化为三角化深度,并没有充分利用立体观测的全部价值。这样一来,双目在低光、弱纹理、远距离场景下的劣势就全部暴露出来,尺度优势反而没那么明显了。

1.3 DM-VIO的破局点:把“扔信息”变成“存信息”

DM-VIO的出发点是:单目的问题不是信息不够,而是“没来得及消化的信息被过早丢掉了”。在传统滑动窗口VIO中,每一帧都要边缘化掉最老的帧以保持窗口大小固定。边缘化会把该帧的信息转成先验约束保留在系统中,但问题在于,边缘化一旦完成,先验就固定在了当时的线性化点上,后续如果发现更好的约束(例如闭环、更远的共视),这些信息的精度也无法更新了。

DM-VIO提出延迟边缘化:在主窗口之外,再维护一个规模更大的“延迟图”。当主窗口要边缘化某个帧时,不是直接丢弃它,而是先把它放到延迟图中,让它和后期的帧继续参与优化。经过一段时间、积累足够共视信息之后,再真正执行边缘化。这样一来,先验不是“仓促截断”的,而是在充分利用了后续信息之后才形成的。

这个思路本质上是在和时间做朋友:如果现在信息不够,就先留着,等得起了再处理。用耐心换精度,也换鲁棒性。听起来不复杂,但它的落地实现牵扯到因子图设计、优化调度、权重控制等一系列工程问题,这也是DM-VIO厉害的地方。

2. 延迟边缘化原理拆解:核心创新之一

2.1 滑动窗口与边缘化:为什么VIO非要“丢”状态

先讲基础。VIO优化问题可以用因子图表达:节点是状态(位姿、速度、IMU零偏、路标点),边是约束(IMU预积分、视觉重投影)。随着时间推移,状态数量不断增多,不可能让所有状态永远参与优化,所以要用滑动窗口:只维护最近的一小段状态,其他状态要么直接丢弃,要么边缘化。

边缘化的数学工具是Schur补。简单说,把某些状态从因子图中消去,但不丢掉它们对剩余状态的约束。消去后会生成一个先验项,以高斯分布的形式和剩余状态绑定。从信息矩阵上看,边缘化相当于把被消除状态的列和行通过Schur补运算压缩到剩余状态上,使剩余状态之间出现密集的耦合。

我用一个生活类比来解释:边缘化就像拍照前最后一次整理——先把眼前能用的线索都记下来,然后闭上一只眼睛继续看世界。问题在于,如果这时候你还站在一个看不清的角落,记下来的线索质量就会很差,后面想补拍也来不及了。

2.2 过早边缘化的代价:信息一锁就再也回不去

过早边缘化的本质,是“在线性化点还没稳定的时候就固化了信息”。VIO是一个强非线性问题,优化要在迭代中不断刷新线性化点。边缘化一旦执行,被边缘化的状态就不能再变了,它对剩余状态的约束也被锁死。

这会带来两个问题。

第一,信息劣化。如果老帧的位姿估计本身是有偏的,那么它边缘化出来的先验就会把剩余状态的解往错误方向拉。滑动窗口里的误差会随帧传播,越积越多。很多单目VIO在长时间运行后轨迹发飘,根子就在这儿。

第二,无法利用未来信息。假如第10帧和第50帧实际上有大量共视特征,但第10帧在第20帧时就被边缘化了,那么第10帧和第50帧之间本来可以建立的长程约束就永远没有机会生成。回环检测、多约束联合优化的效果,也因此大打折扣。

传统方法对这些问题有一些补救,比如FEJ(First Estimate Jacobians)技巧,让不同残差在线性化点方面保持一致。但补救终究是补救,根子上的信息丢失并没有解决。DM-VIO的做法,是从机制上避免“刚看到一眼就下结论”。

2.3 延迟边缘化到底怎么运作

DM-VIO的做法是维护两个并行运行的图结构。

  • 追踪图(main graph):接近常规的滑动窗口,负责实时位姿跟踪和前端视觉里程计,为系统提供高频运动估计。
  • 延迟图(delayed graph):比追踪图大得多,保留了相当数量的历史帧和共视关系,在后台负责“沉淀”信息。

当追踪图中要边缘化某个帧时,DM-VIO不会马上执行边缘化,而是把这个帧连同它相关的特征和位姿约束转移到延迟图中。延迟图在后台继续做优化,让这个帧与后续帧之间的共视关系、相对位姿约束逐渐建立起来。等延迟图积累了足够信息、相对位姿估计已经趋于稳定后,再真正对这个帧执行边缘化。

这样一来,边缘化产生的先验,是在“相对位姿已经比较准、共视关系已经比较充分”的前提下形成的,质量比“刚刚路过就仓促下结论”高得多。这听起来只是把丢弃时机推后了一点,但背后涉及如何在延迟图中做优化、如何在两个图之间传递不确定度,都是需要仔细设计的。

3. 位姿图BA:边缘化前的“信息榨取”

3.1 BA与位姿图优化:精度和速度的权衡

DM-VIO另一个常被忽略但非常重要的点是,它在延迟图中引入了位姿图BA(Pose Graph Bundle Adjustment)。

先区分两个概念。BA(Bundle Adjustment)是同时优化相机位姿和路标点,精度最高但计算量大。位姿图优化(Pose Graph Optimization)则只优化位姿,把路标点通过边缘化或固定方式折叠成位姿之间的相对约束。前者更精,后者更快。

在DM-VIO的延迟图中,如果每一个路标点都要维护完整的不确定度,内存和算力都撑不住。所以作者把路标点做了一定程度的压缩,保留帧与帧之间由共同观测推得的相对位姿约束,然后在这个“位姿图”上做优化。这样做既提升了轨迹的整体一致性,又把单次计算量控制在可接受范围内。

这个设计很务实。延迟图的规模本来就比主图大,如果做完整BA,实时系统根本跑不动。先把路标点压缩成相对位姿约束,再优化,本质上是用一点精度换“能实时跑起来”的可能性。

3.2 延迟图与主图如何协同工作

为什么需要这个位姿图BA?我的理解是,它的作用是给延迟边缘化铺路。

当老帧进入延迟图后,它不会立刻被边缘化。在后台,它和后续帧之间会逐渐增加共视约束。位姿图BA会让这些约束之间的误差被充分摊开、优化掉。经过若干次迭代后,老帧的位姿已经和后期的位姿形成了一个“内洽”的相对关系。这时再把它边缘化,产生的先验就涵盖了这一段轨迹的全局信息,而不是孤立的局部信息。

这个过程可以类比成酿酒:先不急着把原料(历史帧)扔掉,而是让它在延迟图这个“发酵罐”里和后期的信息充分发生反应,等到约束足够丰富了,再浓缩成酱(先验)。延迟图的规模越大,能“发酵”的信息就越多,但延迟也太久会拖慢反馈速度,作者在论文里对这种权衡也有讨论。

正是因为延迟图和主图在时间尺度上解耦,主图才能保持轻量、实时,而延迟图能从更长的时间窗口里榨取信息价值。这种“快慢分离”的系统设计,对很多实时SLAM系统都有借鉴意义。

3.3 动态权重自适应:让记忆学会“将信将疑”

这里要单独说一下动态权重自适应(Dynamic Weight Adaptation)。单目VIO天然有尺度漂移,如果尺度正在发生明显漂移,那么之前累积的先验可能会“过时”,这时候还按原权重信任它,反而会把系统带偏。

DM-VIO的做法是:实时监控尺度估计的置信度,当发现尺度漂移异常时,自动降低先验残差的权重,让系统更相信当前的观测;等尺度稳定了,再把先验权重恢复。这相当于给“记忆”加了一个自动调节的可信度开关。

用一句话概括这个模块的作用:它让系统学会“什么时候该固执,什么时候该兼听”。尺度稳定的区域,历史信息就该被充分信任;尺度正在滑动时,就要给当前观测更多话语权。这套自适应机制,是DM-VIO在真实数据上鲁棒性好的一个重要原因。如果缺了这个模块,延迟边缘化积累的那一点点精度优势,很可能被尺度漂移直接吃掉。

4. 手把手看懂DM-VIO的系统架构与实现细节

4.1 基于DSO的前端与双图架构

DM-VIO是基于DSO(Direct Sparse Odometry)搭建的。DSO是纯视觉的直接法里程计,通过最小化像素灰度残差来估计运动,在纹理丰富的环境中表现非常出色。DM-VIO继承了DSO的鲁棒前端,再叠加IMU因子、延迟边缘化和位姿图BA。

整个系统的数据流大致是:单目相机图像送入DSO前端生成视觉里程计结果;IMU数据通过预积分形成惯性约束,与视觉约束一起进入主图优化。在主图执行边缘化时,被淘汰的帧会被异步送到延迟图中,延迟图运行位姿图BA进行信息积累。当需要输出全局位姿时,可以从优化后的延迟图中获取修正量,反馈到前端。

这种架构让系统拥有了“高频的前端敢动”和“低频的后端深思”两个层次。前端负责实时性,后端负责信息利用最大化,互不干扰。和VINS-Mono这类紧耦合系统相比,DM-VIO多了一个“后台沉淀”的环节,这正是它信息利用率更高的结构基础。

4.2 关键模块背后的工程取舍

从工程角度看,DM-VIO的一些实现细节非常值得借鉴。

第一,两个因子图通过框架解耦,没有硬编码在一起。这让算法模块可以单独测试、替换和优化。第二,延迟图的大小有上限,超过上限会触发真正的边缘化,防止内存无限膨胀。这看似简单,其实是工程可部署性的现实考量,否则论文方法只能停留在仿真阶段。第三,边缘化先验采用类似“锚点”的方式与主图连接,锚点的选择会影响优化收敛速度。第四,尺度估计被单独建模,并参与动态权重计算。

这些细节说明作者在系统层面做了大量打磨。很多研究论文在实验里效果不错,但工程上一跑就崩,往往就是忽略了这类实际问题。DM-VIO在代码里把这些坑都填上了,这也是我推荐大家去读源码的原因。

4.3 实时性能与计算负载分析

很多人会问:多加一个延迟图,系统还实时吗?DM-VIO的实验结果说明,在普通CPU(比如Intel i7系列)上,单目配置可以跑到实时。原因是延迟图优化是低频、异步的,并且只优化位姿、不还愿全量路标点,单次计算量有限;主窗口保持固定大小,实时性不受影响。

不过,延迟图的优化频率和每次优化的帧数之间需要平衡。作者在实验中对延迟长度做过参数扫描:延迟太长,精度可能更高,但反馈不及时;太短,又达不到“延迟”的效果。这个平衡点在工程落地时非常重要,尤其是对计算资源受限的嵌入式平台。

从我个人的经验来说,延迟图的周期可以设在主图周期的5到10倍左右,先跑通再根据实际耗时调整。盲目追求“更长的延迟”不见得好,系统的整体吞吐量才是约束条件。

5. 实验对比:单目凭什么追平甚至超过双目

5.1 EuRoC与TUM-VI:VIO评测标杆怎么看

DM-VIO主要在EuRoC MAV数据集和TUM-VI数据集上评测。EuRoC是无人机在室内场景采集的,包含丰富的纹理和明显的运动激励;TUM-VI以手持设备采集,覆盖多种室内外场景,运动模式更贴近真实使用。

评价VIO的标准通常有以下几个。

指标作用单目VIO重点关注
ATE(绝对轨迹误差)衡量全局轨迹准确性长期漂移是否严重
RPE(相对位姿误差)衡量短时位姿精度局部抖动是否明显
初始化成功率衡量系统启动鲁棒性对运动和场景条件是否敏感
尺度误差衡量轨迹缩放偏差单目最核心的指标

EuRoC中的很多序列都含快速旋转和强光照变化,能充分考验算法在恶劣条件下的应对能力。TUM-VI则更考验系统在自然手持运动下的尺度稳定性。DM-VIO在两类基准上都有不错的表现,说明其方法不只是针对某一类数据调参的结果。

5.2 关键结果解读:单目超越双目的三个原因

根据论文报告的结论,DM-VIO在EuRoC上的轨迹精度大幅超过传统单目VIO(如VINS-Mono、OKVIS),并且在很多序列上达到了与双目VIO相当甚至更优的水平。在初始化阶段的表现也很突出,单目VIO通常对初始化敏感,但DM-VIO结合了DSO的鲁棒前端和动态权重,初始化失败时还能自动恢复。

对于“单目超越双目”这件事,我认为要从三个层面看。

第一,双目在近距离有优势,但远距离深度噪声很大;单目加延迟边缘化则可以通过长时间尺度观测,把尺度漂移压到比双目深度噪声更低的水平。第二,DM-VIO把后端的“信息管理”做到了极致,单目的信息利用效率反超了双目系统。第三,双目系统需要额外标定,基线误差可能直接转化为深度误差,而单目系统依赖优化自动恢复尺度,反而少了一个系统误差来源。

这些原因叠加在一起,导致单一传感器的配置未必输给多传感器,至少在某些评测条件下是这样。这给我的思考是:传感器数量不是精度的上限,信息处理架构才是。

5.3 对工程选型的启示

对做工程的朋友来说,这个结果最大的启示是:不要因为有双目就觉得双目一定更好。VIO的精度由整个系统的信息管理和优化结构决定,而不只取决于传感器配置。

无人机、AR/VR、机器人这些场景里,单目方案在成本、体积和功耗上仍然有不可替代的优势。DM-VIO展示了一条路径:把单目的弱点通过算法设计补起来。这对创业者、硬件选型人员都有直接参考价值。如果你在做一个只允许一颗摄像头的产品,不要急着劝退,先看看DM-VIO这套思路能不能用上。

6. 实操心得与避坑指南

6.1 编译与环境配置:最容易翻车的地方

DM-VIO开源在GitHub上,基于ROS和g2o,依赖OpenCV、Eigen、Pangolin等。我实际编译时遇到过几个坑。

第一,版本兼容性。OpenCV 3.x和4.x的头文件有差异,建议按官方README锁版本,不要随手装最新版。第二,g2o需要C++14,部分老系统默认是C++11,要在CMakeLists里显式修改。第三,数据集格式。EuRoC数据要转成ROS bag或对应的格式,注意IMU的频率设置要与配置文件一致。

如果你第一次接触这个项目,我建议先跑通官方提供的EuRoC序列,再换自己的数据。千万别直接上手自定义传感器,IMU标定和相机内参标定全都要提前做扎实,否则算法会呈现各种莫名其妙的漂移,你很难判断是自己参数调错了还是标定没做对。

6.2 参数调节的优先级与实践经验

有几个参数对最终精度影响很大,我这里整理成一张速查表。

参数作用调节方向
延迟图大小(delayed state limit)控制后台保留的历史帧数量太小失去意义,太大内存和延迟增大,从默认值开始调
动态权重的初始值和上下界控制先验可信度范围纹理弱时把下界调低,让系统更依赖IMU
特征点数量继承自DSO,权衡精度和算力嵌入式平台上降至2000左右,单帧耗时能明显下降
延迟图优化周期控制后台优化的频率为主图周期的5到10倍,再根据耗时调整

这些参数没有“万能解”,我在项目中通常用同一段实采数据做A/B测试,每次只调一个参数,记录ATE和单帧耗时两个指标。不要同时调多个参数,否则出了问题根本分不清是哪一个引起的。

6.3 延迟边缘化思想的后续扩展

DM-VIO的延迟边缘化思想,可以扩展到很多方向。

第一,与回环检测结合。把回环约束也纳入延迟图,而不是等回环后重新做全局优化,这样可以在检测到回环的瞬间就利用上修正。第二,多相机或多IMU系统。每个相机都有延迟图,交叉约束可能进一步提升鲁棒性。第三,与语义信息结合,在动态场景中让延迟图优先保留静态区域的特征约束。

我在自己实验中的一个体会是:延迟的思想在工程上可以泛化——不要立刻把旧数据丢掉,让它们在后台继续发挥价值。太早做决定,往往是很多SLAM系统长期漂移的根源。无论是导航、测绘还是AR应用,这个原则都适用。

最后再分享一个小技巧:如果你在调试DM-VIO时发现尺度漂移特别严重,先别急着调延迟图参数,检查一下IMU数据和图像数据的时间戳对齐。我遇到过好几次“看起来是算法问题,实际上是数据同步问题”的情况。先把数据预处理做好,再谈算法调优,能省一大半时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询