视觉SLAM三巨头实战评测:ORB-SLAM2/3与VINS-Mono在EuRoC数据集上的性能较量

📅 发布时间:2026/7/5 18:40:50 👁️ 浏览次数:
视觉SLAM三巨头实战评测:ORB-SLAM2/3与VINS-Mono在EuRoC数据集上的性能较量
1. 开篇为什么我们要在EuRoC上“跑分”如果你刚接触视觉SLAM可能会被一堆开源算法搞得眼花缭乱ORB-SLAM2、ORB-SLAM3、VINS-Mono个个都说自己又快又准。到底该信谁光看论文里的漂亮曲线可不够是骡子是马得拉出来在标准赛道上溜溜。这个“标准赛道”就是我今天要跟你详细聊的EuRoC MAV数据集。EuRoC数据集是苏黎世联邦理工学院ETH Zurich发布的经典视觉惯性数据集它用一架微型无人机在室内环境飞行拍摄同步提供了双目图像和IMU数据场景覆盖了从简单、中等再到困难的多种运动模式。为什么大家都爱用它做评测因为它有精确的运动捕捉系统Vicon提供的真值轨迹这就像跑步比赛有了精确的计时器你跑出来的轨迹和官方真值一对比误差多少一目了然。我们今天要做的就是把ORB-SLAM2、ORB-SLAM3和VINS-Mono这三个“选手”请上这个擂台用evo这个评测工具给它们做一个全方位的“体检”。我自己在项目里和学术研究中都反复折腾过这几个算法踩过不少坑也积累了一些实战经验。我发现很多教程只告诉你怎么把程序跑起来但很少告诉你跑出来的数据到底意味着什么以及在那些“翻车”的场景里算法到底是怎么“想”的。这篇文章我就想和你分享这些更深入的东西从环境搭建、数据准备、运行命令到最后的精度分析和典型场景下的表现我会结合具体的命令行和结果图表让你不仅能复现更能看懂、能分析。2. 擂台与裁判认识EuRoC数据集与evo工具在开始“跑分”之前我们得先熟悉一下比赛场地和裁判规则。2.1 EuRoC数据集不只是几个数据包EuRoC数据集包含11个序列分为两个场景“Machine Hall”MH和“Vicon Room”V。我们通常用前三个序列MH_01_easy, MH_02_easy, MH_03_medium来做初步的算法验证和对比因为它们运动相对平缓纹理也比较丰富算法比较容易跑出结果。但真正考验算法实力的其实是后面那些带“difficult”标签的序列比如MH_04、MH_05以及V1_03、V2_03这些序列里无人机有快速的旋转和剧烈的运动对SLAM系统的鲁棒性是极大的挑战。数据集提供两种格式ROS bag文件和ASL数据集格式。ROS bag用起来最方便一条rosbag play命令就能喂数据给算法。而ASL格式是一个结构化的文件夹里面分门别类地存放着图像、IMU数据和时间戳文件。ORB-SLAM系列通常更习惯直接读取图像文件所以我们需要用ASL格式。你需要从官网下载数据集然后解压到某个目录比如我习惯放在~/Datasets/EuRoC/下面。这里有个小细节需要注意数据集里的图像是畸变矫正前的原始图像。有些算法如ORB-SLAM的配置文件里需要你指定相机参数包括畸变系数。如果你用的配置文件是针对矫正后图像的而输入了原始图那特征点匹配就会出问题轨迹肯定会飘。我一开始就犯过这个错折腾了好久才发现。2.2 evo量化精度的瑞士军刀评测SLAM轨迹光用眼睛看轨迹漂不漂是不够的的我们需要定量的指标。evo就是干这个的神器。它主要看两个误差绝对轨迹误差APE简单理解就是把你算法估计的整个轨迹通过旋转、平移可能还有尺度缩放对齐到真值轨迹上之后每个对应位姿点的位置差。它反映了轨迹的全局一致性。想象一下你画了一条线APE就是看你这条线画得和模板像不像。相对轨迹误差RPE它不关心整个轨迹的绝对位置只关心一段固定时间间隔比如1秒内算法估计的位移和真值位移的差别。这更能反映里程计在短时间内的漂移情况也就是系统的“近视眼”程度。安装evo很简单用pip就行pip install evo --upgrade --no-binary evo。安装后你就有了一整套命令行工具比如evo_traj用于轨迹可视化evo_ape和evo_rpe用于计算误差。使用evo的关键一步是数据格式转换。EuRoC的真值文件是data.csv我们需要把它转换成TUM格式。ORB-SLAM输出的默认是TUM格式而VINS-Mono需要稍作修改才能输出兼容的格式网上有很多修改版的VINS或者自己写个ROS节点订阅/pose_graph话题保存一下也很简单。3. 选手入场三大算法的部署与运行实战好了场地和裁判都准备好了下面有请三位选手登场。我会带你一步步把它们在Ubuntu系统上跑起来这里以Ubuntu 18.04 ROS Melodic为例其他版本类似。3.1 ORB-SLAM2经典的双目王者ORB-SLAM2是很多人的SLAM启蒙算法。它的代码结构清晰模块化做得很好。安装与编译首先把代码克隆下来git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2 cd ORB_SLAM2 chmod x build.sh ./build.sh编译过程一般很顺利。但如果遇到关于OpenCV的未定义引用错误比如对‘cv::Mat::Mat()’未定义的引用别慌。这通常是CMakeLists.txt里寻找的OpenCV版本和你系统安装的不一致。用pkg-config --modversion opencv看看你的版本然后去修改CMakeLists.txt里find_package(OpenCV x.x QUIET)这一行把x.x改成你的版本号比如3.4。运行EuRoC数据集ORB-SLAM2提供了针对EuRoC的双目例子。假设你的数据集放在/home/yourname/Datasets/EuRoC/MH_01_easy/mav0/那么运行命令如下./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml /home/yourname/Datasets/EuroC/MH_01_easy/mav0/cam0/data /home/yourname/Datasets/EuroC/MH_01_easy/mav0/cam1/data Examples/Stereo/EuRoC_TimeStamps/MH01.txt我来拆解一下这个命令./Examples/Stereo/stereo_euroc双目版本的可执行文件。Vocabulary/ORBvoc.txtORB特征词典用于回环检测。Examples/Stereo/EuRoC.yaml相机参数配置文件这里一定要检查是否和你用的相机模型是否去畸变匹配。后面两个路径分别是左目和右目图像的存放文件夹。Examples/Stereo/EuRoC_TimeStamps/MH01.txt时间戳文件告诉程序按什么顺序读取图像。运行成功后你会看到一个漂亮的GUI窗口显示特征点跟踪和地图点。程序结束后在当前目录下会生成一个CameraTrajectory.txt文件这就是我们需要的估计轨迹。记得第一时间把它复制到别处并重命名因为下次运行会被覆盖。3.2 ORB-SLAM3支持多地图的视觉惯性新星ORB-SLAM3是ORB-SLAM2的全面升级版最大的亮点是紧耦合的视觉惯性融合和多地图系统。这意味着它在IMU初始化阶段就用上了最大后验估计理论上精度更高而且在跟踪丢失时能创建新地图等回到老地方还能无缝合并长期运行能力更强。安装与编译git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3 cd ORB_SLAM3 chmod x build.sh ./build.shORB-SLAM3的依赖更多一些比如需要Pangolin、Eigen3、DBoW2等但脚本基本都能搞定。编译时间会比ORB-SLAM2长一点。运行EuRoC数据集ORB-SLAM3的命令更简洁一些因为它把左右目图像的路径整合了./Examples/Stereo/stereo_euroc ./Vocabulary/ORBvoc.txt ./Examples/Stereo/EuRoC.yaml /home/yourname/Datasets/EuroC/MH_01_easy ./Examples/Stereo/EuRoC_TimeStamps/MH01.txt注意第三个参数直接给到了数据集序列的根目录MH_01_easy程序会自己去找mav0/cam0/data和mav0/cam1/data。这比ORB-SLAM2方便了不少。同样运行后记得保存好生成的轨迹文件。3.3 VINS-Mono以光流为前端的轻快选手VINS-Mono来自港科大它的思路和ORB系列很不一样。它前端使用光流LK光流来跟踪特征点而不是计算描述子进行匹配。这样做的好处是速度快计算开销小在快速运动时更不容易跟丢。后端采用基于滑动窗口的紧耦合优化把视觉重投影误差和IMU预积分误差放在一起优化。安装与编译VINS-Mono是一个ROS工作包所以我们需要在catkin工作空间里编译它。mkdir -p ~/vins_ws/src cd ~/vins_ws/src catkin_init_workspace git clone https://github.com/HKUST-Aerial-Robotics/VINS-Mono.git cd .. catkin_make编译完成后记得把工作空间的环境变量加到.bashrc里echo source ~/vins_ws/devel/setup.bash ~/.bashrc然后source ~/.bashrc。运行EuRoC数据集VINS-Mono运行需要启动三个节点第一个终端启动估计器roslaunch vins_estimator euroc.launch第二个终端启动Rviz可视化roslaunch vins_estimator vins_rviz.launch第三个终端播放数据集bag包rosbag play MH_01_easy.bagVINS-Mono默认不会自动保存轨迹文件。为了用evo评测我们需要修改代码让它把估计的位姿按照时间戳和TUM格式写到一个文件里。网上有很多现成的补丁或者你可以自己写一个简单的ROS节点订阅/vins_estimator/odometry或/pose_graph话题把数据存下来。这是评测VINS必须做的一步。4. 性能对决精度、鲁棒性与场景深度分析跑完了三个算法手里有了三份轨迹文件现在就是最激动人心的对比环节了。我们用evo来生成客观的数据。4.1 量化指标对比APE与RPE我们以MH_01_easy序列为例展示如何使用evo计算APE和RPE。首先转换真值文件格式evo_traj euroc /path/to/MH_01_easy/mav0/state_groundtruth_estimate0/data.csv --save_as_tum这会生成一个data.tum文件。然后计算ORB-SLAM2轨迹的APEevo_ape tum data.tum ./ORB_SLAM2_CameraTrajectory.txt -r angle_deg --delta 1 --delta_unit m -va --plot --plot_mode xz --save_plot ./ORB2_MH01_APE.png --save_results ./ORB2_MH01_APE.zip-r angle_deg表示对齐轨迹时同时考虑旋转和平移。--delta 1 --delta_unit m这是RPE的参数表示以1米为间隔计算相对误差。对于APE这个参数不影响。-va输出详细的统计信息包括均值、中值、RMSE均方根误差、标准差等。--plot和--save_plot生成并保存误差曲线图。--save_results把计算结果保存为.zip文件方便后续批量比较。用同样的命令只需替换轨迹文件路径就可以计算ORB-SLAM3和VINS-Mono的APE。RPE的计算命令类似把evo_ape换成evo_rpe即可。我把自己在三个“简单-中等”难度序列MH_01, MH_02, MH_03上跑出来的RMSEAPE数据整理成了下面这个表格你可以直观地感受一下算法序列ORB-SLAM2 (双目)ORB-SLAM3 (双目)VINS-Mono (单目IMU)MH_01_easy0.038 m0.032 m0.060 mMH_02_easy0.048 m0.041 m0.066 mMH_03_medium0.038 m0.035 m0.135 m注意这个表格数据来源于我的本地测试和部分公开资料的综合实际运行结果会因为参数配置、硬件性能等因素有细微波动但趋势是稳定的。从APE结果看ORB-SLAM3在三个序列上都取得了最好的精度相比ORB-SLAM2有稳定的提升这印证了其紧耦合VIO和多地图技术的优势。VINS-Mono在简单场景下精度尚可但在MH_03这个中等难度序列上误差明显增大。再看RPE的结果它更能反映里程计的漂移率。通常ORB-SLAM3的RPE也是最小的说明其局部一致性最好。VINS-Mono的RPE在平缓运动时与ORB系列相差不大但在转弯或加速时误差增长会更快一些这是因为光流在运动模糊下更容易产生误差。4.2 典型场景下的稳定性“压力测试”只看简单场景的精度还不够我们得把它们扔进“困难模式”里看看。快速旋转与运动模糊V1_03_difficult, V2_03_difficult这是VINS-Mono的“舒适区”。基于光流的前端对快速运动的适应性更强只要图像亮度变化不剧烈特征点还能跟住。而ORB-SLAM系列基于描述子匹配在图像模糊时ORB特征提取和匹配的成功率会下降容易导致跟踪丢失。在我的测试中ORB-SLAM2在V2_03的末尾部分有较高概率丢失而ORB-SLAM3凭借其IMU的预测能力鲁棒性有显著提升但偶尔也会在剧烈抖动后需要时间重定位。VINS-Mono在这些序列上通常能从头跑到尾。低纹理与重复纹理环境这是ORB特征点的“噩梦”。ORB特征依赖图像角点在光滑的白墙或长长的走廊里提取的特征点又少又不稳定。VINS-Mono同样会受影响因为光流也需要有纹理梯度才能工作。不过VINS-Mono的IMU在此刻作用巨大可以在视觉信息短暂失效时提供相对可靠的预测撑过这段“黑暗期”。ORB-SLAM3的多地图系统在这里也展现了价值万一跟丢了它会开一个新地图等回到有纹理的地方再尝试与旧地图合并。光照剧烈变化所有视觉SLAM的天敌。突然开灯或关灯或者有阳光射入的窗口都会导致特征点外观巨变。ORB描述子对光照有一定不变性但并非完全免疫。VINS-Mono的光流对亮度一致性要求更高容易在光照突变时产生错误的跟踪。这个场景下大家的表现都不稳定非常依赖于算法是否设计了专门的光照不变特征或预处理模块。4.3 深入讨论为什么有时双目精度反而不如单目这是一个非常有趣的现象在不少评测中包括一些论文ORB-SLAM2的双目模式在EuRoC上的APE精度有时会略低于其单目模式经过尺度对齐后。这似乎有悖常理双目不是能直接得到尺度信息吗根据社区的分析和我自己的理解原因可能出在三角化的基线选择上。ORB-SLAM2在双目模式下计算三维点时使用的是固定的、较短的物理基线相机间距约十几厘米。而在单目模式下当进行关键帧间的三角化时使用的“基线”是两个关键帧光心之间的距离这个距离可能远大于双目基线。更长的基线意味着三角化对深度估计的误差更小尤其是在远距离上。换句话说单目模式用“运动产生的视差”来估计深度在运动充分时这个视差可能比双目的固定视差更大从而得到更准确的三维点。但这把双刃剑的另一面是单目初始化对运动要求高且在纯旋转时无法三角化鲁棒性不如双目。所以双目的优势在于稳定性和尺度确定性它不需要像单目那样等待足够的平移运动来初始化也不存在尺度漂移。而单目VIO在运动充分时可能通过更优化的BA获得更高的后端精度。ORB-SLAM3通过紧耦合的视觉惯性优化在一定程度上缓解了这个问题使得双目惯性模式的整体表现更为均衡。5. 总结与选型建议没有银弹只有取舍经过这么一番从部署到评测的详细折腾我们可以给这三个优秀的算法画个像了ORB-SLAM2双目像一位严谨的学院派。它结构清晰模块化好代码可读性强非常适合学习和作为研究的基础框架。在纹理丰富、运动平缓的场景下它能提供非常稳定和精确的定位。但在挑战性环境中它是最容易“跟丢”的一个。ORB-SLAM3双目惯性像一位全能的六边形战士。它在ORB-SLAM2的基础上通过紧耦合VIO和多地图系统大幅提升了在快速运动、弱纹理环境下的鲁棒性和长期运行能力。精度通常也是三者中最高的。缺点是系统更复杂计算开销更大对IMU标定质量要求更高。VINS-Mono单目惯性像一位灵活的实战派。它的前端光流跟踪速度极快在快速运动时表现非常鲁棒代码工程化程度高开箱即用。对于计算资源有限的嵌入式平台如无人机或对实时性要求极高的场景它是非常好的选择。但其精度尤其是在复杂轨迹下通常不如优化充分的ORB-SLAM3且对光照变化更敏感。那么在实际项目中该如何选择如果你的场景是室内机器人、AR/VR环境纹理尚可且对精度和全局一致性要求极高甚至需要处理长时间的运行和回环那么ORB-SLAM3是你的首选。虽然它配置起来稍麻烦但带来的性能提升是值得的。如果你的场景是无人机、高速移动的机器人面临大量快速旋转和运动模糊那么VINS-Mono的鲁棒性优势就体现出来了。先保证不跟丢再谈精度。你可以考虑基于VINS-Mono进行改进或者尝试其双目版本VINS-Fusion。如果你刚刚入门SLAM想深入理解一个完整的SLAM系统是如何工作的那么从ORB-SLAM2开始是最好的选择。它的代码是教科书级别的你能清晰地看到跟踪、局部建图、回环检测每一个线程是如何运作的。最后我想说的是所有的评测都是在特定数据集和环境下进行的。真正应用到自己的产品中时一定要在自己的实际场景下进行充分的测试和调参。比如相机标定的质量、IMU和相机的时间同步精度这些因素对VIO系统的影响有时比算法本身的选择更大。我自己的经验是花半天时间好好标定一下传感器可能比换一个算法带来的提升还要明显。SLAM没有完美的算法只有最适合你具体需求的方案。希望这篇超详细的实战对比能帮你做出更明智的选择少踩一些我当年踩过的坑。