第一次看到ORB-SLAM3生成的3D地图在屏幕上缓缓展开时,那种震撼感至今难忘。作为目前最先进的视觉SLAM系统之一,ORB-SLAM3不仅能实时构建环境的三维模型,还能精准追踪相机位姿——这一切只需要普通的RGB-D摄像头或单目相机。本文将带你深入实战,从数据集准备到完整运行,再到常见问题排查,让你亲手体验这项前沿技术的魅力。
在开始之前,确保你的Ubuntu 20.04系统已经完成ORB-SLAM3的编译安装。我们需要的只是两个标准数据集:EuRoC MAV(微型飞行器数据集)和TUM RGB-D(室内场景数据集)。
EuRoC数据集由瑞士苏黎世联邦理工学院(ETH Zurich)发布,包含在机械车间和室内环境采集的视觉-惯性数据。推荐从官方源下载以保证数据完整性:
bash复制# 在ORB-SLAM3目录下创建数据集文件夹
mkdir -p datasets/EuRoC && cd datasets/EuRoC
# 下载MH_01_easy数据集(约1.4GB)
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
数据集解压后会得到mav0目录,其标准结构如下:
code复制mav0/
├── cam0/ # 左目相机
│ ├── data/ # 图像序列
│ └── data.csv # 时间戳
├── cam1/ # 右目相机(如使用立体模式)
├── imu0/ # IMU数据
└── state_groundtruth_estimate0/ # 真实轨迹
TUM数据集由慕尼黑工业大学提供,包含丰富的室内场景RGB-D数据。我们以经典的freiburg3_walking_xyz序列为例:
bash复制cd ~/ORB-SLAM3
wget https://vision.in.tum.de/rgbd/dataset/freiburg3/rgbd_dataset_freiburg3_walking_xyz.tgz
tar -xzvf rgbd_dataset_freiburg3_walking_xyz.tgz
关键文件说明:
rgb.txt和depth.txt:分别记录彩色图和深度图的时间戳及路径accelerometer.txt:加速度计数据(可选)groundtruth.txt:真实相机轨迹(用于评估)ORB-SLAM3已经内置了EuRoC数据集的时间戳文件,位于:
code复制Examples/Monocular/EuRoC_TimeStamps/
每个MH_xx.txt文件对应同名数据集的时间序列。检查你的数据集名称是否与时间戳文件匹配。
RGB-D数据需要将彩色图和深度图的时间戳对齐。使用ORB-SLAM3提供的associate.py脚本:
python复制python3 Examples/RGB-D/associate.py \
rgbd_dataset_freiburg3_walking_xyz/rgb.txt \
rgbd_dataset_freiburg3_walking_xyz/depth.txt > \
rgbd_dataset_freiburg3_walking_xyz/associations.txt
生成的associations.txt格式示例:
code复制1305031910.765238 rgb/1305031910.765238.png 1305031910.773227 depth/1305031910.773227.png
1305031910.985077 rgb/1305031910.985077.png 1305031910.993063 depth/1305031910.993063.png
注意:如果时间戳差异过大(默认阈值0.02秒),脚本会自动过滤不匹配的帧。可调整
--max_difference参数,但建议保持默认值以获得最佳同步效果。
bash复制./Examples/Monocular/mono_euroc \
./Vocabulary/ORBvoc.txt \
./Examples/Monocular/EuRoC.yaml \
./datasets/EuRoC/MH_01/mav0 \
./Examples/Monocular/EuRoC_TimeStamps/MH01.txt \
dataset-MH01_mono
关键参数解析:
ORBvoc.txt:ORB特征词汇树文件EuRoC.yaml:相机参数配置文件mav0目录的上级目录路径MH01.txt:预定义的时间戳文件成功运行时,你将看到:
bash复制./Examples/RGB-D/rgbd_tum \
./Vocabulary/ORBvoc.txt \
./Examples/RGB-D/TUM3.yaml \
./rgbd_dataset_freiburg3_walking_xyz \
./rgbd_dataset_freiburg3_walking_xyz/associations.txt
特别注意:
freiburg1/2/3选择对应的TUM1/2/3.yamlassociations.txt必须使用上一步生成的文件症状:程序启动立即报错,提示找不到文件
解决方案:
mav0的上级目录bash复制# 错误示例(直接指向mav0)
./Examples/Monocular/mono_euroc ... ./datasets/EuRoC/MH_01/mav0 ...
# 正确写法(指向mav0的父目录)
./Examples/Monocular/mono_euroc ... ./datasets/EuRoC/MH_01 ...
症状:程序运行但无可视化窗口,或窗口卡在首帧
解决方法:
mono_euroc.cc或rgbd_tum.cc中的bUseViewer参数为trueyaml复制# 在EuRoC.yaml或TUM3.yaml中修改
Camera.width: 640
Camera.height: 480
症状:TUM数据集运行时提示"Failed to load association file"
排查步骤:
associate.py生成的文本文件路径正确bash复制python3 Examples/RGB-D/associate.py \
--max_difference 0.05 \
rgb.txt depth.txt > associations.txt
症状:3D地图出现明显扭曲或系统频繁重置
优化方案:
yaml复制# ORB参数设置
ORBextractor.nFeatures: 2000 # 原值1000可适当提高
ORBextractor.scaleFactor: 1.2 # 金字塔尺度因子
成功运行后,ORB-SLAM3会在终端输出实时位姿估计,同时保存关键帧轨迹到文件KeyFrameTrajectory.txt。对于EuRoC数据集,我们可以用官方工具评估精度:
bash复制# 安装评估工具
sudo apt-get install evo-1
# 计算绝对位姿误差(APE)
evo_ape tum ./datasets/EuRoC/MH_01/mav0/state_groundtruth_estimate0/data.csv KeyFrameTrajectory.txt -a
典型输出示例:
code复制 max 1.512183
mean 0.325467
median 0.281254
min 0.012365
rmse 0.402831
sse 64.912047
std 0.240123
对于TUM数据集,可使用内置脚本计算轨迹误差:
bash复制python3 ./evaluation/evaluate_rpe.py \
./rgbd_dataset_freiburg3_walking_xyz/groundtruth.txt \
./CameraTrajectory.txt \
--fixed_delta
在EuRoC.yaml和TUM3.yaml中,这些参数值得关注:
yaml复制Camera.fps: 20 # 匹配实际帧率
ORBextractor.nLevels: 8 # 金字塔层数
ThDepth: 35.0 # 深度阈值(单目模式下)
ORB-SLAM3支持保存和加载地图,实现跨会话的定位:
bash复制# 保存地图
./Examples/Monocular/mono_euroc ... --map Save.map
# 加载已有地图
./Examples/Monocular/mono_euroc ... --map Load.map
使用htop观察系统资源占用:
bash复制sudo apt-get install htop
htop -d 10
正常运行时,ORB-SLAM3的CPU占用通常在150%-250%之间(多线程利用),内存占用约1.5GB。
除了默认的Pangolin视图,还可以用Python工具进行轨迹对比:
python复制import numpy as np
import matplotlib.pyplot as plt
# 加载轨迹数据
gt_data = np.loadtxt("groundtruth.txt")
est_data = np.loadtxt("KeyFrameTrajectory.txt")
plt.figure(figsize=(12,6))
plt.plot(gt_data[:,1], gt_data[:,2], label='Ground Truth')
plt.plot(est_data[:,1], est_data[:,2], label='ORB-SLAM3')
plt.legend()
plt.title("Trajectory Comparison")
plt.savefig("trajectory.png")
当第一次看到自己采集的数据通过ORB-SLAM3实时重建出三维环境时,那种成就感无可比拟。记得在测试室内场景时,算法甚至重建出了窗帘的褶皱细节,这让我意识到视觉SLAM已经发展到如此精细的程度。建议从官方数据集开始,等熟悉流程后,尝试用Intel RealSense或Azure Kinect采集自己的数据,那将是完全不同的体验。