【SLAM实战】ORB_SLAM3 从零到一:自定义数据集配置与避坑指南

张开发
2026/5/24 7:57:18 15 分钟阅读
【SLAM实战】ORB_SLAM3 从零到一:自定义数据集配置与避坑指南
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_TYPERelease 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的兼容性最好。如果遇到C14标准报错需要在CMakeLists.txt中手动添加set(CMAKE_CXX_STANDARD 14)Eigen3路径问题当出现Sophus相关错误时试试sudo make install安装Eigen3ROS环境变量编译完成后务必执行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] width1024 height768 [camera] fx604.964 fy604.625 cx517.844 cy389.209 k1-0.0958 k20.08741 p10.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室外大场景建议2000FAST阈值光线较暗时降低到10-15IMU噪声参数实测发现官方默认值偏小建议增大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

更多文章