多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

开源SLAM方案评估:从ORB-SLAM到LIO-SAM的选型与工程实践

开源SLAM方案评估:从ORB-SLAM到LIO-SAM的选型与工程实践 1. 为什么写这份开源SLAM方案评估做机器人方向或者三维视觉的工程师应该都有过这种体验新项目启动领导丢过来一句“用SLAM做定位建图”然后留下一脸茫然的你。SLAM这个词听起来高大上但真到选型阶段就会发现光是搞清楚该用哪个开源方案就够折腾好一阵子。我在这个领域摸爬滚打了好几年从最早的视觉SLAM入门到后来折腾激光雷达方案中间踩过的坑不算少所以这篇评估更像是一份个人经验笔记把主流的开源SLAM方案从工程落地的角度盘一遍。先说清楚这个评估针对谁。如果你刚接触SLAM还在纠结“ORB-SLAM是什么Cartographer又能干什么”这篇文章可以帮你快速建立认知框架如果你已经在做实际项目正面临选型决策后面章节里的对比分析、参数取舍和踩坑记录也许能帮你少走不少弯路。简单来说这不是一篇纯学术调研报告而是站在工程落地的角度回答“哪些开源SLAM方案能直接用、哪些需要魔改、怎么选、怎么避坑”这些问题。SLAM全称Simultaneous Localization and Mapping同步定位与建图。拆开来看就三个核心问题我在哪、周围长什么样、怎么在知道这两者的同时不断更新它们。开源社区里针对这几个问题给出了大量解决方案有的偏重理论创新论文发得漂亮但代码可读性一塌糊涂有的则是工业打磨过的换条数据就能跑稳定性也经得住考验。我这里谈的更多是后者。做这份评估的时候我给自己定了几个维度的标准代码质量和可维护性、上手成本和文档完善度、对不同传感器和场景的适配能力、社区活跃度和后续维护情况、实际部署时的性能和资源占用。后面所有方案的打分出发点都围绕这些维度。这里先亮明我的态度项目能跑通只是及格线能长期维护、有人持续更新、遇到问题能找到答案才是真正值得投入的方案。2. 视觉SLAM开源方案的半壁江山2.1 特征点法代表ORB-SLAM系列的核心逻辑聊开源SLAM绕不开ORB-SLAM系列。从最早的ORB-SLAM到支持单目、双目和RGB-D相机的ORB-SLAM2再到引入了鱼眼相机模型和更完善的回环检测的ORB-SLAM3这个系列几乎是视觉SLAM学习者必看的经典教材级项目。ORB-SLAM的核心思路是特征点法。它在每一帧图像里提取ORB特征点然后通过特征点匹配来估计相机运动同时用局部地图做优化用词袋模型做回环检测。这套“前端特征匹配-后端图优化-回环检测”的经典架构在开源SLAM领域的影响力排第二的话没有哪个方案敢排第一。实际使用层面ORB-SLAM2在标准数据集上的精度表现很稳室内场景用RGB-D相机基本能拿到厘米级的轨迹精度。但特征点法有个通病在弱纹理、光照剧烈变化的环境下特征点数量锐减前端很容易跟丢。我在一个走廊场景里试过白色墙面加上均匀灯光ORB-SLAM2跑到一半就找不回特征匹配了最后直接丢定位。ORB-SLAM3在系统设计上做了不少改进提出了基于多地图Atlas的系统架构可以保存和复用之前建过的地图还引入了视觉惯性紧耦合模式配合IMU使用能在很多退化场景扛住。代码风格上ORB-SLAM3比前两代清晰不少但整个系统的耦合度还是偏高想替换某个模块做二次开发需要花不少精力。2.2 直接法和半直接法的抉择DSO、SVO与LSD-SLAM特征点法之外另一条技术路线是直接法。直接法不依赖特征点匹配而是直接对图像的像素灰度进行配准好处是在纹理较弱的环境下有更好的鲁棒性劣势是对光照变化极其敏感而且对相机内参标定精度要求很高。DSODirect Sparse Odometry是直接法里的代表作。它在跑EuRoC数据集时能拿到非常漂亮的轨迹精度在某些场景比ORB-SLAM还准。DSO的代码实现非常精巧但对二次开发来说不算友好文档少代码结构复杂想改相机模型得先读大半天代码。LSD-SLAM是更早的直接法方案做的是半稠密重建精度和鲁棒性比DSO差一些主要价值在学术思想上。SVO则是半直接法的思路它对关键帧的特征点块做直接配准同时配合特征匹配做位姿优化。SVO的速度非常快早期版本能跑到实时帧率以上适合对计算资源要求严格的无人机场景。但SVO在鲁棒性上偏弱跟踪丢失后的恢复机制比较简单不太建议用在复杂环境。适合谁呢我的看法是想快速入门理解前端里程计原理的可以拿SVO当教材追求精度的选DSO追求系统完整性的直接用ORB-SLAM3要省心得多。2.3 视觉惯性紧耦合VINS系列凭什么受欢迎把视觉和IMU融合是移动机器人和AR设备里最常见的SLAM配置。IMU提供高频的角速度和加速度测量视觉提供低频但绝对精度更好的位姿估计两者融合之后既能在快速运动时稳住姿态又能抑制IMU的漂移积累。VINS-Mono和VINS-Fusion是港科大开源的项目也是国内影响力非常大的视觉惯性方案。VINS-Mono支持单目IMUVINS-Fusion扩展了双目、双目IMU、纯双目等模式。我在实际项目里用过VINS-Fusion它的初始化过程比较完善IMU和视觉之间的外参标定、时间戳对齐这些细节都处理得不错尤其是在运动激励足够的情况下初始化成功率和精度都很好。VINS-Fusion还有一个让我觉得实用的点支持全局位姿图优化可以接入GPS或其他绝对位置观测来做漂移纠正。这对户外车辆定位来说很有价值。代码质量方面VINS-Fusion整体可读性尚可ROS封装完整跑数据集很容易上手。缺点是它没有像ORB-SLAM3那样主动做场景重建只输出稀疏特征地图如果你需要稠密建图后续还得另外接方案。2.4 视觉SLAM方案的共同痛点这里要泼盆冷水。视觉SLAM看着热闹但在真实工程场景里大部分开源方案都过不了“鲁棒性”这道坎。光照突变、快速运动带来的运动模糊、纹理缺失带来的特征崩塌、动态物体入侵带来的错误匹配这些都是常见杀手。我在做AGV项目时曾经测试过好几个视觉方案在仓库环境下货架的纹理倒是挺丰富但车辆转弯时旋转速度太快图像模糊导致ORB特征点匹配大量失效。后来是怎么解决的降低了最大角速度把相机曝光时间调低同时在运动控制端加了平滑。说白了很多时候不是算法不行是运动控制策略没和感知策略匹配好。这个问题在后面的章节还会展开讲。3. 激光SLAM从Cartographer到LOAM系3.1 Cartographer谷歌作品凭什么成为工业级热门聊完视觉再来看看激光SLAM。目前业内用得最多的开源激光SLAM方案Cartographer肯定排得上号。这是谷歌开源的一套基于图优化的SLAM框架支持2D和3D激光雷达核心优势在于把前端扫描匹配和后端位姿图优化结合得很好能处理比较大的场景和较长的运行时间。Cartographer的前端用的是扫描匹配scan-to-submap matching把新进来的激光帧和当前的子图做匹配获取位姿增量。后端用SPASparse Pose Adjustment做全局优化定期把累积的误差分摊掉。这种设计让Cartographer在大场景下的全局一致性表现明显强于纯滤波方案。2D场景下Cartographer配上一颗16线激光雷达在室内移动机器人上跑基本没什么压力。我实测过办公楼环境下跑半小时地图的闭合效果很稳定。3D模式的Cartographer对算力要求高不少但配合IMU做好初始姿态估计后效果也不错。上手方面Cartographer依赖ROS官方提供了build和run脚本数据集以Rosbag的形式离线跑调试起来比较方便。Cartographer的不足之处也有代码体量大结构复杂参数非常多且部分参数的调整策略文档里讲得不清楚。官方提供了一份配置指南但那只是冰山一角。很多参数对精度影响巨大又没有明确的理论指导怎么调基本是靠试错攒经验。3.2 LOAM及其变体LOAM、A-LOAM、LEGO-LOAM和LIO-SAMLOAM是激光SLAM领域另一个绕不开的经典方案。它把激光里程计分为两个模块高频低精度的姿态估计和低频高精度的建图修正这种双轴处理思路在激光雷达低速运动和低漂移里程计的平衡上做得很好。A-LOAM是它的开源改进版代码精简了许多更适合学习但功能上主要是简化实现。LEGO-LOAM在LOAM基础上做了地面分割和聚类优化用轻量化的图优化后端替代了原先的位姿修正在计算效率和鲁棒性上都有提升。我在园区无人车项目里用过LEGO-LOAM配上一颗Velodyne VLP-16在有大坡度变化和弯道的道路上跑了几公里轨迹精度基本能控制在几十厘米以内。LIO-SAM是集大成者把IMU紧耦合进因子图框架同时利用回环检测做全局优化。它支持雷达、IMU、GPS以及回环因子的融合在户外场景的定位精度和鲁棒性都很出众。代码质量上LIO-SAM比LEGO-LOAM清晰注释也完整一些是目前激光惯性方案里比较推荐学习和实际使用的项目。要注意一点LOAM家族的前端都依赖激光雷达的机械旋转结构和点云特征提取如果雷达本身点密度低、运动畸变严重这些方案的精度都会受到明显影响。轮式机器人转弯时的点云畸变问题是我当年踩得比较多的地方后面放到避坑部分细说。3.3 2D激光和3D激光怎么选2D激光SLAM和3D激光SLAM的选择本质上不是“哪个更先进”的问题而是使用场景的问题。2D激光雷达在平面移动的扫地机器人、配送机器人里是绝对主力Cartographer的2D模式就是典型代表。它的优势是价格亲民、算法轻量、实时性好在室内结构化环境里完全够用。3D激光SLAM适合地形多变、需要感知三维结构的环境比如户外无人车、空中无人机。3D方案的复杂度和算力开销比2D高一个量级而且激光雷达本身价格也贵。我见过有些项目组在室内搬运场景硬上3D SLAM几十万一套的设备最后建出来的地图和2D方案差距并不大这就属于方案选型不合理。反过来要做坡道或崎岖地形的无人车2D雷达只能输出平面切片的点云没有坡度的概念这种场景必须要上3D方案。4. 横向对比七个主流开源方案的整体评估4.1 关键指标横向对比表为了把前面的内容可视化我整理了一个对比表。这里的打分基于我个人的项目经验和社区反馈主观成分难免但大体能反映真实情况。方案传感器支持地图类型定位精度典型场景实时性代码可读性社区活跃度上手难度ORB-SLAM3单目/双目/RGB-D/IMU稀疏/稠密高室内视觉特征丰富高中高中DSO单目稀疏高适合视觉里程计高低中高SVO单目稀疏中极高中低高VINS-Fusion双目/单目IMU/GPS稀疏高高中高高中Cartographer2D/3D激光/IMU占据栅格/子图高2D室内场景中高中高中LEGO-LOAM3D激光/IMU点云中高中高中中中LIO-SAM3D激光/IMU/GPS点云高中高中高中中这张表的“定位精度”只是一个相对参考真实值高度依赖场景。举个例子ORB-SLAM3在纹理丰富的室内场景精度很高但放到长走廊或者空旷厂房精度和鲁棒性都会明显下滑。LIO-SAM在户外场景表现很好但如果是强对称环境回环检测也容易产生歧义。4.2 按应用场景推荐的选型路径选型不能只看算法指标还要考虑整个系统工程。我按场景给几条推荐路径觉得对号入座会比较容易。室内清洁或配送机器人用2D激光的情况多优先看Cartographer的2D模式。原因是它对平面移动的定位问题解决得很成熟回环和全局优化的效果好而且经过大面积验证社区资料也比较多。如果预算允许加装IMUCartographer 2D的精度会更稳。室内视觉导航或视觉抓取场景推荐ORB-SLAM3的RGB-D模式。它可以直接输出物体级别的稀疏地图方便对接机械臂坐标系标定。如果算力足够还可以开启稠密建图模式但要做好性能下降的准备。小型无人机、AR设备这类对算力和重量敏感的VINS-Mono或SVO是不错的选择。尤其是VINS-Mono它的紧耦合方案在快速运动时表现很稳而且初始化失败后的重恢复机制比很多方案都完善。无人机场景我个人的体会是纯视觉方案在剧烈运动下很容易受运动模糊影响IMU的介入几乎是必备的。室外自动驾驶、园区物流车相关场景LIO-SAM是比较省心的选项。它支持GPS和回环的联合优化建图大场景不漂移而且代码结构相对清晰方便接线到下游的路径规划模块。唯一要注意的是它依赖IMU质量IMU性能太差会直接影响前端的姿态估计。4.3 算力成本和工程复杂度选型还有一个容易被忽视的角度算力成本和工程复杂度。SLAM不是孤立运行的算法要接入整个机器人系统上游有传感器驱动下游有定位结果消费方中间还要考虑时间同步、数据格式、坐标系转换这些工程问题。OpenVSLAM和OpenVINS这类方案在学术圈很火代码也有一定成熟度但工程化做起来不算轻松。很多开源方案是论文附属品代码能跑但不代表容易集成。我见过一个团队为了把VINS-Fusion接入自研的C系统光处理ROS消息依赖就花了一周。如果团队里以C开发为主且没有太多ROS经验相对友好的方案是直接采用纯C实现的版本比如ORB-SLAM3的非ROS版本、LIO-SAM的纯CMake工程有人维护了非ROS版本这样不需要引入整个ROS生态就能跑通。ROS的引入确实能快速验证算法但部署到嵌入式设备时ROS的通信开销和版本管理会成为负担。这个取舍要提前想清楚。5. 实操经验从数据集到室内移动机器人的完整评估记录5.1 数据集跑测方法EuRoC、KITTI、TUM和自采数据评估开源SLAM方案第一步通常是跑公开数据集这个环节操作要规范否则结果没有可比性。EuRoC数据集适合评估视觉惯性方案它的场景包含了不同光照条件和运动模式评估时建议用MH_05这类包含快速旋转的序列能检验前端跟踪的极限。KITTI适合激光方案和双目视觉方案野外道路、动态车辆多能评估动态环境下的表现。TUM RGB-D数据集则适合室内RGB-D方案它有专门的评估工具能直接计算轨迹和真值之间的ATEAbsolute Trajectory Error和RPERelative Pose Error。公开数据集能验证算法的基础能力但终究是“别人家的场景”。我习惯在跑完数据集之后自己录一段目标场景的真实数据。录制时需要注意几点传感器时间戳要同步IMU和相机之间的外参要做标定移动轨迹要覆盖直线、转弯、重复路径这些基本工况。评价时除了看轨迹误差更要在实际系统里看定位输出的连续性和稳定性因为规划和控制模块对跳变非常敏感。补充一点公开数据集的评估结果和实际场景的差距可能很大。ORB-SLAM3在EuRoC上表现很好但在我们厂区的暗光通道里几乎没法用因为它的特征提取对亮度太敏感。所以真正常用的评估路径是公开数据集算法能力摸底自采数据验证工程可行性最后在真实机器人上长时间大规模跑动来验证鲁棒性。5.2 一次室内移动机器人项目的实测记录分享一个比较典型的室内项目评估案例。项目背景是一台轮式巡检机器人要求在大约5000平方米的仓库环境里实现自主导航定位配备的传感器是16线激光雷达、低成本IMU和单目相机。我们当时在Cartographer和LIO-SAM之间做了对比。先测Cartographer 2D。激光雷达安装高度大概在离地30厘米这是因为仓库里货架底部有空洞降低雷达高度可以扫到更多结构特征。跑了一遍全库区的建图耗时约20分钟过程中机器人按预设路径走完全部通道。生成的地图闭合效果不错回到起点后位置误差大约在20厘米左右。但后续做导航定位时发现一个问题Cartographer 2D在地图边缘区域也就是靠近货架间隙的地方定位偶尔会发生小幅跳变这是因为2D扫描在这些区域能获取的特征太少。再测LIO-SAM。前端的点云特征提取能提供更丰富的约束加上IMU的紧耦合整个运行过程的位姿输出明显平滑很多。建图完成后回到起点位置误差在10厘米以内。导航过程中的跳变现象也有改善因为IMU保证了高频姿态的稳定性。不过LIO-SAM对IMU的数据质量比较敏感我们最初用的低成本IMU零偏比较大跑几分钟后轨迹就开始飘后来换了更好一点的IMU才稳住。这个项目的结论是在仓库这种低矮结构复杂、转弯多的场景下LIO-SAM的综合表现优于Cartographer 2D。但Cartographer的优势也很明显对硬件要求更低IMU甚至可以用很便宜的模块而且地图形式更适合2D路径规划。所以最终方案是建图阶段用LIO-SAM生成高精度点云地图然后投影生成2D栅格地图供导航使用在线定位阶段用Cartographer 2D。这种“离线高精度建图在线轻量级定位”的混合架构在实际项目里非常常见也是我把这个案例写出来的原因。5.3 长时间运行的退化场景和重定位长时间运行是SLAM实用化绕不开的挑战。误差累积、场景动态变化、传感器老化带来的参数偏移都会让算法性能逐步下降。市面上成熟的商用方案都会设计重定位机制在模型丢失后能自动恢复位置。ORB-SLAM3在这方面做得不错它的多地图机制允许在跟踪丢失后创建新地图之后如果识别到旧地图里的场景可以切换回旧地图继续工作。Cartographer没有这么轻量的机制一旦定位丢失基本要重新初始化。LIO-SAM的恢复也不容易因为缺少对已有地图的中央存储和查询机制。这些差异在选型时要特别留意如果项目对长时间无人持续运行有需求重定位能力必须作为高优先级指标。我在实际项目里也遇到过几次定位丢失的情况最常见的原因是在一条看起来完全一样的走廊里出现歧义或者是被临时堆放的货物改变了局部特征。解决方法是尽量在使用SLAM的同时配合布置环境特征标识比如贴二维码路标在SLAM失效时靠标识符辅助恢复全局定位。这也是很多工厂自动化项目采用的主流做法SLAM负责连续跟踪视觉标签处理歧义和恢复。6. 常见问题与避坑指南6.1 定位精度上不去的典型原因很多人拿到一个开源SLAM方案跑完数据集觉得效果不错一到自己的机器人上就发现精度上不去。根据我的经验大多数时候问题不在算法本身而在几个容易被忽略的环节。第一传感器标定不充分。相机内参、激光雷达和IMU之间的外参、IMU零偏任何一个不准都会直接影响前端约束的质量。尤其是视觉惯性方案外参误差对精度的影响非常明显。我在一个视觉抓取项目里就吃过亏相机和IMU之间的外参文件是从旧版本参数里拷过来的结果视觉部分对齐一直有偏排查了一天最后发现是外参里一个旋转分量的符号不对。第二时间戳同步缺失。多传感器方案里时间戳对齐是基础中的基础。IMU频率通常有100Hz以上相机只有20到30帧如果不做时间戳同步融合时的时间偏移会直接转化为位姿误差。用ROS时建议用time-synchronizer或者message_filters做同步非ROS环境则建议用硬件触发来同步传感器。第三运动控制太激进。前面也提过高速旋转或急加减速不仅会让视觉图像模糊也会导致激光点云畸变加重。控制算法在做轨迹规划时应该把传感器感知的约束考虑进去限制过高的角速度和线加速度。6.2 地图漂移和回环失效的排查思路地图漂移最典型的症状是机器人运行一段时间后回到原点但地图上显示的位置和实际位置偏移很大。排查思路可以从定位到建图、从精度到回环检测逐层展开。先看定位估计是否准确如果漂移一直增长而不是突然跳变多半是前端约束不够强要检查特征提取的稳定性和传感器的数据质量。再看回环检测有没有正常工作可能的原因包括回环检测的匹配阈值设置过高或过低导致该触发的时候不触发、不该触发时误触发词袋模型里的字典覆盖度不够特征表达不了当前场景或者全局优化器的频率太低导致误差累积到回环之前就已经很大。如果漂移只在某个特定区域出现要特别注意环境的对称性问题。比如一排一模一样的货架或者重复的走廊很容易造成回环检测的误匹配。常见解法是增加额外的传感器信息比如接入IMU或者视觉特征来帮助区分不同位置或者在明显重复的区域做“场景指纹”标记辅助回环判断。6.3 参数调优心得别盲目照搬别人的配置文件开源SLAM方案大多有默认配置但默认配置只保证“能跑”不保证“跑得好”。参数调整是一项偏经验性的工作没有统一标准但有些规律可以遵循。Cartographer里的参数尤其多活跃子图大小、匹配阈值、位姿图优化频率等都直接影响建图和定位效果。我的调参方法是在固定数据集上做对比单次只改一个参数记录生成的轨迹误差和运行耗时然后做参数组合优化。这种做法虽然费时间但在真实项目中反而最快因为大部分组合的失败原因一眼就能看出来。调参时有一件必须注意的事别盲目照搬别人帖子里发布的参数尤其是那些针对特定雷达和场景调的参数。别人的雷达测距噪声特性、安装位置、场景结构和你的很可能完全不一样。网上有些分享说“把某个参数调到某个值效果特别好”真实原因可能是他那个IMU数据噪声比较特殊放到你的设备上会适得其反。参数调优一定要基于自己的设备、数据和评价指标来开展。6.4 算力受限场景的优化思路分享部署到嵌入式平台时SLAM的算力开销往往成为瓶颈。几个优化的思路可以分享。前端检测和匹配是整个SLAM管线里计算量最大的部分如果用的是特征点法可以降低图像分辨率或者把特征点数量上限调低避免过多的无效计算。激光类方案里可以对点云做降采样前提是保持关键结构特征不丢失。后端优化频率不需要和前端一样高可以拉大间隔以降低CPU峰值。多传感器架构里还可以考虑GPU和CPU的分工用GPU做特征提取加速CPU负责整体调度和后端优化。还有一个角度是算法层面的轻量化。比如对分子地图做局部而非全局的优化只在回环检测触发时才跑全局优化能大幅降低高频端算力压力。这一点在很多开源方案里没有默认开启需要结合自己的场景去改。7. 把评估结论落进自己的项目里最后分享一下我个人在多次方案评估和项目落地后的体会。最重要的一点是开源SLAM方案的选型本质上是一个工程权衡过程。它同时涉及功能指标、工程效率、成本控制、团队技术储备和后期维护能力不只是一个算法好坏的对比。我的建议是先画一张需求清单把所有可能的约束列出来比如传感器是什么、运动场景是什么、实时性要求多少Hz、定位精度要到多少厘米、有没有回环和重定位需求、部署平台算力如何、团队的C和ROS能力如何。然后用这份清单去对照开源方案的能力矩阵横向打分。这样做的优点是可以把主观的“哪个方案好”转化为“哪个方案在特定条件下更合适”评估结论也更经得起推敲。做评估时也别只看GitHub的Star数量那顶多说明关注度高不能代表代码质量和工程成熟度。真正值得关注的是最近一年内的commit频率、Issue回复速度、社区里有没有人在讨论实际部署中的坑。一个Star数量很高但长期没有维护的项目和一个小众但持续更新了一年的项目在工程选型上我更倾向于后者。写这篇文章时我又重新审视了一遍自己接触过的这些开源方案。SLAM这个领域发展非常快今天最好的方案可能过两年就会被新思路取代。但不管技术和工具如何迭代选型背后的工程思维和环境理解始终是贯穿其中的核心能力。所以手头的项目到底应该选哪个方案不妨带着这份评估去实际跑一遍数据集答案会更快浮出水面。
返回列表