Skip to content

视觉惯性 SLAM 数据整理

这篇不把视觉惯性 SLAM 当成单独算法课来讲,而是把它放在具身智能数据里看:

当机器人、无人机、AR 设备在真实世界里移动时,怎样把摄像头画面、运动传感器读数、轨迹和地图整理成可用数据。

视觉惯性数据流示意图

视觉惯性 SLAM 本身是在做“边走边定位、边走边建图”。对数据工作来说,它更像一个数据加工管线:原始传感器数据进去,较干净的轨迹、关键画面、地图和质量报告出来。

这里的“视觉”就是摄像头。“惯性”就是手机、无人机、机器人里常见的运动传感器,它能感到转动、加速和晃动。SLAM 的意思是“同时定位和建图”,这个词比较常见,详细解释见术语表

具身智能关心的是“智能体在环境中看见什么、做了什么、到了哪里、结果怎样”。视觉惯性 SLAM 经常用来补齐其中的空间信息。

它能产出或辅助产出这些数据:

  • 每一时刻设备大概在哪里、朝向哪里。
  • 摄像头画面对应的空间位置。
  • 走过路线的轨迹。
  • 环境里的稀疏地图或三维地图。
  • 某段数据是否可靠,比如是否丢失、漂移、时间没对齐。

这些数据可以继续用于训练、回放、标注、仿真复现、机器人导航评测,也可以帮助检查一次采集任务是否合格。

只靠摄像头,机器像是在看连续照片。它能发现“这张图里的桌角,下一张图里挪到哪里了”,从而猜自己怎么动了。但光靠图像有几个麻烦:

  • 墙面太白、地面太光、夜里太暗时,照片里可抓的线索少。
  • 快速转头或抖动时,照片会糊。
  • 单个普通摄像头不直接知道东西离自己多远,需要靠移动后慢慢推断。

只靠运动传感器也不够。它反应很快,能在短时间内感到“刚才往左转了一点、往前冲了一下”,但它有个毛病:小误差会越攒越大。就像你闭着眼走路,刚开始还知道大概方向,走久了就偏得厉害。

把两者放在一起,是为了互相补短板:

  • 摄像头负责看环境,帮机器认出“我又回到这个地方了”。
  • 运动传感器负责补上两张图片之间的快速动作。
  • 两者合在一起,通常比单独用一种传感器更稳。

对数据采集来说,常见输入不只这两类,还可能包括:

  • 相机标定文件:说明镜头怎么变形、画面中心在哪里。
  • 传感器安装关系:说明摄像头和运动传感器之间隔了多远、歪了几度。
  • 时间戳:说明每张图、每条运动读数是什么时候来的。
  • 真实路线或参考路线:用来评估结果准不准。

可以把视觉惯性 SLAM 想成一个反复运行的小流程:

  1. 摄像头不断拍图,运动传感器不断上报晃动和加速。
  2. 系统从图片里找容易认的点,比如角、边缘、纹理。
  3. 系统在下一张图里继续找这些点,看它们移动了多少。
  4. 运动传感器告诉系统,机器在两张图之间大概怎么转、怎么动。
  5. 系统把“看到的线索”和“感到的运动”放在一起,估计机器的位置和姿态。
  6. 系统挑一些关键画面保存下来,慢慢拼成地图。
  7. 如果机器回到旧地方,系统会发现“这里见过”,然后把一路累积的偏差拉回来。

上面第 7 步常叫“回环”。这个词听起来硬,其实就是“认出自己绕了一圈又回来了”。

从数据产物角度看,这个流程通常会留下几类文件或记录:

  • 原始图像和运动传感器记录。
  • 估计出来的轨迹。
  • 被选中的关键帧。
  • 地图点、三维网格或其他地图表达。
  • 日志和状态码,用来判断哪里失败了。

这类方法会在图像里找一些容易复认的小线索,比如角点、纹理点。后续就盯着这些点在画面里怎么移动。

优点是解释起来清楚,很多经典系统都走这条路。缺点是环境太单调、反光太强、光线变化太大时,可用线索会变少。

代表项目:

  • ORB-SLAM3:支持普通摄像头、双目摄像头、深度相机,也支持把摄像头和运动传感器一起用;它还强调多张地图和找回旧地图的能力。
  • OKVIS:较早的开源视觉惯性系统之一,重点是用关键画面来做位置估计。

这类方法不会把所有历史画面都拿来反复算,因为那样太慢。它会保留最近一小段时间内最有用的画面和传感器数据,像推着一个小窗口往前走。

优点是适合实时运行。缺点是窗口外的旧信息不能一直完整参与计算,所以还需要“回环”等机制修正长期偏差。

代表项目:

  • VINS-Mono:面向单个摄像头加运动传感器,包含启动、失败恢复、回环和轨迹修正等完整流程。
  • VINS-Fusion:在 VINS-Mono 基础上扩展,支持单目加运动传感器、双目加运动传感器、双目等多种组合,也展示了和 GPS 一起用的例子。

这类方法像是在持续维护一本“当前猜测账本”:新传感器数据来了,就快速改一改账本。它通常算得快,适合资源比较紧的设备。

优点是速度快、结构清楚。缺点是当场景复杂、误差来源很多时,调试和建模会比较考验经验。

代表项目:

  • OpenVINS:官方文档介绍它会把运动传感器信息和图像中的稀疏线索合在一起,核心是一个滤波式估计器。

前面几类更关心“我在哪里”。这类方法还想进一步回答“我周围是什么”。例如,地图里不只是点和线,还能知道哪里是墙、地面、门、人、桌子。

优点是更接近机器人真正理解环境。缺点是计算更重,也更依赖图像识别能力。

代表项目:

  • Kimera:把视觉惯性定位、三维网格重建和语义标注放在一个开源系统里。
  • Kimera2:在 Kimera 基础上继续改进,支持更多输入方式,并增强复杂真实场景中的稳健性。

传统方法靠手工设计的图像线索。近几年有一些工作尝试让神经网络帮忙找更稳的线索,特别是在弱光、模糊、纹理少、画面变化大的情况下。

这类方法的优点是可能更适应复杂画面。缺点是训练数据、算力、泛化能力都会变成新问题:换一个城市、换一种相机、换一种光照,效果不一定还一样。

如果是做原型或学习,可以先从下面几个问题倒推:

  • 设备上有什么传感器:单摄像头、双摄像头、鱼眼相机、深度相机、运动传感器、轮速计、GPS?
  • 场景是什么:室内、室外、地下、仓库、街道、无人机、手持设备?
  • 光照是否稳定:是否经常暗光、强反光、运动模糊?
  • 是否必须实时:是边跑边算,还是可以事后慢慢处理?
  • 更需要什么数据结果:只要轨迹,还是还要地图、三维模型、物体类别?
  • 设备算力如何:手机、嵌入式板卡、笔记本、服务器?
  • 数据后续要给谁用:训练模型、人工标注、仿真回放、导航评测,还是现场质检?

一个粗略建议:

  • 想快速体验完整 SLAM:看 ORB-SLAM3。
  • 单目加运动传感器、想理解经典流程:看 VINS-Mono。
  • 多传感器组合、工程扩展:看 VINS-Fusion。
  • 想研究滤波式视觉惯性估计:看 OpenVINS。
  • 想做“定位 + 三维环境理解”:看 Kimera / Kimera2。

视觉惯性数据质量检查示意图

视觉惯性 SLAM 不是万能导航。它常见的翻车原因包括:

  • 画面太糊,系统看不清线索。
  • 环境太空、太白、太重复,比如长走廊、白墙、玻璃幕墙。
  • 光照突然变化,比如从室内冲到强阳光下。
  • 相机和运动传感器的时间没对齐。
  • 相机和运动传感器的安装位置关系没量准。
  • 机器长时间只做很单调的运动,比如几乎不转、不平移。
  • 动态物体太多,系统误把移动的人或车当成固定环境。

其中“时间没对齐”和“安装关系没量准”在工程里很常见。它们分别对应术语“时间同步”和“外参标定”,见术语表

如果把它当成数据管线,还要额外检查:

  • 是否有缺帧、重复帧、时间戳倒退。
  • 图像和运动传感器频率是否稳定。
  • 标定文件是否和当前设备一致。
  • 采集时设备是否被重新安装过。
  • 输出轨迹坐标是否和其他数据源使用同一个坐标约定。

最直观的办法是看它估计出来的路线,和真实路线差多少。学术和工程里常用公开数据集做测试,例如无人机、手持设备、车载设备采集好的图像和传感器数据。

评价时不要只看一个数字。更应该看:

  • 短时间内是否平滑。
  • 长时间跑下来是否越偏越远。
  • 回到旧地方后,能不能把偏差修回来。
  • 丢失后能不能重新找回位置。
  • 换光照、换速度、换场景后是否还稳定。
  • 实时运行时,延迟和算力消耗是否能接受。

视觉或视觉惯性里程计轨迹评估教程专门讨论了如何更规范地比较路线误差。