ARTICLE DETAIL

资讯详情

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

从零跑通ORB-SLAM3:基于Euroc数据集的编译、运行与精度评估

从零跑通ORB-SLAM3:基于Euroc数据集的编译、运行与精度评估 1. 为什么拿Euroc测ORB-SLAM3数据集与算法的匹配逻辑拿到ORB-SLAM3源码之后第一件绕不开的事就是找一个标准数据集跑通全流程。我做SLAM相关开发这几年感触最深的一点是算法能不能落地从来不是看论文里的彩图多漂亮而是看你在真实数据上能复现出多少结果。ORB-SLAM3作为目前视觉SLAM领域公认的标杆开源项目选哪个数据集来验证本身就是一个值得聊的话题。Euroc数据集全称EuRoC MAV Visual-Inertial Datasets出自苏黎世联邦理工ETH的Autonomous Systems Lab是微型飞行器MAV搭载双目相机和IMU采集的视觉惯性数据集。这个数据集在视觉SLAM领域的地位差不多相当于ImageNet在图像分类领域的位置——几乎所有做VIO、视觉SLAM的论文和开源项目都会用它来跑指标。ORB-SLAM3官方论文里的大量实验对比也都是在Euroc上完成的。为什么Euroc这么受欢迎我个人的理解是它踩中了算法验证的所有关键点第一它有真实的IMU数据而且是和图像硬件时间同步过的这对视觉惯性SLAM来说极其重要第二它的真值Ground Truth来自Vicon运动捕捉系统和Leica激光扫描仪精度足够高可以用来做轨迹误差评估第三它覆盖了从慢速飞行到快速机动、从光照良好到低纹理场景的多种难度梯度能有效区分算法水平。从应用场景来看Euroc模拟的正是无人机、手持设备、机器人等平台上最常见的运动模式——快速旋转、剧烈加速、短暂遮挡。这些场景恰好是视觉SLAM最容易翻车的地方。你拿一个只做缓慢平移的数据集测出来的结果拿到真实无人机上去跑十有八九会崩。而Euroc的MH系列和V1/V2系列几乎把机器人运动中的极端情况都覆盖了所以用它测出来的算法表现才有参考价值。适合读这篇内容的人我理解大概有三类一是刚把ORB-SLAM3源码下载下来、编译好但不知道怎么跑数据集的初学者二是已经在跑数据集但不太清楚参数怎么调、轨迹误差怎么评估的人三是想在项目里落地ORB-SLAM3需要快速判断它在自己的传感器配置下表现如何的开发者。这篇内容就围绕“在Euroc上把ORB-SLAM3跑通、跑准、跑明白”展开尽量把每一个环节背后的原理和坑都说清楚。1.1 Euroc数据集的底细Euroc数据集一共包含11个序列分成三个场景MH_01到MH_05是机器大厅Machine HallV1_01到V1_03是Vicon房间1V2_01到V2_03是Vicon房间2。MH场景面积大、纹理丰富、光照稳定属于“中等难度”V1和V2场景虽然空间小但包含了大量快速旋转、剧烈加速和短暂遮挡V2相对V1纹理更少、光线更暗难度进一步提升。这里面有个很多人第一次没注意到的细节Euroc的传感器配置是“双目IMU”而不是单目。它的双目相机是两个全局快门Global Shutter的MT9V034分辨率752x480采集频率20HzIMU是ADI公司的ADIS16448采集频率200Hz。注意这个频率比例——IMU是图像的10倍意味着两个相邻图像帧之间有10个IMU测量值可以用来做状态预测。数据集的文件组织方式也很有讲究。下载解压后每个序列的目录结构像这样MH_01_easy/ └── mav0/ ├── cam0/ │ ├── data/ │ │ ├── 1403636579763555584.png │ │ └── ... │ └── data.csv ├── cam1/ │ ├── data/ │ │ ├── 1403636579763555584.png │ │ └── ... │ └── data.csv ├── imu/ │ ├── data.csv └── state_groundtruth_estimate0/ ├── data.csvcam0是左目cam1是右目data.csv记录了每张图像对应的时间戳单位是纳秒ns。IMU的data.csv则包含时间戳、三轴角速度gyro和三轴加速度acc单位分别是rad/s和m/s²。这里的时间戳是硬件同步的不需要你在代码里再做时间对齐这是Euroc相比自己拼传感器采集的数据最省心的地方。对了还有一点值得留意Euroc的原始图像是灰度图不是彩色图。ORB特征本来就在灰度图上提取所以这反而省了一步转换。1.2 ORB-SLAM3的核心特性在跑数据之前先花点时间搞清楚ORB-SLAM3的体系结构后面调试会省很多力气。简单来说ORB-SLAM3是ORB-SLAM系列的第三代最大的卖点是支持单目、双目、RGB-D以及单目IMU、双目IMU五种传感器模式并且在视觉惯性模式下能进行IMU的快速初始化。从架构上看ORB-SLAM3延续了ORB-SLAM2的三大线程设计跟踪Tracking、局部建图Local Mapping、回环检测与地图合并Loop Closing and Map Merging。特征点用的是ORBOriented FAST and Rotated BRIEF这是一种同时具备旋转不变性和尺度不变性的二进制特征提取速度和匹配速度都比SIFT、SURF快一个量级非常适合实时系统。在视觉惯性融合上ORB-SLAM3采用的是紧耦合方案也就是把视觉重投影误差和IMU预积分误差放进同一个因子图里做联合优化。这和松耦合方案比如先跑视觉SLAM再用滤波融合IMU有本质区别——紧耦合在IMU退化比如纯旋转时依然能靠视觉维持状态估计在视觉退化比如快速运动导致图像模糊时也能靠IMU顶上。这也是为什么ORB-SLAM3在Euroc的快速旋转序列上表现依然稳定的原因。ORB-SLAM3还有一个值得骄傲的东西就是它的多地图Multi-Map系统。当跟踪丢失后系统会保存当前地图然后重新开始建一个新地图等重新检测到之前的地图时再做地图合并。这个机制在实际应用中极其重要因为无人机飞行中不可避免地会遇到特征遮挡或快速转弯导致的短暂跟踪丢失如果没有多地图系统一次丢失可能就意味着整个定位过程的终止。欧罗克数据集和ORB-SLAM3的搭配在我眼里一直都是“棋逢对手”。Euroc的快速旋转和光照变化能逼出ORB-SLAM3在特征提取和IMU融合上的真功夫而ORB-SLAM3的三种传感器模式和鲁棒的初始化机制也能把Euroc各个序列的难度梯度完整地体现出来。2. 环境准备与编译从零把ORB-SLAM3跑起来第一次编译ORB-SLAM3大多数人都会在依赖配置上卡一两个晚上。这不是说它难装而是因为ORB-SLAM3的依赖项横跨了多个库版本之间的兼容性问题非常多。我在Ubuntu 18.04和20.04上都编译过也帮不少朋友排查过问题这里把最常见的坑一次说清楚。2.1 依赖项解析ORB-SLAM3的依赖主要有四个Eigen3、Pangolin、OpenCV和可选Python相关工具。g2o、DBoW2、Sophus这些库则是以源码形式直接放在Thirdparty目录下的编译时会一并编进去不需要单独安装。Eigen3线性代数库ORB-SLAM3用到的矩阵运算、最小二乘求解都依赖它。版本不能太新实测Eigen 3.3.x最稳3.4版本在某些场景下会编译报错。安装方式比较推荐 apt 直接装sudo apt install libeigen3-dev这样版本是系统仓库管的不容易出幺蛾子。Pangolin这是一个图形界面库负责显示SLAM的实时运行画面和地图点。它在编译时依赖OpenGL和GLEW如果你的机器是服务器无显示器运行时还需要关注x11的窗口环境问题。Pangolin对版本敏感建议用ORB-SLAM3文档里推荐的版本一般是v0.6。OpenCV图像处理和特征提取的基础库。ORB-SLAM3的官方文档写的是OpenCV 3.2但实际在OpenCV 4.x下也能编译运行不过有几个头文件和API需要适配。如果你用的是Ubuntu 20.04及以上apt装的默认就是OpenCV 4.x直接编译ORB-SLAM3会报CV_LOAD_IMAGE_UNCHANGED这类旧API不存在的错误这个问题后面细说。安装命令可以直接参考官方给的步骤但我建议多一步把build.sh打开看一眼理解每个编译阶段在干什么cd Thirdparty/DBoW2 mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j4 cd ../../g2o mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j4 cd ../../Sophus mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j4 cd ../../../Vocabulary tar -xf ORBvoc.txt.tar.gz cd .. mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j4注意-j4这个参数我建议编译时看情况调整。如果你CPU核心数多可以换成-j8或-j16加快速度但如果内存不大比如8GB以下-j4比较保险因为并行编译时每个编译任务都会吃掉不少内存超出后会触发OOM Killer直接导致编译失败。2.2 编译过程中的常见坑我编译ORB-SLAM3遇到过的坑大概有这几类按照出现概率排序第一个坑是Eigen版本相关的编译错误。如果你用的是Eigen 3.4及以上可能会在编译g2o时遇到类似eigen3/Eigen/src/Core/Matrix.h: no matching function for call to ‘max’这样的报错。网上有补丁方案但我觉得最省事的方法还是装回3.3.xsudo apt install libeigen3-dev3.3.7-2Ubuntu 18.04或者用源码安装指定版本。Eigen是头文件库装起来不涉及二进制兼容问题直接下载解压放到/usr/include/eigen3就行。第二个坑是OpenCV 4.x的API兼容性问题。ORB-SLAM3在OpenCV 4下编译报错主要集中在opencv2/imgproc/types_c.h找不到、CV_LOAD_IMAGE_UNCHANGED未定义这几处。解决办法有两条路一是给CMakeLists.txt加一行include_directories(/usr/include/opencv4)并把代码里的旧API替换成新API比如IMREAD_UNCHANGED二是直接用网上已经适配好OpenCV 4的分支。我个人的经验是为了少改代码直接用fork分支跑通流程更划算等项目真正落地再考虑代码层面的规范适配。第三个坑是Pangolin的依赖缺失。Pangolin编译时如果缺了X11开发库会报Could NOT find X11之类的错误。解决方法很简单sudo apt install libx11-dev libxrandr-dev libxi-dev libxcursor-dev libglut-dev装完再编译Pangolin就顺了。第四个坑其实不在编译本身而是词汇文件。很多人在运行时报错说找不到ORBvoc.txt因为Vocabulary/ORBvoc.txt.tar.gz需要先解压而build.sh里没有自动做这一步。确保运行之前先执行cd Vocabulary tar -xf ORBvoc.txt.tar.gz这四个坑踩完编译应该就能顺利通过了。跑通之后建议自己整理一个依赖清单后面换机器或者配Docker镜像的时候直接照着装能省不少时间。3. 数据集下载与格式预处理别看简单细节不少Euroc数据集的上手难度不高但很多人会在下载和路径组织上浪费不少时间。这个章节把数据集下载的完整流程、目录组织方式和需要注意的细节都过一遍。3.1 下载资源与工具Euroc官网的下载页面支持直接下载每个序列的压缩包也支持通过脚本批量下载。每个序列的包大小不一MH系列一般在1GB上下V系列小一些。我不太建议把序列都下载到默认的Datasets/EuRoC目录下就完事建议的目录结构是按序列名区分因为后面运行命令需要把序列路径作为参数传进去。比如~/Datasets/EuRoC/ ├── MH_01_easy/ ├── MH_02_easy/ ├── MH_03_medium/ ├── MH_04_difficult/ ├── MH_05_difficult/ ├── V1_01_easy/ ├── V1_02_medium/ ├── V1_03_difficult/ ├── V2_01_easy/ ├── V2_02_medium/ └── V2_03_difficult/下载完成后每个序列解压出来的根目录是mav0这个不要改动。ORB-SLAM3的Euroc示例代码在读取数据时会按照固定的相对路径去寻找mav0/cam0/data、mav0/cam1/data和mav0/imu/data.csv。如果你改了目录结构代码就算不会报错也会找不到图像流程直接卡死。补充一个命令行技巧批量下载时可以写一个循环脚本因为Euroc的下载链接是有规律的。比如MH_01的链接是http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_01_easy/MH_01_easy.zip后面的序列名和文件名的规律非常明显。不过下载速度取决于网络环境实测在大部分网络环境下都比较稳定如果慢就耐心等别中断。3.2 Euroc的目录结构与时间戳机制进入mav0之后你会发现数据分成cam0、cam1、imu、leica_pose和state_groundtruth_estimate0几部分。cam0和cam1目录下各有一个data文件夹里面是一张张PNG格式的灰度图像文件名就是图像采集时刻的时间戳精确到纳秒。这个时间戳对应的就是图像真正曝光开始的时刻比大多数自己采集数据时用系统时间打戳的方式要准确得多。imu/data.csv的内容是IMU的测量序列每行数据格式是时间戳ns、角速度x、角速度y、角速度zrad/s、加速度x、加速度y、加速度zm/s²。IMU的频率是200Hz图像频率是20Hz两个时间戳之间的对应关系由ORB-SLAM3内部处理用户不需要手动做任何对齐操作。state_groundtruthestimate0/data.csv是Vicon系统输出的真实位姿IMU预处理时一般用不到跑评估的时候才需要用到。里面包含时间戳和4x4的齐次变换矩阵展开成12列旋转矩阵9个数位置3个数。这个真值的精度在厘米级用来评估视觉SLAM算法的轨迹误差是绰绰有余的。对比一下自行采集数据和用Euroc的差异自己采集数据你需要处理相机和IMU的时间同步、内参标定、畸变矫正、坐标系对齐等一堆问题任何一个环节出错都可能导致算法定位漂移而Euroc把这些都处理好了你下载解压就能跑。这就是标准数据集最大的价值——把精力集中在算法本身的验证上。4. 跑通全流程四种传感器模式的运行实操ORB-SLAM3编译通过、数据集也下载好了之后就到了最激动人心的环节——运行。这个章节按照单目、单目惯性、双目、双目惯性四种模式分别讲解运行命令、参数文件和注意事项。4.1 单目模式先跑通再说进入ORB-SLAM3的build目录之后找到Examples/Monocular/mono_euroc这个可执行文件运行命令格式如下./Examples/Monocular/mono_euroc \ ./Vocabulary/ORBvoc.txt \ ./Examples/Monocular/EuRoC.yaml \ ~/Datasets/EuRoC/MH_01_easy \ ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt参数从左到右依次是词袋文件路径、相机内参配置文件路径、数据集序列路径、时间戳文件路径。这里最容易被忽略的是最后一个时间戳文件——它不在数据集目录里而是放在ORB-SLAM3源码的Examples/Monocular/EuRoC_TimeStamps/目录下里面存的是这个序列所有图像的时间戳程序会根据这个列表逐帧读取图像。单目模式跑起来之后你可以看到一个显示窗口左边是当前帧的图像和提取到的ORB特征点右边是实时构建的地图和相机轨迹。如果一切正常程序会输出类似这样的日志New keyframe added to map Current keyframe: 42 Map points: 1234 Tracking state: OK单目模式跑通的意义在于验证整个环境没有问题但它有一个致命弱点尺度不确定性。单目SLAM无法从纯视觉观测中恢复出真实世界的绝对尺度所以它的轨迹和真实轨迹之间存在一个未知的缩放因子。这也是为什么单目SLAM的轨迹评估不能直接算绝对误差需要先做相似变换对齐。这一点在后面的评估部分会详细说明。4.2 单目惯性模式感受IMU的威力单目惯性模式在单目的基础上加入了IMU数据运行命令如下./Examples/Monocular-Inertial/mono_inertial_euroc \ ./Vocabulary/ORBvoc.txt \ ./Examples/Monocular-Inertial/EuRoC.yaml \ ~/Datasets/EuRoC/MH_01_easy \ ./Examples/Monocular-Inertial/EuRoC_TimeStamps/MH01.txt注意到参数入口和单目模式的区别了吗它读的配置文件和时间戳文件都换到了Monocular-Inertial目录下。EuRoC.yaml这个配置文件里除了相机内参还有一段IMU噪声参数包括陀螺仪和加速度计的噪声密度以及随机游走。这组参数是Euroc数据集官方标定好的不需要你自己调。但如果你要在自己的设备上使用ORB-SLAM3就得仔细做IMU标定否则初始化阶段的IMU偏差估计会出错整个系统很快就飘了。单目惯性模式跑起来之后有两点直观感受第一初始化速度明显更快而且不那么容易失败第二在快速旋转的场景中轨迹稳定性比纯单目好很多。原因是IMU提供了帧间运动的先验约束即使视觉特征匹配不够理想状态估计也能被IMU预积分“兜住”。但要注意一个新问题运行前的静止初始化。ORB-SLAM3的视觉惯性初始化有两个阶段前几百毫秒需要采集IMU数据来估计重力方向。因此运行后不要立刻剧烈移动让设备在Euroc里就是虚拟的无人机保持静止或者小幅度运动一小段时间等初始化完成后系统才会进入稳定的定位状态。实际跑代码时程序会自动处理这段初始化你只需要观察日志里初始化成功与否就行。4.3 双目与双目惯性模式更丰富的视觉约束双目模式的运行命令如下./Examples/Stereo/stereo_euroc \ ./Vocabulary/ORBvoc.txt \ ./Examples/Stereo/EuRoC.yaml \ ~/Datasets/EuRoC/MH_01_easy \ ./Examples/Stereo/EuRoC_TimeStamps/MH01.txt双目和单目的本质区别在于单目靠相机运动产生视差来恢复深度双目则直接通过左右目图像的立体匹配获取深度信息。因此双目SLAM在静态场景下也能立即建出带深度的地图而且尺度是确定的不会再出现单目的尺度模糊问题。双目惯性模式就是./Examples/Stereo-Inertial/stereo_inertial_euroc参数配置和双目类似读的是Stereo-Inertial目录下的EuRoC.yaml和时间戳文件。这是ORB-SLAM3支持的配置中信息量最丰富、鲁棒性最高的模式也是官方在Euroc上最亮眼的成绩。四种模式跑完之后程序的当前目录下会生成几个输出文件比较重要的是KeyFrameTrajectory.txt和FrameTrajectory.txt。前者是每帧关键帧的位姿和对应时间戳后者是所有帧的位姿。轨迹文件的内容格式如下timestamp(tx) ty tz qx qy qz qw也就是时间戳、平移向量和四元数形式的旋转姿态。这个文件后续评估精度要用的先保存好。4.4 运行日志解读别只顾着看窗口很多人跑起来之后眼睛只盯着可视化窗口忽略终端输出的日志。其实这些日志包含了大量有用信息尤其是以下几个关键项Tracking state: OK跟踪正常没有丢失。New keyframe added to map系统判定当前帧信息量足够插入新的关键帧。Local mapping: ...局部地图优化状态。Loop closed回环检测成功地图得到全局优化。如果出现Tracking state: LOST说明跟踪丢失了。此时系统会尝试重定位重定位失败则会启动多地图机制——保存当前地图重新开始建图。在实际应用中跟踪丢失率是衡量SLAM算法鲁棒性的核心指标如果你在某个序列上频繁看到LOST就说明当前参数配置或者传感器配置不适用于这个场景。5. 精度评估用evo量化ORB-SLAM3的真实水平跑通流程只是第一步真正有价值的工作是量化评估。这一节讲怎么用eval工具评估ORB-SLAM3在Euroc上的轨迹精度以及如何解读评估结果。5.1 先分清ATE和RPE轨迹精度评估有两个最核心的指标绝对轨迹误差ATEAbsolute Trajectory Error和相对位姿误差RPERelative Pose Error。ATE衡量的是估计轨迹和真值轨迹之间的整体差异。具体计算方法是先把估计轨迹和真值轨迹做对齐一般是相似变换对齐以消除单目的尺度影响然后逐帧计算两条轨迹位姿之间的误差。ATE越小说明整体定位精度越高。RPE衡量的是固定时间间隔内的局部位姿漂移。比如时间间隔为1秒那就每隔1秒取两个位姿分别计算它们在估计轨迹和真值轨迹中的相对运动差。RPE更能反映定位误差随时间的累积情况短时间内的精度主要看它。需要特别提醒的是单目SLAM评估ATE必须做相似变换对齐因为单目无法恢复尺度如果直接用欧氏变换对齐尺度不匹配会把误差算得特别大看不出真实水平。而双目和视觉惯性模式因为尺度可观测一般用刚体变换对齐就够了。eval工具在默认情况下会自动处理这个对齐方式但你可以通过参数显式指定。5.2 实际操作用eval跑一个序列首先安装eval工具pip install evo --upgrade --no-binary evo然后进入ORB-SLAM3运行目录用以下命令评估单目模式的结果evo_ape tum KeyFrameTrajectory.txt ~/Datasets/EuRoC/MH_01_easy/mav0/state_groundtruth_estimate0/data.csv -a -as -um参数解析-a自动将两条轨迹在时间轴上对齐匹配最近的时间戳。-as使用相似变换对齐轨迹单目评估务必加上。-um使用单位米作为轨迹的单位。tum指定轨迹文件格式是TUM格式时间戳平移四元数。跑完之后终端会输出一整套统计数据APE w.r.t. translation part (m) RMSE: 0.2145 Mean: 0.1832 Median: 0.1701 Std: 0.1088 Min: 0.0123 Max: 0.4821这里最常被引用的指标是RMSE和Max。RMSE综合反映了整体精度Max则表示最差情况下的漂移量。参考ORB-SLAM3论文在相同配置下的结果MH_01上单目ATE的RMSE大约在0.1米量级如果你跑出来在这个范围内说明环境和参数基本没问题。如果想直观看到误差的分布可以加-p参数绘制轨迹对比图和误差曲线evo_ape tum KeyFrameTrajectory.txt ~/Datasets/EuRoC/MH_01_easy/mav0/state_groundtruth_estimate0/data.csv -a -as -um -p这会在当前目录生成误差图方便你观察误差主要在哪些运动阶段集中爆发。我实测下来发现Euroc序列的误差峰值通常出现在无人机快速旋转或剧烈加速的瞬间这是特征匹配质量下降和IMU预积分误差增大的叠加效应。5.3 多序列对比全面评估算法单跑一个序列只能说明“它在某个场景下能用”要全面评估算法建议把11个序列都跑一遍然后汇总评估指标。这里分享一个我自己常用的批量评估脚本思路for seq in MH_01_easy MH_02_easy MH_03_medium MH_04_difficult MH_05_difficult V1_01_easy V1_02_medium V1_03_difficult V2_01_easy V2_02_medium V2_03_difficult; do ./Examples/Stereo-Inertial/stereo_inertial_euroc \ ./Vocabulary/ORBvoc.txt \ ./Examples/Stereo-Inertial/EuRoC.yaml \ ~/Datasets/EuRoC/$seq \ ./Examples/Stereo-Inertial/EuRoC_TimeStamps/$(echo $seq | cut -d_ -f1).txt \ results/$seq.log 21 mv KeyFrameTrajectory.txt results/$seq_KeyFrameTrajectory.txt done这个脚本会依次跑完所有序列并把输出的轨迹文件保存下来后续再用eval逐个评估。不同序列的难度梯度在结果上会体现得非常明显MH_01和MH_02通常误差最小V1_03、V2_03这类包含快速旋转和低纹理场景的序列误差会明显上升。欧罗克上的达标线我说一下个人经验参考双目惯性模式下easy序列的ATE RMSE能到0.05米以内difficult序列在0.1米左右都属于正常水平。如果跑出来的数值比这个高出一个量级先别怀疑算法大概率是IMU参数配置或者时间戳处理出了问题。6. 常见问题与排查技巧实录跑ORB-SLAM3和Euroc数据集的整个过程遇到的坑远不止编译阶段那些。这个章节我把实际调试中高频出现的问题整理成一个速查表并给出定位思路。6.1 问题速查表现象可能原因解决思路运行后窗口一直黑色没有图像显示图像读取路径错误或时间戳文件与数据集不匹配检查命令行参数中序列路径和时间戳文件路径确认mav0/cam0/data目录下有图像文件终端提示Tracking state: LOST后程序卡住场景纹理不足、运动过快或IMU未正确初始化更换更高难度的序列如MH_01验证检查IMU配置是否正确尝试改用双目或双目惯性模式程序报错Could not open file: ORBvoc.txt词汇文件未解压进入Vocabulary目录执行tar -xf ORBvoc.txt.tar.gz轨迹评估时时间戳不匹配估计轨迹和真值轨迹时间戳单位或数量级不一致eval加-a参数自动对齐检查轨迹文件时间戳是否为纳秒单目评估ATE误差巨大米级没有做相似变换对齐尺度问题未处理eval加-as参数或者用evo_ape的-s选项程序运行占用内存不断增长直至崩溃地图点数量增长过快或存在内存泄漏极少见确认关键帧策略参数KeyFrame相关阈值观察日志确认回环是否触发、地图是否持续增长编译时fatal error: Eigen/Core: No such file or directoryEigen未安装或版本过旧sudo apt install libeigen3-dev确认/usr/include/eigen3存在并链接到Eigen6.2 几个容易被忽略的坑第一个坑是运行目录与输出文件位置。ORB-SLAM3的输出文件比如KeyFrameTrajectory.txt是直接写到“执行命令时所在的工作目录”不是源码目录。很多人跑完去找文件没找到就是因为当前工作目录不是预期目录。建议统一在一个独立的结果目录下运行命令这样轨迹文件不会和源码混在一起。第二个坑是时间戳单位。Euroc数据集里的时间戳单位是纳秒ns但ORB-SLAM3在运行时处理时间戳的方式和输出轨迹文件的格式可能不同。如果用eval评估时发现时间戳对不上先确认两条轨迹的时间戳量级是否一致。处理办法是写个小脚本统一转换或者用eval的--time_unit参数指定。第三个坑是IMU参数的单位。ORB-SLAM3的EuRoC.yaml配置文件中IMU噪声参数的单位遵循特定约定噪声密度noise density和随机游走random walk都有对应的量纲。有些人在自己的数据集上照抄Euroc的配置结果IMU参数与真实传感器差异过大导致系统很快发散。在自己设备上使用时IMU标定是绕不开的环节。第四个坑在可视化与性能的矛盾。Euroc的图像频率是20Hz实际处理速度一般比实时快很多。但如果可视化窗口打开了绘制地图点会消耗一定CPU和内存。在服务器上跑批量评估时建议关闭可视化或者使用离线模式如果代码支持。不在GUI上浪费时间跑数据的速度能快不少。6.3 追问题的一个思路当你在某个序列上跑ORB-SLAM3表现不佳怎么判断问题出在哪个环节我的排查顺序是先看可视化窗口确认特征提取是否正常图像太暗或太模糊会导致特征点过少再看日志确认跟踪是否全程OK有没有长时间LOST然后跑评估看误差分布误差集中在高速阶段还是低纹理阶段最后再回到参数配置上调整。这个思路的核心是先定位“在哪一步出问题”而不是盲目调参数。比如同样是ATE误差偏大如果是跟踪丢失导致的那应该调的是特征提取阈值、关键帧判定阈值这类参数如果是回环没有触发导致的累积漂移那应该检查回环检测的词袋模型参数。两类问题的调参方向完全不同混在一起调只会越调越乱。我还想提醒一点ORB-SLAM3的默认参数其实是面向通用场景的在特定数据上有优化空间但不要期望调参能带来质变。如果模型本身的视觉特征在这类场景下就不可靠再调参数也只是在坏数据上做强拟合。7. 从跑通到深入还可以往哪个方向往前走把Euroc上的ORB-SLAM3测试做完了这只是拿到了一张入门券。真正的价值在于你从这条流程里建立了对SLAM系统全流程的感知——从数据格式、编译环境、参数配置到精度评估每一环都有它存在的道理。我个人在实际测试中的体会是Euroc数据集最大的作用不是给你一个“好看的数字”而是提供了一套可重复的实验基准。你在完全相同的输入下修改某个环节比如换一种特征提取算法、改一个IMU参数通过输出轨迹的差异就能精确地判断这个修改带来的是正向还是负向影响。这种“受控实验”的能力是你在自己采集的数据上很难得到的因为自己采集数据时变量太多很难说清效果变化到底是你的改动引起的还是采集环境本身的变化引起的。再往深走一步你可以尝试把ORB-SLAM3换成自己的算法模块比如在跟踪线程里替换特征提取器或者在局部建图线程里加入新的约束因子然后继续用Euroc做回归测试。你会发现这套“数据-算法-评估”的闭环才是SLAM研究真正的工作方式。它不花哨但足够扎实。最后分享一个调试时的小技巧跑Euroc之前先跑V1_02_medium这个序列——它在难度和耗时上都很适中视觉惯性模式下三分钟左右就能跑完非常适合作为每次修改代码后的快速回归测试。等它过了再跑MH_05和V2_03这两个高难度序列做最终验证。这个顺序能帮你节省大量调试时间。
返回列表