恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Ubuntu下双目ORB-SLAM2跑EuRoC数据集:环境搭建、参数调优与轨迹评估实战
首页
资讯中心
/
Ubuntu下双目ORB-SLAM2跑EuRoC数据集:环境搭建、参数调优与轨迹评估实战
Ubuntu下双目ORB-SLAM2跑EuRoC数据集:环境搭建、参数调优与轨迹评估实战
发布时间:2026/10/16 12:23:06
1. 项目缘起与整体思路拆解双目视觉里程计这个方向我断断续续折腾了快两年。最开始上手的是单目方案跑着跑着就发现尺度漂移实在让人头疼——初始化那一下的尺度基本靠运气跑长了轨迹就飘得没法看。后来换成双目虽然标定和同步麻烦一点但尺度是实打实的心里踏实多了。这次要聊的就是在公开的EuRoC数据集上把双目ORB-SLAM2完整跑起来这件事从环境搭建到参数配置再到结果验证我会把中间踩过的坑和关键细节都摊开讲。先说清楚这个内容适合谁看。如果你刚接触视觉SLAM手里有一台还行的电脑想找个靠谱的开源方案入门那这套流程非常适合你。如果你已经在用单目方案但被尺度问题折磨想切到双目那这篇也能帮你少走弯路。甚至你只是想验证一下自己的双目相机标定参数对不对也可以拿EuRoC数据集当基准来对照。核心关键词就几个双目SLAM、ORB-SLAM2、EuRoC数据集、视觉里程计、轨迹评估。这些词后面会反复出现但我会尽量用大白话把每个环节讲透。为什么选EuRoC数据集而不是别的这里有个很实际的考量。EuRoC是苏黎世联邦理工发布的微型飞行器室内数据集里面包含了双目灰度图像、IMU数据、以及高精度的运动捕捉系统提供的真值轨迹。它的双目图像是全局快门同步做得很好而且场景有纹理丰富的室内环境也有光照变化和快速运动的片段。对于验证双目SLAM算法来说这个数据集的质量和标注精度都是第一梯队的。更重要的是它足够小不像KITTI那样动辄几十个G下载和跑实验的门槛低很多。我实测下来一个完整的MH_01序列也就几个G普通笔记本就能跑。ORB-SLAM2这个方案本身也值得说道说道。它是基于特征点法的经典SLAM系统支持单目、双目和RGB-D三种模式。双目模式下它利用左右图像的视差直接计算深度不需要像单目那样等初始化启动就能工作。它的核心是三个线程并行跟踪线程负责每帧的位姿估计局部建图线程管理关键帧和地图点闭环检测线程负责消除累积误差。这种多线程架构在当年是很超前的设计放到现在也依然能打。选它作为入门方案一方面是因为代码结构清晰另一方面是社区资料多遇到问题容易找到参考。整体思路其实不复杂先把环境搭好包括操作系统、依赖库和ORB-SLAM2本体然后准备EuRoC数据集注意目录结构要对接着配置双目模式的参数文件这里面的门道最多最后运行并评估轨迹精度。听起来就四步但每一步都有细节能让你卡半天。我见过太多人卡在依赖版本冲突上或者参数文件里一个路径写错导致跑不起来。所以下面我会把每个环节拆开把容易出问题的地方重点标出来。2. 环境搭建与依赖处理2.1 操作系统与基础工具的选择我用的环境是Ubuntu 18.04这个版本在SLAM社区里算是比较稳的。为什么不用更新的20.04或者22.04主要是ORB-SLAM2依赖的Pangolin和OpenCV版本在18.04上兼容性最好。当然你在20.04上也能跑但可能需要手动编译一些库的特定版本对新手不太友好。如果你已经在用别的版本也不用急着换系统先试试看能不能编译通过实在不行再考虑用Docker或者虚拟机。基础工具方面cmake、g、git这三样是必须的。安装命令很简单sudo apt update sudo apt install cmake g gitcmake的版本建议3.10以上g建议支持C11标准。这些在18.04的默认源里都满足。另外我强烈建议装一个terminator或者tmux因为ORB-SLAM2运行时会开三个可视化窗口用普通终端切来切去很麻烦。tmux可以分屏一边看运行日志一边看轨迹窗口效率高很多。2.2 核心依赖库的安装与版本控制ORB-SLAM2的依赖主要有四个OpenCV、Eigen3、Pangolin和DBoW2。其中DBoW2是ORB-SLAM2自带的不用单独装。前三个需要自己处理。OpenCV我推荐用3.4.x版本具体来说是3.4.5或者3.4.10。为什么不用OpenCV 4因为ORB-SLAM2的代码里有一些API在OpenCV 4里被移除了比如cv::FileStorage的某些用法直接编译会报错。如果你非要用OpenCV 4需要改代码对新手来说没必要。安装OpenCV 3.4的步骤稍微有点长我列一下关键命令sudo apt install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev git clone https://github.com/opencv/opencv.git cd opencv git checkout 3.4.10 mkdir build cd build cmake -D CMAKE_BUILD_TYPERelease -D CMAKE_INSTALL_PREFIX/usr/local .. make -j4 sudo make install这里有个坑要注意make -j4里的数字根据你CPU核心数来核心多就写大一点但别超过实际核心数否则可能内存不够导致编译失败。我试过在4核8G的机器上开-j8结果编译到一半直接卡死。另外安装完之后要配置一下环境变量不然编译ORB-SLAM2的时候可能找不到OpenCVsudo sh -c echo /usr/local/lib /etc/ld.so.conf.d/opencv.conf sudo ldconfigEigen3的安装就简单多了直接apt装就行sudo apt install libeigen3-dev但要注意有些系统默认装的是Eigen 3.2而ORB-SLAM2需要3.3以上。检查一下版本pkg-config --modversion eigen3如果低于3.3就去Eigen官网下载源码编译安装。Eigen是纯头文件库编译安装很快不会出什么幺蛾子。Pangolin是用来做可视化的ORB-SLAM2用它显示当前帧、地图点和轨迹。安装Pangolin需要先装一些依赖sudo apt install libglew-dev libpython2.7-dev git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build cd build cmake .. make -j4 sudo make installPangolin的版本也有讲究。新版的Pangolin对C标准要求更高可能和ORB-SLAM2的代码不兼容。我建议用v0.5这个版本比较稳。如果编译ORB-SLAM2时报Pangolin相关的错误大概率是版本问题回退到v0.5试试。2.3 ORB-SLAM2的编译与常见报错处理依赖都装好之后就可以编译ORB-SLAM2了。先克隆代码git clone https://github.com/raulmur/ORB_SLAM2.git cd ORB_SLAM2 chmod x build.sh ./build.sh这个build.sh会依次编译DBoW2、g2o和ORB-SLAM2本体。整个过程大概需要十几分钟取决于你的机器性能。编译过程中最常见的报错有这么几类第一类是找不到OpenCV。报错信息通常是fatal error: opencv2/core/core.hpp: No such file or directory。这说明编译器没找到OpenCV的头文件路径。解决办法是在CMakeLists.txt里手动指定OpenCV路径或者检查/usr/local/include/opencv2是否存在。如果不存在说明OpenCV没装好重新装一遍。第二类是C标准问题。报错信息里会出现std::atomic或者nullptr相关的错误。这是因为ORB-SLAM2的CMakeLists.txt里默认用的是C11但有些系统默认标准不对。解决办法是在CMakeLists.txt里加上set(CMAKE_CXX_STANDARD 11)和set(CMAKE_CXX_STANDARD_REQUIRED ON)。第三类是链接错误报错信息里有一堆undefined reference。这通常是库的链接顺序问题或者某个库没装全。我遇到过一次是Pangolin没装好导致链接时找不到符号。重新装一遍Pangolin就好了。编译成功后你会在ORB_SLAM2目录下看到Examples文件夹里面有针对不同数据集的运行脚本。双目对应的脚本在Examples/Stereo目录下后面我们会用到。3. EuRoC数据集准备与目录结构3.1 数据集下载与序列选择EuRoC数据集可以从官网下载里面有很多个序列比如MH_01到MH_05是微型飞行器在室内悬停和慢速飞行的数据V1_01到V1_03是更剧烈的飞行V2_01到V2_03是带有光照变化的场景。对于初次跑双目ORB-SLAM2我建议从MH_01开始因为这个序列运动平稳纹理丰富最容易出好结果。下载下来的数据是压缩包格式解压后你会看到两个文件夹mav0和cam0、cam1。实际上EuRoC的数据组织是这样的mav0下面有cam0和cam1两个子文件夹分别对应左目和右目相机。每个相机文件夹里有data文件夹存放图像还有sensor.yaml文件存放标定参数。另外mav0下面还有state_groundtruth_estimate0文件夹里面是真值轨迹用来评估精度。3.2 目录结构整理与路径配置ORB-SLAM2对数据集的目录结构有固定要求。它期望的格式是这样的EuRoC/ └── MH_01_easy/ └── mav0/ ├── cam0/ │ ├── data/ │ └── sensor.yaml ├── cam1/ │ ├── data/ │ └── sensor.yaml └── state_groundtruth_estimate0/ ├── data.csv └── sensor.yaml如果你下载的压缩包解压后结构不对需要手动调整。我见过有人把cam0和cam1直接放在MH_01_easy下面结果运行时报找不到图像。所以这一步一定要仔细检查。另外ORB-SLAM2的双目模式需要两个图像文件夹的路径以及一个时间戳文件。EuRoC的图像文件名本身就是时间戳比如1403636579763555584.png所以不需要额外的时间戳文件。但ORB-SLAM2的代码里默认会去读一个times.txt这个文件在EuRoC里没有。解决办法是修改代码或者用脚本生成一个。我推荐用脚本生成简单快捷cd EuRoC/MH_01_easy/mav0/cam0/data ls *.png | sed s/.png// times.txt然后把这个times.txt复制到cam1/data下面。注意两个相机的时间戳要对应上EuRoC的数据是硬件同步的所以左右目的时间戳应该完全一致。如果不一致说明数据有问题需要重新下载。3.3 标定参数文件的解读与修改EuRoC的sensor.yaml文件里包含了相机的内参和畸变系数。ORB-SLAM2的双目参数文件在Examples/Stereo/EuRoC.yaml我们需要把里面的参数改成和数据集匹配的。这个文件里几个关键参数Camera.fx,Camera.fy: 焦距单位是像素Camera.cx,Camera.cy: 主点坐标Camera.k1,Camera.k2,Camera.p1,Camera.p2: 畸变系数Camera.width,Camera.height: 图像分辨率STEREO.bf: 基线乘以焦距这个参数很关键ORBextractor.nFeatures: 每帧提取的特征点数量ORBextractor.scaleFactor: 金字塔缩放因子ORBextractor.nLevels: 金字塔层数这些参数在EuRoC的sensor.yaml里都有直接抄过来就行。但有一个地方容易搞错STEREO.bf这个参数。它等于基线乘以焦距。EuRoC的双目基线是0.11米左右焦距在sensor.yaml里有。你可以直接算也可以用ORB-SLAM2提供的标定工具算。我建议直接算因为标定工具跑起来比较慢。计算方法是bf fx * baseline。比如fx是458.654baseline是0.11那bf就是50.45左右。这个值填到STEREO.bf里。如果这个值填错了深度估计会完全不对轨迹会飘得离谱。另外ORBextractor.nFeatures这个参数也值得说一下。默认是1000对于EuRoC这种分辨率752x480的图像来说1000个特征点有点少。我试过调到1500到2000跟踪更稳但计算量也上去了。如果你的机器性能一般保持1000也行但可能会在快速运动时丢失跟踪。我个人的建议是1200到1500之间平衡精度和速度。4. 双目模式运行与参数调优4.1 启动命令与运行流程参数文件改好之后就可以运行了。ORB-SLAM2的双目运行命令格式是./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml /path/to/EuRoC/MH_01_easy/mav0/cam0/data /path/to/EuRoC/MH_01_easy/mav0/cam1/data Examples/Stereo/EuRoC_TimeStamps/MH01.txt注意最后一个参数是时间戳文件。ORB-SLAM2的Examples里自带了一些时间戳文件在Examples/Stereo/EuRoC_TimeStamps/目录下。如果你下载的数据集版本和这些时间戳对不上就需要自己生成。生成方法和前面说的一样用ls和sed命令。运行之后你会看到三个窗口一个是当前帧的图像和提取的特征点一个是地图视图显示相机轨迹和地图点还有一个是状态窗口显示跟踪状态和关键帧数量。如果一切正常你应该能看到轨迹逐渐延伸地图点越来越多。4.2 关键参数对轨迹精度的影响有几个参数对轨迹精度影响很大我逐个说一下。第一个是ORBextractor.nFeatures。前面提过特征点数量越多跟踪越稳但计算量越大。在EuRoC的MH_01序列上我试过1000、1500、2000三个值。1000的时候在快速旋转段会丢失跟踪1500基本能全程跟住2000更稳但帧率从30降到20左右。所以如果你的机器性能够建议用1500以上。第二个是ORBextractor.scaleFactor。这个参数控制图像金字塔的缩放比例默认是1.2。调小到1.1会增加每层的特征点数量但计算量也增加。调大到1.3会减少计算量但可能丢失小尺度的特征。我一般保持默认1.2除非有特殊需求。第三个是STEREO.bf。前面强调过这个值必须准确。如果偏大深度估计会偏小轨迹会往相机方向收缩如果偏小深度估计会偏大轨迹会往外扩。你可以通过对比真值轨迹来验证如果轨迹整体缩放不对大概率是bf的问题。第四个是ORBextractor.iniThFAST和ORBextractor.minThFAST。这两个是FAST角点的阈值默认是20和7。如果图像纹理弱可以调低到15和5提取更多特征点。如果图像噪声大可以调高到25和10减少误检。EuRoC的图像质量不错默认值就够用。4.3 运行过程中的监控与日志分析ORB-SLAM2运行时会输出一些日志信息比如跟踪状态、关键帧数量、闭环检测结果等。这些信息对于判断系统是否正常工作很有帮助。跟踪状态有三种SYSTEM_INITIALIZING、SYSTEM_OK和SYSTEM_LOST。如果一直是SYSTEM_INITIALIZING说明初始化没成功可能是图像没读进来或者特征点太少。如果频繁出现SYSTEM_LOST说明跟踪丢失可能是运动太快或者纹理太弱。关键帧数量也是一个指标。正常情况下MH_01序列跑完大概会产生100到200个关键帧。如果关键帧数量特别少比如只有几十个说明系统可能没怎么建图轨迹精度堪忧。如果特别多比如上千个说明系统频繁插入关键帧可能是跟踪不稳定导致的。闭环检测的结果也会在日志里显示。如果检测到闭环会输出Loop detected之类的信息。EuRoC的MH_01序列是一个闭环轨迹所以理论上应该能检测到闭环。如果没检测到可能是闭环检测的参数太严格可以适当放宽。5. 轨迹评估与精度验证5.1 真值轨迹的读取与对齐跑完ORB-SLAM2之后你会得到一个轨迹文件通常是CameraTrajectory.txt或者KeyFrameTrajectory.txt。这个文件里是相机位姿格式是时间戳加平移向量加四元数。要评估精度需要和真值轨迹对比。EuRoC的真值轨迹在state_groundtruth_estimate0/data.csv里格式是时间戳、位置、四元数、速度、陀螺仪偏置、加速度计偏置。我们只需要位置和四元数。对比之前需要做时间对齐和空间对齐。时间对齐是因为ORB-SLAM2输出的时间戳和真值的时间戳不一定完全对应需要找最近邻。空间对齐是因为ORB-SLAM2的坐标系和真值的坐标系可能不一致需要做相似变换。这个变换包括旋转、平移和尺度。对于双目SLAM来说尺度是已知的所以只需要旋转和平移。我一般用EVO这个工具来做评估它支持EuRoC格式的轨迹文件可以自动做对齐和计算误差。安装EVO很简单pip install evo --upgrade --no-binary evo然后运行evo_traj tum CameraTrajectory.txt --refdata.csv --plot --align这个命令会画出两条轨迹的对比图并计算绝对位姿误差APE和相对位姿误差RPE。APE反映的是整体轨迹的精度RPE反映的是局部轨迹的精度。对于EuRoC的MH_01序列双目ORB-SLAM2的APE通常在0.05到0.1米之间RPE在0.01到0.02米之间。如果你的结果比这个差很多说明参数有问题。5.2 误差来源分析与改进方向如果轨迹精度不理想可以从几个方面排查。首先是标定参数。如果内参或者畸变系数不对特征点匹配会出错导致位姿估计不准。检查方法是把标定参数代回图像看畸变校正后的图像是否直线变直。如果还有弯曲说明畸变系数不对。其次是时间同步。如果左右目图像的时间戳对不上视差计算会出错。EuRoC的数据是硬件同步的理论上没问题但如果你自己生成的时间戳文件有误就会导致这个问题。检查方法是看左右目图像的文件名是否一一对应。再次是特征点数量和质量。如果特征点太少或者分布不均匀位姿估计会不稳定。可以可视化特征点看看如果都集中在图像某个区域说明提取有问题。调整ORBextractor.nFeatures和FAST阈值可以改善。最后是运动速度。如果相机运动太快相邻帧之间的重叠区域太小特征点匹配会失败。EuRoC的MH_01序列运动比较平稳一般不会遇到这个问题。但V1和V2序列有快速运动可能需要调参或者用IMU辅助。5.3 结果可视化与报告生成EVO不仅可以计算误差还可以生成漂亮的轨迹图和误差曲线图。我一般会生成三张图轨迹对比图、APE随时间变化图、RPE随时间变化图。这些图可以直接放到报告或者博客里。生成命令evo_traj tum CameraTrajectory.txt --refdata.csv --plot --align --save_plot trajectory.png evo_ape tum data.csv CameraTrajectory.txt --align --plot --save_plot ape.png evo_rpe tum data.csv CameraTrajectory.txt --align --plot --save_plot rpe.png这些图能直观地展示轨迹的精度和误差分布。如果APE曲线在某些时间段突然变大说明那段时间跟踪出了问题可以回去看日志找原因。6. 常见问题与排查技巧实录6.1 编译与运行阶段的典型报错我在不同机器上跑过很多次ORB-SLAM2遇到过的报错五花八门。这里整理一个速查表方便你快速定位问题。报错信息可能原因解决办法fatal error: opencv2/core/core.hpp: No such fileOpenCV未安装或路径不对重新安装OpenCV 3.4检查/usr/local/includeundefined reference to symbol _ZN5boost...Boost库链接问题安装libboost-all-dev在CMakeLists里加-lboost_systemPangolin could not be foundPangolin未安装或版本不对安装Pangolin v0.5检查/usr/local/libSegmentation fault (core dumped)参数文件路径错误或图像读取失败检查EuRoC.yaml里的路径和实际数据路径是否一致Tracking lost频繁出现特征点太少或运动太快增加nFeatures降低FAST阈值检查图像质量Stereo baseline is zeroSTEREO.bf参数为0或未设置计算bf fx * baseline并填入参数文件这个表里的问题我基本都遇到过最坑的是Segmentation fault因为报错信息不明确只能靠猜。后来发现是参数文件里的路径写错了导致程序读不到图像空指针访问就崩了。所以遇到段错误第一件事就是检查路径。6.2 轨迹漂移与跟踪丢失的排查思路轨迹漂移和跟踪丢失是SLAM里最常见的问题。排查思路可以按这个顺序来第一步看图像质量。如果图像模糊、曝光过度或者纹理太少特征点提取会受影响。EuRoC的数据质量很好一般不是这个问题。但如果你用的是自己的数据就要注意了。第二步看特征点数量和分布。在ORB-SLAM2的可视化窗口里特征点会用绿色方块标出来。如果数量很少或者集中在某个角落说明提取有问题。调整nFeatures和FAST阈值试试。第三步看视差。双目SLAM依赖视差计算深度如果视差太小比如相机看很远的地方深度估计会不准。EuRoC的室内场景视差还可以但如果你跑的是室外数据可能要注意。第四步看时间同步。如果左右目图像的时间戳差太多视差计算会出错。检查时间戳文件确保左右目一一对应。第五步看标定参数。如果内参或者畸变系数不对特征点匹配会出错。用标定工具重新标定或者用EuRoC自带的参数。6.3 性能优化与加速技巧ORB-SLAM2在普通笔记本上跑帧率可能只有十几帧。如果想加速有几个办法。第一个是降低图像分辨率。EuRoC的图像是752x480可以降采样到376x240计算量减少四分之三。但分辨率降低后特征点数量也会减少可能影响精度。我试过降采样帧率从15提升到30但APE从0.06米增加到0.1米。所以看你的需求如果只是验证算法流程降采样没问题如果要高精度还是用原分辨率。第二个是减少特征点数量。前面说过nFeatures从1500降到1000帧率能提升20%左右。但跟踪稳定性会下降快速运动时容易丢。第三个是关闭可视化。ORB-SLAM2的三个可视化窗口很占资源如果不需要实时看可以在代码里关掉。具体是修改System.cc里的bViewer和bUseViewer标志。关掉之后帧率能提升30%以上。第四个是用多线程编译。build.sh里默认是make -j但有些系统上-j后面没跟数字导致只用单线程编译。可以手动改成make -j4或者make -j8编译时间能缩短一半。6.4 独家避坑经验分享说几个我踩过的坑都是文档里不会写的。第一个坑是OpenCV的版本冲突。如果你系统里已经装了OpenCV 4又装了OpenCV 3.4编译ORB-SLAM2时可能会链接到OpenCV 4的库导致运行时报错。解决办法是在CMakeLists.txt里明确指定OpenCV 3.4的路径或者用update-alternatives管理多个版本。第二个坑是Pangolin的Python依赖。Pangolin编译时需要Python 2.7的开发头文件但有些新系统默认只有Python 3。解决办法是装libpython2.7-dev或者修改Pangolin的CMakeLists.txt跳过Python绑定。第三个坑是EuRoC数据集的解压。下载的压缩包解压后有时候会多一层目录比如MH_01_easy/MH_01_easy/mav0。这时候需要把内层目录移出来否则路径不对。第四个坑是时间戳文件的格式。ORB-SLAM2要求时间戳是纯数字一行一个。如果你用ls生成的时间戳带了文件扩展名需要去掉。另外时间戳的顺序要和图像文件名的顺序一致否则会乱序读取。第五个坑是轨迹文件的保存。ORB-SLAM2默认保存的轨迹文件在运行目录下但如果你在别的目录运行可能找不到。建议在运行命令前先cd到ORB-SLAM2根目录这样轨迹文件会保存在根目录下方便查找。7. 扩展方向与个人体会跑通双目ORB-SLAM2只是第一步后面还有很多可以折腾的方向。比如你可以试试把IMU数据融合进去ORB-SLAM2本身不支持IMU但ORB-SLAM3支持可以无缝切换。或者你可以试试用自己的双目相机跑这时候标定就很重要了需要自己采集数据、标定内参和外参、生成时间戳文件。再或者你可以试试不同的数据集比如KITTI或者TUM看看算法在不同场景下的表现。我个人在实际操作中的体会是SLAM这个方向理论看再多不如亲手跑一遍。很多问题只有跑起来才会暴露比如路径错误、参数不匹配、版本冲突。而且每次解决一个问题你对整个系统的理解就会深一层。我刚开始跑的时候光编译就花了两天各种报错轮番出现。但跑通之后回头看那些坑其实都有规律无非是依赖、路径、参数这三类问题。所以如果你现在正卡在某个环节别急按我上面说的排查思路一步步来大概率能解决。最后再分享一个小技巧如果你在EuRoC上跑通了想试试自己的数据可以先录一段静态场景的视频看看特征点提取和匹配是否正常。静态场景没有运动模糊最容易调试。等静态没问题了再录动态场景。这样循序渐进比一上来就挑战复杂场景要高效得多。