ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

开源SLAM方案评估实战指南:从选型到调参一次讲透

开源SLAM方案评估实战指南:从选型到调参一次讲透 做移动机器人和自动驾驶感知这些年我经常被问到同一个问题开源SLAM方案这么多ORB-SLAM、Cartographer、LOAM、VINS-Mono……到底该选哪个说实话这问题没有标准答案。不同传感器配置、不同应用场景适合的方案完全不一样。但评估的思路和流程是通用的而且比选型本身更重要。这篇文章我把过去几年在多个实际项目里做开源SLAM方案评估的完整方法论整理一遍从方案分类、评估维度、实操步骤到踩坑记录尽量一次讲透。无论你是刚准备入门视觉SLAM的新手还是已经在做机器人导航的工程师这篇内容都可以直接当成一份选型参考手册来用。1. 开源SLAM方案全景先搞清楚你手里有什么牌1.1 SLAM在解决什么问题为什么开源生态这么重要SLAM全称是Simultaneous Localization and Mapping同步定位与建图。通俗点说就是让一台机器人或设备在完全陌生的环境里一边确定自己在哪里一边画出周围的地图。这个能力是移动机器人、无人机、AR设备、自动驾驶车辆的核心基础设施。以前这门技术基本掌握在高校实验室和少数大厂手里这几年情况完全变了一大批高质量开源项目把门槛拉低了好几个档次普通团队甚至个人开发者也能在很短时间内搭建一套可运行的SLAM系统。我以前给新手讲SLAM经常用这样一个类比你蒙着眼睛走进一个陌生房间一边用手摸墙确认自己走到了哪一边在脑子里拼出房间的轮廓。SLAM干的就是这件事只不过把“手摸墙”换成了相机或激光雷达的数据输入把“脑子里拼图”换成了后端优化算法。开源生态的价值在于这些拼图算法、特征提取模块、回环检测实现都已经有人写好并开源了你不必从零推导卡尔曼滤波和图优化理论可以直接站在前人的肩膀上做二次开发。开源还有一个隐形红利就是社区验证。一个SLAM方案在论文里说效果好不算数但如果有大量开发者在不同硬件、不同环境里跑过踩过的坑和调参经验都会沉淀在GitHub的issue、博客和论坛里。这套自发的“众测”体系比任何官方宣传都可靠得多。1.2 三大流派视觉、激光、多传感器融合谁更靠谱主流的开源SLAM方案可以粗分成三大流派先弄清楚这个分类后面选型才有方向。第一类是视觉SLAM核心传感器是单目、双目或RGB-D相机。代表项目非常明确ORB-SLAM系列是特征点法里当之无愧的标杆LSD-SLAM和DSO则是直接法的代表RTAB-Map在RGB-D领域也有大量用户。视觉方案最大的优点是硬件成本低一个普通工业相机几十块到几百块就能开始跑而且能提供丰富的语义信息方便后续做目标识别、路径规划。缺点是受光照影响大纯视觉方案面对白墙、暗光、快速运动时容易翻车。第二类是激光SLAM核心传感器是单线或多线激光雷达。Google的Cartographer是2D激光SLAM公认的标杆LOAM、A-LOAM、LEGO-LOAM则是3D激光领域的经典之作。激光雷达直接测距精度高、不受光照影响所以工业移动机器人领域基本都是激光方案的天下。缺点也明确激光雷达贵而且纯激光方案在长走廊、空旷环境这类几何特征少的场景会出现退化定位漂移得厉害。第三类是多传感器融合近五年是绝对的趋势。VINS-Mono和VINS-Fusion是视觉加惯导的经典方案FAST-LIO系列则把激光雷达和惯导做紧耦合。融合方案用IMU补足了单一传感器在快速运动、纹理缺失时的短板是目前学术界和工业界都重点投入的方向。三派之间没有绝对优劣只是适用的边界不同。评估时要先弄清楚自己手上的传感器组合才能圈定候选方案。1.3 按场景圈定候选别一上来就比精度我做评估的习惯是先列一个候选清单再谈指标。场景决定传感器传感器决定算法流派算法流派决定具体工程。这一步不能省否则后面评估做得再细致都是白费。给你一个我常用场景到方案的初步映射表应用场景典型传感器配置优先考虑的开源方案室内服务机器人导航单线激光雷达 轮式里程计Cartographer、Gmapping室内安防巡检机器人单线激光 RGB-D相机Cartographer、RTAB-Map无人机室内定位双目相机 IMUVINS-Fusion、ORB-SLAM3室外园区无人车多线激光 IMU GNSSLIO-SAM、FAST-LIOAR/VR空间定位单目或双目相机 IMUORB-SLAM3、VINS-Mono仓储物流叉车多线激光 IMULIO-SAM、LEGO-LOAM这个表只是一个起点真正的评估还需要把精度、鲁棒性、资源消耗、工程性全部拉通来看。下一节就聊怎么设计一套完整的评估维度。2. 评估维度怎么定精度之外还有四件要紧事2.1 精度指标ATE与RPE到底在说什么精度是评估SLAM绕不开的第一项但很多人对精度指标的理解比较模糊。业内最常用的两个指标是ATE和RPE它们都来自TUM RGB-D数据集基准后来被各种SLAM评测广泛采用而evO工具就是专门用来计算这两类指标的开源工具。ATEAbsolute Trajectory Error绝对轨迹误差衡量的是估计轨迹和真值轨迹在整体上差了多少。具体计算时先用最小二乘把两条轨迹对齐然后再逐点算误差一般取RMSE作为最终结果。注意轨迹对齐这一步很关键因为单目SLAM的轨迹和真值的坐标系不一定重合必须先做SE(3)对齐才能公平比较。这个对齐求解过程在数学上叫Umeyama算法去eigen库和evo工具内部都实现好了。ATE反映的是系统最直观的定位质量单位是米值越小越好。RPERelative Pose Error相对位姿误差衡量的是固定时间间隔内位姿变化的误差。它更关心局部漂移比如每跑1米、每走10秒位姿误差增加了多少。RPE特别适合评估那些长时间运行的场景因为绝对误差会被时间累积放大而RPE能单独反映局部定位的稳定性。实际评估时我会两个指标一起看ATE体现整体定位精度RPE体现局部平滑性和漂移速度。在同一个数据集上跑不同方案时务必保证输入数据一致、评估区间一致、轨迹预处理方式一致这样的横向对比才有意义。我见过不少团队拿不同数据集、不同截断区间做横向对比最后得出的结论意义不大。2.2 鲁棒性光照、动态障碍、退化场景的真实考验评估SLAM不能只看它在理想数据集上的精度鲁棒性才是工程落地的分水岭。很多方案在TUM或EuRoC数据集上表现惊艳一到实际现场就各种漂移和丢失原因就是数据集环境太干净了。我评估鲁棒性时通常人为制造几类“事故现场”。第一光照突变比如机器人从明亮走廊进入黑暗房间或者室内灯光闪烁视觉方案的图像曝光骤然变化特征提取很容易失效这时候纯视觉方案大概率跟丢而视觉惯性方案或激光方案受影响小得多。第二动态障碍物比如有人从相机前面走过、搬运托盘的车从激光雷达旁擦过动态点如果不做滤除就会被当成静态地图点优化地图直接糊掉。第三退化场景视觉方案最怕白墙和无纹理地面激光方案最怕长走廊和隧道这些环境几何约束不足位姿在某个方向会失去观测支撑专业说法叫退化。我常用的鲁棒性测试方法是在同一场景里跑多组数据每组故意设置不同干扰条件看方案是直接崩溃、精度下降还是能靠回环和IMU补偿自愈。一个方案如果能在恶劣条件下保持不跟丢哪怕精度稍有下降都比在理想条件下精度极高、一遇干扰就崩的方案更适合工程落地。2.3 实时性与资源消耗别跑得动就以为没事SLAM系统是要接在机器人上实时跑的所以实时性和资源消耗是评估里的硬指标。这里有个常见误区很多人在PC上跑得流畅就以为方案没问题但实际机器人的工控机性能往往比你的笔记本差一个档次CPU和内存预算也极其有限。评估实时性我会关注三个数据处理一帧图像或一帧点云的平均耗时、最大耗时和最小耗时。平均耗时决定整体帧率最大耗时决定系统在极限负载下会不会丢帧丢帧在SLAM里是致命的因为位姿失联后系统需要重新初始化。实战中Visual SLAM在嵌入式平台上处理频率通常只能做到10到20赫兹如果你输入的图像频率是30赫兹那系统就会持续积压数据滞后越来越严重。资源消耗方面重点是CPU占用率、内存峰值和线程数量。激光SLAM方案对CPU的占用普遍比视觉方案高Cartographer在大地图上内存增长尤其明显。在选定方案之前我建议先在目标硬件平台上做一轮压测把CPU占用、内存增长曲线打出来如果方案在连续运行一个小时后内存仍然单调上升大概率存在内存泄漏这种方案在长期运行的机器人项目里会非常麻烦。2.4 工程性协议、文档、社区活跃度同样决定成败最后一个维度看上去不直接影响定位精度但对落地成本影响极大。评估工程性主要看许可证协议、代码文档质量、依赖管理方式和社区活跃度。许可证协议是个容易忽略但必须重视的雷区。很多开源SLAM项目用的是GPL协议比如ORB-SLAM2如果你的产品要做闭源商用直接把GPL代码嵌进去会有法律风险。相比GPLBSD、MIT这类宽松协议就友好得多商用基本不受限制。如果你要基于开源方案做商业产品选型阶段就要把这个约束考虑清楚。代码质量这块建议大家重点看几个点代码注释是否完整CMakeLists组织是否清晰是否有单元测试是否有现成的ROS封装依赖库版本是否锁定。文档方面官方README里有没有提供数据集下载链接、依赖安装步骤和常见问题说明。社区活跃度看GitHub的star数、open issue数量和最近commit时间就够了如果一个项目已经两年没有更新issue里问题成堆没人回复那即使算法很优秀你用起来也会非常痛苦。工程性评估的结果往往比单纯的精度对比更能决定一个方案能不能最终上车量产。3. 实操评估流程从环境搭建到出报告3.1 环境准备Ubuntu、ROS与依赖库的推荐组合评估开源SLAM方案我推荐在Ubuntu 20.04上加ROS Noetic这套组合兼容性最好网上能搜到的教程和踩坑记录也最多。如果你的项目必须用Ubuntu 22.04大部分方案也能装但编译时踩的坑会明显增加不建议评估阶段就给自己加难度。依赖库方面最常见的几件套是OpenCV、Eigen3、Pangolin、g2o、DBoW2、Ceres和一些图像处理库。这里我要专门提醒一句依赖库能装发行版就尽量用发行版不要在评估阶段自己源码编译。因为SLAM项目对Eigen、OpenCV版本非常敏感版本不对轻则编译报错重则运行结果完全不可复现。我一般用apt安装Eigen3和OpenCV再配合vcpkg编译Pangolin这类工具库能省掉很多版本冲突问题。如果你要跑多个方案我强烈建议用Docker搭建隔离环境。因为不同SLAM方案对依赖版本的要求经常互相打架比如A方案需要OpenCV 3.xB方案却非要OpenCV 4.x装在一个系统里会让人崩溃。用Docker把每个方案单独封装成镜像评估完一个销毁一个干净利落。我自己维护了一个评估用的镜像里面预装了ORB-SLAM2、VINS-Fusion和Cartographer新硬件到了直接拉镜像跑测试省去重复配环境的时间。3.2 数据集怎么选EuRoC、TUM RGB-D、KITTI各有侧重跑评估必须有标准数据集这既是公平对比的基础也是省时间的关键。自己采集数据做评估当然也行但没真值轨迹精度算不准而且实际采集环境的干扰变量太多不方便复现。标准数据集则自带真值轨迹社区认可度也高。用得最多的三个数据集是EuRoC MAV、TUM RGB-D和KITTI。EuRoC是无人机在室内环境用双目相机加IMU采集的包含Machine Hall和Vicon Room两个系列视觉惯性方案基本都用它做基准我评估VINS和ORB-SLAM3时第一时间就会用它。TUM RGB-D是手持RGB-D相机在室内办公室采集的常用于评估RGB-D和单目方案数据集很贴心地给了不同运动速度、不同光照条件的子序列对测鲁棒性很有用。KITTI是老牌的自动驾驶数据集用双目相机和64线激光雷达在室外道路采集适合评估大场景、高速运动下的视觉里程计不过它没有IMU数据融合方案用起来会受限。数据集的格式细节也要提前研究。TUM的groundtruth是文本格式每行是“时间戳 tx ty tz qx qy qz qw”而EuRoC是CSV格式且时间戳单位是纳秒处理时不统一很容易出错。我一般会写一个脚本把不同数据集统一转成TUM格式再进下一步评估省得每个方案都要单独处理一遍。3.3 标定环节用kalibr给相机和IMU做标定要跑视觉或视觉惯性SLAM方案标定环节绕不过去。虽然有些数据集自带标定文件但真机环境下相机内参、畸变系数、相机和IMU的外参每一项都直接影响定位精度。kalibr是苏黎世联邦理工开源的一套标定工具支持相机内参标定、相机-IMU外参标定和多相机联合标定是SLAM圈事实上的标准工具。标定相机的流程是这样的。先打印一张Aprilgrid棋盘格固定在平整墙面或白板上然后用待标定相机对着棋盘格缓慢移动录制一段十分钟的rosbag移动时注意覆盖不同角度、不同距离、不同光照接着用kalibr_calibrate_cameras命令跑标定。一条参考命令如下kalibr_calibrate_cameras \ --bag ./calib.bag \ --topics /cam0/image_raw \ --models pinhole-radtan \ --target ./aprilgrid.yaml跑完会生成一个camchain.yaml文件里面包含相机内参和畸变系数。相机-IMU外参标定则要录制更特殊的数据先把设备静止一段时间让IMU充分观察到重力方向然后再缓慢运动让视觉和IMU都能捕捉到足够的激励。如果标定出来的外参平移误差超过几厘米、旋转误差超过一两度SLAM系统跑起来位姿漂移会非常明显这时候优先检查标定数据的质量而不是折腾算法参数。3.4 跑通方案并保存轨迹先能跑再谈评估环境、数据、标定都准备好之后就进入实际运行阶段。我会按“先跑通再跑稳再跑快”的顺序来推进。刚开始不要纠结参数按官方默认配置能出轨迹就行。等确认整个链路通了再逐步调整参数做精细评估。运行开源SLAM方案时最常见的操作是回放rosbag。比如评估双目方案先启动SLAM节点再用rosbag play回放EuRoC数据集同时用rosbag record把输出的轨迹topic录下来。不同方案输出的位姿topic名称不一样有的以里程计odometry形式输出有的是posestamp或path形式格式差别不小。这里我建议先rostopic list查看所有话题找到真正的位姿输出话题再去订阅。如果topic被抓错后面算误差会得出完全离谱的结论。运行过程中我会同步观察可视化窗口注意几个关键信号初始化是否成功、特征点数量是否充足、回环是否被触发、位姿是否平滑。单目方案初始化慢或者失败很常见有时候需要移动相机才能引导初始化。如果运行过程中位姿突然跳变多半是回环优化触发或者跟踪丢失之后重定位了。这些现象都会直接反映在最终的轨迹文件里评估时要结合这些现场观察来理解数值结果。3.5 用evo统一出评估报告轨迹保存好后统一用evo来做误差分析。evo是目前用得最多的SLAM评估工具把TUM、KITTI、EuRoC等格式的轨迹都支持得很好一条命令就能输出ATE、RPE和对应的图表。安装很简单pip install evo --upgrade --no-binary evo最常用的命令是evo_ape和evo_rpe。比如拿TUM格式的轨迹文件评估绝对轨迹误差evo_ape tum ./groundtruth.tum ./output_trajectory.txt -va --plot --plot_mode xy这里-v表示输出详细信息-a表示做轨迹对齐--plot和--plot_mode用来出图。相对轨迹误差就把命令换成evo_rpe参数逻辑基本一样。如果你有多个轨迹要对比可以用evo_traj把真值和不同方案的输出一起画在图上直观看到它们之间的偏差evo_traj tum ./gt.tum ./orb_slam2.txt ./vins_fusion.txt -p --plot_modexy出报告时我一般会跑一遍全套指标ATE的RMSE、MEAN、MEDIAN、STDRPE的RMSE等把这些数值汇总成一个表格。同一组数据多跑几次看结果是否稳定。SLAM的误差评估天然带有随机性不同次运行可能因为特征点匹配的微小差异导致结果有波动评估时至少要跑三遍取平均才能得到比较可信的结论。我见过有同事只跑一遍被单次运行的随机误差误导差点把好方案换掉。4. 主流开源方案横向对比我踩过的和实测过的4.1 视觉方案ORB-SLAM2/3、LSD-SLAM、RTAB-MapORB-SLAM2是视觉SLAM领域绕不开的项目作者就是后来做ORB-SLAM3的Raúl Mur-Artal。它支持单目、双目、RGB-D三种模式核心思路是ORB特征点法加三大并行线程跟踪、局部建图、回环检测。这套架构设计极其经典后面的很多开源SLAM方案都借鉴了它的思路。ORB-SLAM3还加入了视觉惯性紧耦合、多地图系统在无人机和AR场景里的表现更好。我用下来最直观的感受是ORB-SLAM在纹理丰富的室内环境下跟踪非常稳EuRoC数据集上轨迹误差通常能做到厘米到分米级别而且回环检测召回率高能让大场景的漂移被及时拉回来。LSD-SLAM是直接法的代表作思路是不提取特征点直接基于图像像素亮度来做位姿估计。它的优势是在低纹理场景下比特征点法更有生存空间室内白墙环境下ORB-SLAM可能因为特征点数量不足而跟丢LSD-SLAM还能靠像素梯度信息硬撑住。但它对相机标定和曝光一致性很敏感如果图像有运动模糊或者卷帘快门效应严重直接法就很容易漂。LSD-SLAM官方已经停止维护很久了我不建议在新项目里直接用但作为理解直接法思想的教材它价值依然很高。RTAB-Map是另一个老牌方案它对RGB-D相机的支持非常完善而且不只是SDK还内置了一套完整的网络图优化工具。它的特点是把回环检测做得非常重使用词袋模型加空间一致性校验回环一旦检测到能显著修正累积漂移。如果用Kinect、RealSense这类深度相机做人形机器人或小车的室内导航RTAB-Map是很稳妥的选择配合Cartographer甚至可以做视觉激光融合。缺点是重内存建图时间长了会越来越慢需要合理配置回环搜索窗口。4.2 激光方案Cartographer、LOAM系与LEGO-LOAMCartographer是Google开源的一套基于图优化的SLAM框架支持2D和3D最广泛的应用是2D激光建图。它的核心思想是局部用扫描匹配和子图构建全局用回环约束做优化。子图机制是它的精髓机器人每运动一段时间就形成一小段子图当新帧与历史子图之间存在足够的匹配约束后端就会触发回环优化把大尺度的漂移修正掉。在做室内移动机器人的项目时Cartographer是我默认的首选实测下来在平整地面环境下定位精度很稳定而且用单线雷达就能达到不错的建图效果硬件成本可控。它的缺点是调参门槛比较高建图参数、回环参数、体素尺寸几十个参数互相耦合新手上手经常不知道从何调起。LOAM是Ji Zhang提出来的3D激光里程计算法后来开源了A-LOAM等改进版本。LOAM的思路很巧妙通过提取边缘点和平面点分别做帧间匹配再用扫描匹配优化位姿。它把定位和建图分成了两条线一条高频低精度地做里程计一条低频高精度地做建图。LEGO-LOAM在此基础上加入了地面分割和两步优化在复杂道路环境下的表现更好。这套方案实现精简、效率高在不少中小型机器人平台上都跑得起来。但它没有回环检测长时间运行会累积漂移所以实际部署时通常要和Cartographer或者后端图优化配合使用。需要注意纯激光方案在几何退化场景下的短板是非常明显。空旷广场、长直走廊、隧道这类场景激光扫描得到的所有点几乎共面或者共线位姿估计的约束缺失系统会沿着某个方向漂移而浑然不知。处理退化问题业界主流做法是引入IMU做视觉惯性融合或激光惯性融合这正是多传感器融合方案近几年越来越受重视的原因。4.3 多传感器融合方案VINS-Mono/Fusion与FAST-LIOVINS-Mono是港科大开源的单目视觉惯性里程计后来扩展成VINS-Fusion支持双目加惯导、单目加惯导、纯视觉和纯GNSS融合等多种模式。它用紧耦合非线性优化的方式把视觉、惯性和可选的GNSS数据一起优化输出高频率的里程计结果。我在无人机上实测过VINS-Fusion快速运动、短时纹理丢失时IMU能撑住短期的位姿估计等视觉恢复后系统再拉回来这种“你不行我顶上”的机制很靠谱。但VINS的初始化阶段比较挑数据如果IMU和视觉激励不充分初始化可能迟迟完成不了。FAST-LIO是港大MARS实验室开源的激光惯性里程计核心是基于迭代误差状态卡尔曼滤波的紧耦合框架。它的特点是计算效率高、精度出色在一块普通的ARM板子上都能跑得动而且对快速运动和退化场景的鲁棒性做得很好。我实测FAST-LIO在长走廊这种激光退化场景下靠着IMU的短时推算能撑住不丢失。这个方案后来迭代出FAST-LIO2用了增量式kd-tree做最近邻搜索效率又有明显提升是目前多线激光雷达加IMU平台的首选之一。LIO-SAM也是绕不开的它是LeGO-LOAM作者后续做的激光惯性方案加入了因子图优化框架支持GPS等额外因子。LIO-SAM在户外大场景的表现比纯LOAM系明显更好回环闭合能力也强不少。不过它的依赖更多工程集成成本稍高适合愿意多花时间调优的团队。4.4 横向对比速查表看完心里有数我把自己这些年用下来各方案的感受整理成了一个速查表。精度评价基于公开数据集的常见表现范围实际效果会随硬件、环境和参数调节有很大浮动。方案传感器依赖精度量级计算负载回环社区活跃度许可证典型适用ORB-SLAM2/3单目/双目/RGB-D/IMU厘米到分米中有高GPL室内视觉定位、ARLSD-SLAM单目分米级中有低GPL学术研究、直接法学习RTAB-MapRGB-D/双目/雷达厘米到分米高有中高BSDRGB-D建图、导航Cartographer单线/多线激光厘米级高有高Apache-2.0服务机器人2D/3D建图LOAM/A-LOAM多线激光厘米级中无中BSD户外快速移动平台LEGO-LOAM多线激光厘米级中低无中高BSD地面车辆、地面分割VINS-Mono/Fusion单目/双目IMU分米级中有高GPL无人机、AR、手持设备FAST-LIO多线激光IMU厘米级低无高GPL嵌入式平台、退化环境LIO-SAM多线激光IMUGNSS厘米级中高有高BSD户外园区、自动驾驶这张表我建议每个做SLAM选型的人都存一份至少能省去不少盲试的时间。提醒一句社区活跃度高不代表适合你的场景最终的取舍还是要回归到第一节说的场景与传感器约束。5. 常见问题与排查技巧实录5.1 编译阶段最容易踩的那些坑开源SLAM项目编译报错是新手遇到的第一道坎我这些年帮同事解决的问题里80%都集中在依赖库版本冲突上。典型的场景是某个项目要求OpenCV 3.x但你系统里已经是OpenCV 4.x编译时各种API不兼容报错。解决办法就是千万不要在系统全局换OpenCV版本用虚拟环境或者Docker隔离每个方案用自己依赖的版本。Pangolin是另一个高频报错点它版本差异很大ORB-SLAM2依赖的旧Pangolin在新版Ubuntu上编译经常报错。建议直接固定使用v0.6版本再跑ORB-SLAM2就很少出问题。还有Eigen的版本检查Eigen 3.4对部分老项目不友好编译时会出现“无法将Eigen::Matrix转换为Matrix”之类的模板报错这种情况下用apt安装系统的libeigen3-dev往往比源码装新版更稳。如果你用Docker或者新装的系统编译前先确认基础依赖装齐再动手不要指望CMake帮你自动找出来。perl、protobuf、yaml-cpp这类库看着不起眼缺一个就能让编译卡在最后一步。我现在的习惯是每开始评估一个新方案先跑一遍它README里的依赖安装命令一条不落十分钟的事能省一天的排查时间。5.2 标定不准后面全白搭标定是视觉SLAM系统里投入产出比最高的一步但也是最容易被忽视的一步。很多人拿着手机或者低端相机凑合标定完就开始跑SLAM结果精度上不去还以为是算法不行。其实算法的优化潜力远比你想象的大很多时候就是内部参数和外部参数本身就不准后端怎么优化都是白搭。相机内参标定最容易犯的错误是图片数量不够、覆盖角度不全。我一般录制标定bag时至少要包含100到200张有效检测到棋盘格的图像并且棋盘的姿态要覆盖画面的四个角和中心区域近景远景都要有。如果标定结果的重投影误差超过0.3像素我基本会判定这个标定效果不合格重新录制。相机和IMU外参标定更难因为IMU本身还有加速度计偏置和陀螺仪偏置需要估计kalibr会一起优化出来。这个环节常见的问题是录制运动过于缓慢或者过于规律导致IMU激励不足外参结果不稳定。我标定IMU时一般不动用延时操作直接手持设备做多方向的持续转动和短距离平移保证加速度计和陀螺仪的激励足够丰富。标定完成后会看一眼外参和物理测量值的差异如果偏差在一两厘米内说明标定基本可信。5.3 评估结果跟论文对不上先查这三个地方这是评估SLAM时最容易产生自我怀疑的时刻。明明按官方教程跑下来了算出来的ATE却比论文里差了十倍甚至几十倍。遇到这种情况不用怀疑人生先按顺序排查三个常见原因。第一轨迹没对齐就计算误差。单目SLAM的轨迹和真值坐标系不一致必须先用Umeyama算法做SE(3)对齐。evo的-a参数就是干这个的如果用evo_ape时忘了设-a数值会非常难看几乎是所有轨GUAN差异的源头。第二评估区间不一致。数据集一般有较长的序列前后可能包含几秒钟静止或初始化阶段如果你切到了不同的时间范围或者真值和估计轨迹的起止时间戳对齐得不好误差自然对不上。我会用evo的--t_max和--t_min参数把评估区间锁定到稳定运行段避免初始化阶段拖后腿。第三时间戳单位或坐标系方向搞反了。EuRoC的时间戳是纳秒级TUM是秒级浮点如果混用时间同步就会出问题误差自然剧烈。另外相机坐标系转成机器人坐标系时可能踩到坐标轴方向反转的问题导致轨迹整体镜像ATE算出来会大得离谱。排查办法是把估计轨迹和真值在Rviz或者evo_traj的图里画出来看一眼如果形状一致只是坐标变换差异那多半是对齐问题如果形状完全不同那就要去查坐标变换和时间同步环节。5.4 参数调优的几条实用经验开源SLAM方案都留了一大堆参数可以调但参数不是拍脑袋改的要找对方向。先说视觉方案ORB-SLAM里最值得动的是特征点数量默认是2000个点在嵌入式平台上可以降到1000或800帧率会明显提升代价是弱纹理环境下的鲁棒性下降。如果跑高分辨率图像觉得卡优先在节点参数里缩小图像分辨率不要直接改特征提取的阈值性价比更高。Cartographer的调参逻辑和多传感器融合优化本质上是一样的就是寻找“准确率”和“鲁棒性”的平衡。关键的参数有CSM的搜索窗口大小、子图插入频率、回环搜索的最小匹配分数。窗口越大回环越容易找到但计算量也越大分数阈值越高回环越可信但漏检率也越高。调参时我习惯一次性只动一个参数配合记录的运行时间、CPU占用、误差指标做对照这样才知道每个参数到底起了什么作用。FAST-LIO这类激光惯性方案能调的点比较少主要看IMU的频率设置。IMU频率在代码里要跟实际硬件匹配如果设错了里程计输出会直接乱掉。先确认ROS下IMU的发布频率是多少再在配置里填对应的数值这个参数错了后面所有事都白做。多传感器融合方案还有一个共性经验权重和噪声协方差矩阵对结果影响极大。VINS和LIO-SAM里都有视觉、激光、惯性的噪声方差设置如果只是按默认值跑不好先确认你的传感器数据量纲单位是否一致再小幅调整对应的噪声方差。把IMU噪声方差调大系统会相对更信任视觉或激光反之亦然。这个平衡点很微妙通常需要几十次实验才能摸准我建议每次从默认值往一个方向调10%记录结果变化趋势再用二分法逼近最优值。磨刀不误砍柴工调参数这事真急不来。做开源SLAM方案评估这些年我自己最大的体会是方案没有绝对的好只有合适不合适。同一个方案在A团队手里是神器换到B团队手里可能被骂得一文不值差别往往不在算法本身而在硬件平台、场景配置和团队对参数的理解深度。评估这套流程看起来费时但长远看非常值得。你越早建立起自己的评估体系和数据集积累后续每做一个新项目都能快速圈定候选方案不用再从零开始踩坑。希望这篇内容能帮你少走一些弯路。最后再说一个小技巧评估过的所有结果和参数都记在一个带日期的文档里三个月后再回头看那份记录比任何论文都值钱。
返回列表