1. ORB_SLAM3 环境搭建与依赖安装
第一次接触ORB_SLAM3时,我花了两天时间才把环境配好。这里分享一个实测有效的安装方案,帮你避开那些坑人的依赖问题。建议使用Ubuntu 20.04系统,这是目前兼容性最好的平台。
先解决最头疼的Pangolin安装问题。很多教程会让你直接clone官方仓库,但在20.04上会遇到GLFW版本冲突。正确的做法是:
git clone -b feat/20.04 https://github.com/kin-zhang/Pangolin.git cd Pangolin ./scripts/install_prerequisites.sh recommended cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build接下来安装ORB_SLAM3本体。注意!官方源码在ROS环境下有编译问题,必须使用修复版:
git clone -b fix/ros_build https://gitee.com/kin_zhang/ORB_SLAM3.git cd ORB_SLAM3 chmod +x build.sh ./build.sh安装过程中最常见的三个坑:
- OpenCV版本冲突:建议使用OpenCV 3.4.10,这个版本与ORB_SLAM3的兼容性最好。如果遇到C++14标准报错,需要在CMakeLists.txt中手动添加
set(CMAKE_CXX_STANDARD 14) - Eigen3路径问题:当出现Sophus相关错误时,试试
sudo make install安装Eigen3 - ROS环境变量:编译完成后务必执行:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/path/to/ORB_SLAM3/Examples/ROS2. 相机标定实战指南
用自定义数据集最大的挑战就是相机标定。我去年给工业相机做标定时,发现官方文档里的方法根本不适合实际场景。这里分享一个更实用的标定流程。
2.1 内参标定
推荐使用ROS的camera_calibration工具,比OpenCV更稳定:
rosrun camera_calibration cameracalibrator.py \ --size 8x6 \ --square 0.024 \ image:=/camera/image_raw标定完成后会生成如下参数:
[image] width=1024 height=768 [camera] fx=604.964 fy=604.625 cx=517.844 cy=389.209 k1=-0.0958 k2=0.08741 p1=0.000208 p2=-0.0001086把这些参数填入YAML文件时要注意:
- 畸变系数k3通常设为0
- 切向畸变p1/p2的数值一般很小
- 如果使用鱼眼相机,需要改用fisheye模型
2.2 外参标定(双目+IMU)
当需要标定相机与IMU的相对位置时,推荐使用Kalibr工具。去年我在无人机项目中发现,手工测量外参的误差能达到5cm以上,而Kalibr可以控制在1cm内。
标定步骤:
- 录制包含AprilTag和IMU数据的bag包
- 运行标定命令:
kalibr_calibrate_imu_camera \ --target aprilgrid.yaml \ --bag dynamic.bag \ --cam camchain.yaml得到的变换矩阵要转换为ORB_SLAM3需要的格式:
Stereo.T_c1_c2: !!opencv-matrix rows: 4 cols: 4 dt: f data: [1.0, 0.0, 0.0, -0.12, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0]3. 配置文件深度解析
ORB_SLAM3的YAML文件藏着很多不为人知的细节参数。去年调试工厂AGV时,我通过调整这些参数将定位精度提高了40%。
3.1 相机参数模板
%YAML:1.0 --- # 相机内参 Camera.fx: 604.964 Camera.fy: 604.625 Camera.cx: 517.844 Camera.cy: 389.209 Camera.k1: -0.0958 Camera.k2: 0.08741 Camera.p1: 0.000208 Camera.p2: -0.0001086 Camera.width: 1024 Camera.height: 768 Camera.fps: 20.0 # ORB特征参数 ORBextractor.nFeatures: 1500 ORBextractor.scaleFactor: 1.2 ORBextractor.nLevels: 8 ORBextractor.iniThFAST: 20 ORBextractor.minThFAST: 7 # IMU参数(关键!) IMU.NoiseGyro: 1.7e-4 IMU.NoiseAcc: 2.0e-3 IMU.GyroWalk: 1.8e-5 IMU.AccWalk: 3.0e-33.2 参数调优经验
- 特征点数量:室内场景用1000-1500,室外大场景建议2000+
- FAST阈值:光线较暗时降低到10-15
- IMU噪声参数:实测发现官方默认值偏小,建议增大50%
- 尺度金字塔:对于高速移动场景,scaleFactor改为1.1效果更好
4. 实战调试与问题排查
去年部署巡检机器人时,我遇到了所有能想到的坑。这里总结几个典型案例:
4.1 IMU初始化失败
现象:控制台不断打印"not IMU meas" 解决方案:
- 确保bag播放时添加
--pause参数 - 在播放bag前先移动设备产生IMU数据
- 检查IMU话题是否映射正确:
rosbag play --pause data.bag /imu:=/imu4.2 图像话题转换
当使用压缩图像传输时,必须进行话题重映射:
rosrun image_transport republish \ compressed in:=/camera/compressed \ raw out:=/camera/image_raw4.3 坐标系对齐问题
常见错误是Z轴朝向不一致。ORB_SLAM3使用相机坐标系(Z向前),而ROS常用ENU坐标系。转换方法:
# 将ORB_SLAM3的位姿转换到ROS坐标系 def pose_to_ros(pose): # 创建坐标系变换矩阵 T = np.eye(4) T[:3,:3] = pose[:3,:3] T[:3,3] = pose[:3,3] # 坐标系旋转 R = np.array([[0,0,1,0], [-1,0,0,0], [0,-1,0,0], [0,0,0,1]]) return R @ T4.4 性能优化技巧
- 在
System.cc中修改线程数:
mpTracker = new Tracking(this, mpVocabulary, mpFrameDrawer, mpMapDrawer, mpAtlas, mpKeyFrameDatabase, strSettingsFile, mSensor, 4); // 改为4线程- 关闭实时可视化能提升30%性能
- 对于嵌入式设备,减少ORB特征点到800-1000