从零到一:ORB-SLAM2实战EuRoC数据集与EVO精度评测全记录
1. 环境准备:从零搭建ORB-SLAM2开发环境
作为一个刚接触SLAM的新手,第一次配置ORB-SLAM2环境确实容易踩坑。我当初在Ubuntu 16.04上折腾了整整两天才搞定所有依赖,这里把最稳妥的安装流程分享给大家。
首先需要明确的是,ORB-SLAM2对系统环境要求较高。强烈建议使用物理机安装Ubuntu,虚拟机性能可能无法满足实时SLAM的需求。我的硬件配置是i7处理器、16GB内存和GTX 1060显卡,这个配置跑EuRoC数据集非常流畅。
安装过程可以分为三个关键步骤:
基础依赖安装:这些是ORB-SLAM2运行的基石
sudo apt-get update sudo apt-get install -y cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install -y python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-devPangolin可视化工具安装:这是ORB-SLAM2的必备可视化组件
git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build && cd build cmake .. make -j4 sudo make installOpenCV安装:建议使用3.4.10这个经过验证的稳定版本
wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.10.zip unzip opencv.zip cd opencv-3.4.10 mkdir build && cd build cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. make -j4 sudo make install
安装过程中最常见的报错是依赖冲突。我遇到过好几次"无法定位软件包"的问题,解决方法很简单:
sudo apt-get update --fix-missing sudo apt-get install -f如果还是不行,可以尝试更换软件源。记得安装完成后运行opencv_version命令验证是否安装成功,应该能看到输出"3.4.10"。
2. ORB-SLAM2编译与测试:从源码到可执行文件
成功安装所有依赖后,就可以开始编译ORB-SLAM2了。这里有个小技巧:先测试ORB-SLAM再编译ORB-SLAM2,因为前者问题更少,能帮你验证基础环境是否正确。
克隆ORB-SLAM2源码:
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2 cd ORB_SLAM2 chmod +x build.sh ./build.sh编译过程大约需要10-15分钟,取决于你的CPU性能。如果遇到"undefined reference"这类链接错误,大概率是OpenCV版本不兼容。我建议完全卸载现有OpenCV后重新安装指定版本。
编译成功后,可以先用自带的示例数据集测试:
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml ../rgbd_dataset_freiburg1_xyz这个测试用例很小,运行起来应该很流畅。如果能看到实时相机位姿估计和特征点跟踪画面,说明你的ORB-SLAM2已经正确安装。
3. EuRoC数据集实战:完整运行流程详解
EuRoC数据集是SLAM领域的标准测试集,包含无人机在室内环境飞行的IMU和相机数据。我推荐从MH_01_easy这个最简单的序列开始尝试。
3.1 数据集准备与预处理
首先下载数据集:
wget http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_01_easy/MH_01_easy.zip unzip MH_01_easy.zip -d ~/EuRoC数据集目录结构应该是这样的:
~/EuRoC/mav0 ├── cam0 │ ├── data │ └── data.csv ├── cam1 │ ├── data │ └── data.csv └── state_groundtruth_estimate0 └── data.csv运行ORB-SLAM2处理EuRoC数据集:
./Examples/Monocular/mono_euroc Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml ~/EuRoC/mav0/cam0/data Examples/Monocular/EuRoC_TimeStamps/MH01.txt这里有几个容易出错的地方:
- 路径必须绝对路径,不能用~或相对路径
- 时间戳文件必须与数据集序列匹配(MH01.txt对应MH_01_easy)
- 如果出现段错误,可能是数据集损坏,需要重新下载
3.2 实时运行观察与调试
成功运行后,你会看到两个窗口:
- 主窗口:显示当前帧和特征点匹配
- 地图窗口:显示重建的3D地图和相机轨迹
我建议首次运行时加上--no-sleep参数,这样可以更清楚地观察处理过程:
./Examples/Monocular/mono_euroc Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml ~/EuRoC/mav0/cam0/data Examples/Monocular/EuRoC_TimeStamps/MH01.txt --no-sleep如果系统卡顿,可以尝试降低图像分辨率。修改EuRoC.yaml中的Camera.width和Camera.height参数为原值的一半。
4. EVO精度评测:量化你的SLAM性能
EVO是SLAM轨迹评估的神器,它能给出APE(绝对位姿误差)和RPE(相对位姿误差)等关键指标。安装EVO很简单:
pip install evo --upgrade --user4.1 轨迹格式转换
ORB-SLAM2输出的轨迹格式需要转换为EVO支持的TUM格式:
evo_traj euroc ~/EuRoC/mav0/state_groundtruth_estimate0/data.csv --save_as_tum这个命令会生成data.tum文件,包含真实轨迹数据。ORB-SLAM2的估计轨迹默认保存在KeyFrameTrajectory.txt中,已经是TUM格式。
4.2 轨迹可视化对比
先直观看看估计轨迹与真实轨迹的差异:
evo_traj tum KeyFrameTrajectory.txt --ref=data.tum -p --plot_mode xyz这个命令会生成3D轨迹对比图。如果发现轨迹尺度不一致(常见于单目SLAM),可以添加--correct_scale参数进行尺度对齐。
4.3 定量精度评估
绝对位姿误差(APE)评估:
evo_ape tum data.tum KeyFrameTrajectory.txt -va --plot --plot_mode xyz相对位姿误差(RPE)评估:
evo_rpe tum data.tum KeyFrameTrajectory.txt -va --plot --plot_mode xyz输出结果中,最重要的是**RMSE(均方根误差)**值,单位是米。对于EuRoC的MH01序列,好的单目ORB-SLAM2实现应该能达到:
- APE RMSE < 0.05m
- RPE RMSE < 0.02m
如果结果差很多,可能是参数配置不当。建议检查ORB-SLAM2的yaml文件中这些关键参数:
Camera.fps: 20 Camera.k1: -0.28340811 Camera.k2: 0.07395907 ORBextractor.nFeatures: 20005. 常见问题排查与性能优化
在实际运行中,我遇到过各种奇怪的问题。这里分享几个典型case的解决方法:
问题1:运行时报错"Segmentation fault"
- 原因:通常是OpenCV版本不匹配
- 解决:完全卸载OpenCV后重新安装3.4.x版本
问题2:EVO报错"numpy版本冲突"
pip install numpy --upgrade --user问题3:ORB-SLAM2跟踪丢失频繁
- 调整yaml文件中的特征点数量:
ORBextractor.nFeatures: 3000 # 默认2000,可适当增加- 尝试使用双目版本,稳定性更好:
./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml ~/EuRoC/mav0/cam0/data ~/EuRoC/mav0/cam1/data Examples/Stereo/EuRoC_TimeStamps/MH01.txt性能优化建议:
- 在
build.sh中添加-DCMAKE_BUILD_TYPE=Release选项重新编译 - 在yaml文件中减少
ORBextractor.nFeatures到1000-1500 - 使用
--no-viewer参数关闭可视化提升速度
经过这些优化,我的ORB-SLAM2在i7笔记本上能实时处理EuRoC数据集(20fps),APE RMSE稳定在0.03m左右。
