第248篇 ORB-SLAM3新特性——多地图、多传感器融合
上一篇详细解析了ORB-SLAM2的架构。这篇聊它的升级版ORB-SLAM3。ORB-SLAM3在ORB-SLAM2的基础上做了很多重要改进是目前功能最完整的视觉SLAM系统。面试中如果你能讲清楚ORB-SLAM3相比ORB-SLAM2的新特性会显得你对这个领域的最新进展有关注。ORB-SLAM3在2020年由同一个团队发布论文引用量已经超过了ORB-SLAM2成为视觉SLAM领域引用量最高的论文之一。多地图系统ORB-SLAM2最大的痛点之一是不能处理跟踪丢失后的恢复。一旦跟踪失败比如快速转动导致特征全部丢失或者经过一个白墙区域整个系统就挂了必须重启。这在实际产品中是不可接受的——你不可能让用户每次跟踪丢失都手动重启系统。ORB-SLAM3引入了多地图系统Multi-Atlas来解决这个问题这也是它名字中3的含义之一。核心思想是跟踪失败时不放弃当前地图而是创建一个新的地图继续运行。当新地图和旧地图有重叠区域时系统会尝试把它们合并。# 多地图系统的工作流程 class MultiAtlas: def on_tracking_lost(self): # 跟踪失败创建新地图 new_map Map() self.atlas.append(new_map) self.current_map new_map def try_merge_maps(self): # 检查新地图和旧地图是否有重叠 for old_map in self.atlas: if old_map self.current_map: continue if detect_overlap(old_map, self.current_map): merge_maps(old_map, self.current_map) # 合并后统一优化 global_bundle_adjustment(old_map)多地图系统的好处是即使跟踪反复失败系统也不会挂掉。每次恢复后都能和之前的地图合并最终得到一张完整的大地图。这在实际应用中非常重要因为真实环境里跟踪丢失是不可避免的。地图合并的过程是这样的当检测到新地图和旧地图有共同观测的路标点时用这些共同路标点计算Sim3变换带尺度的相似变换。然后用Sim3变换把新地图的位姿和路标点变换到旧地图的坐标系下。合并之后做一次全局BA来精化所有变量。地图合并有个风险如果Sim3变换算错了合并后的地图会出现严重的错位。ORB-SLAM3用了很多策略来降低这个风险要求足够多的共同路标点、用RANSAC验证、合并后检查重投影误差等。视觉惯性融合ORB-SLAM3支持相机IMU的紧耦合融合。IMU提供高频200Hz的加速度和角速度测量可以弥补视觉在快速运动时的不足。紧耦合的意思是IMU的测量值直接作为优化变量的一部分和视觉观测一起优化。这和松耦合不同——松耦合是把IMU积分出来的位姿当成一个独立的观测和视觉位姿做简单的加权融合。松耦合实现简单但精度差因为IMU积分的误差没有建模。紧耦合的优势是精度更高。因为IMU的零偏bias也被当成优化变量和位姿、路标点一起优化。零偏的估计更准确IMU的积分误差就更小最终的位姿估计也更准。VINS-Mono和ORB-SLAM3都用了紧耦合方案但优化策略不同——VINS用滑动窗口ORB-SLAM3用全局优化。ORB-SLAM3的视觉惯性融合用的是基于预积分的方法。IMU数据在两个关键帧之间做预积分得到一个相对运动约束。这个约束作为因子加到优化图里和视觉的重投影约束一起优化。预积分的好处是IMU数据频率很高200Hz如果每次都把所有IMU数据加入优化计算量太大。预积分把两个关键帧之间的所有IMU测量压缩成一个相对运动约束优化时只需要处理这个约束就行。当IMU零偏变化时预积分值可以通过一阶近似快速更新不需要重新积分。# IMU预积分的直觉 # 在关键帧i和j之间有N个IMU测量 # 预积分结果delta_R相对旋转, delta_v相对速度, delta_p相对位移 # 这些预积分值只依赖于IMU测量不依赖于位姿 # 当零偏变化时用一阶近似快速更新 # delta_R_new ≈ delta_R * Exp(J_bias * delta_bias)鱼眼相机模型ORB-SLAM2只支持针孔相机模型。ORB-SLAM3支持鱼眼相机模型包括Kannala-Brandt模型。鱼眼相机的视场角可以达到190度以上比针孔相机通常60-90度大得多。大视场角对SLAM有好处能观测到更多的特征点跟踪更稳定。特别是在快速旋转时大视场角能保持更多的特征追踪。ORB-SLAM3在EuRoC和TUM-VI数据集上的结果表明鱼眼相机的精度明显优于针孔相机。在实际选型时需要根据场景的运动特点和精度需求来综合考虑。鱼眼相机的投影模型比针孔复杂。针孔相机是简单的线性投影xf*X/Z鱼眼相机需要考虑畸变。Kannala-Brandt模型用一个多项式来描述角度和像素距离的关系能精确地建模大视场角的投影。ORB-SLAM3在优化时用的是这个模型的雅可比矩阵精度比做图像去畸变再投影要高。面试中的高频追问ORB-SLAM3的多地图系统怎么工作 跟踪失败时创建新地图继续运行。新地图和旧地图通过回环检测来判断是否有重叠。如果有重叠用Sim3变换把两个地图对齐然后合并成一个。合并后做一次全局BA来统一优化。紧耦合和松耦合的区别 松耦合把IMU积分的位姿当成独立观测和视觉位姿做加权平均。紧耦合把IMU预积分约束直接加到优化图里和视觉约束一起优化。紧耦合精度更高但计算量也更大。为什么ORB-SLAM3要支持鱼眼相机 大视场角能观测到更多特征点跟踪更鲁棒。特别是在快速运动场景下大视场角能保持更多的特征追踪不容易丢失。ORB-SLAM3的缺点 计算量比ORB-SLAM2更大特别是视觉惯性融合的时候。系统复杂度很高代码量大调试困难。多地图的合并有时候会失败导致地图碎片化。IMU的标定质量对系统性能影响很大如果IMU没标定好融合效果可能还不如纯视觉。视觉惯性融合的初始化怎么做 这是VIO的难点。ORB-SLAM3用视觉SfMStructure from Motion来初始化位姿和路标点然后用IMU数据来恢复尺度和重力方向。初始化阶段需要足够的运动激励不能静止不动否则IMU的零偏和重力方向不可观。ORB-SLAM3和VINS-Mono哪个更好 看场景。ORB-SLAM3功能更全面多地图、回环检测、地图保存适合需要完整SLAM功能的场景。VINS-Mono更轻量实时性更好适合嵌入式平台。精度上两者差不多但VINS-Mono在快速运动场景下表现更好因为它的滑动窗口优化更紧凑。实际项目中的建议如果你要做视觉惯性SLAM项目建议先用ORB-SLAM3跑通。它的配置比较灵活支持多种相机和IMU组合。但要注意IMU和相机之间的时间同步——如果时间戳对不上哪怕只有几毫秒的偏差融合效果会很差。硬件上最好用同步触发的方式采集数据。用鱼眼相机的话标定要仔细。鱼眼的畸变很大标定不准的话特征点的位置会有系统偏差直接影响SLAM精度。建议用多角度的标定板图像来标定确保覆盖整个视场。标定工具推荐用KalibrETH开发的多传感器标定工具支持相机-IMU的联合标定。ORB-SLAM3是目前最完整的视觉SLAM系统把多地图、视觉惯性融合、鱼眼相机支持集成到了一个框架里。如果你的项目需要完整的SLAM功能ORB-SLAM3是很好的起点。上一篇第247篇 ORB-SLAM2深度解析——经典视觉SLAM的完整架构下一篇我们聊VINS-Mono——视觉惯性里程计的另一个经典方案看看它和ORB-SLAM3的视觉惯性融合有什么不同。VINS-Mono用的是滑动窗口优化架构上和ORB-SLAM3的全局优化有很大区别。如果这篇文章对你有帮助欢迎点赞支持一下你的鼓励是我持续更新的最大动力系列文章持续更新中涵盖了SLAM从数学基础到经典系统的全部知识点。