ORB-SLAM3与ROS的完美结合:如何在Ubuntu20.04上实现实时SLAM

发布时间:2026/6/24 18:04:14

ORB-SLAM3与ROS的完美结合:如何在Ubuntu20.04上实现实时SLAM ORB-SLAM3与ROS的深度集成Ubuntu20.04环境下的实时SLAM实战指南当机器人需要在不熟悉的环境中自主导航时实时构建环境地图并同时定位自身位置SLAM的能力至关重要。ORB-SLAM3作为当前最先进的视觉SLAM系统之一与ROS的集成能够为机器人开发者提供强大的实时环境感知解决方案。本文将带你深入探索如何在Ubuntu20.04系统中配置和运行ORB-SLAM3的ROS节点实现从基础环境搭建到实际场景应用的全流程。1. 环境准备与依赖安装在开始ORB-SLAM3的集成之前确保你的Ubuntu20.04系统已经完成了基础配置。ROS Noetic是Ubuntu20.04官方支持的版本建议使用完整桌面版安装sudo apt install ros-noetic-desktop-full echo source /opt/ros/noetic/setup.bash ~/.bashrc source ~/.bashrcORB-SLAM3需要以下核心依赖Pangolin用于可视化的轻量级OpenGL显示库Eigen3线性代数运算库OpenCV计算机视觉基础库建议4.2.0版本DBoW2和g2oORB-SLAM3内置无需单独安装安装Pangolin及其依赖sudo apt-get install -y libglew-dev cmake libpython2.7-dev ffmpeg \ libavcodec-dev libavutil-dev libavformat-dev libswscale-dev \ libavdevice-dev libjpeg-dev libpng-dev libtiff5-dev libopenexr-dev git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build cd build cmake .. cmake --build . sudo make install提示如果遇到Pangolin编译错误尝试切换到v0.8版本分支git checkout v0.82. ORB-SLAM3源码获取与适配性修改从官方GitHub仓库获取ORB-SLAM3源码git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3 cd ORB_SLAM3针对Ubuntu20.04环境需要进行以下关键修改2.1 CMakeLists.txt适配修改顶层CMakeLists.txt文件# 修改OpenCV版本要求约第33行 find_package(OpenCV 4 REQUIRED) # 修改Eigen版本要求约第41行 find_package(Eigen3 3.3.7 REQUIRED)2.2 ROS节点配置调整进入ROS示例目录并修改其CMakeLists.txtcd Examples_old/ROS/ORB_SLAM3 gedit CMakeLists.txt添加Sophus库路径约第49行include_directories( ${PROJECT_SOURCE_DIR}/../../../Thirdparty/Sophus ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/../../../include ${EIGEN3_INCLUDE_DIR} ${Pangolin_INCLUDE_DIRS} )2.3 关键源码修改针对ROS环境下可能出现的兼容性问题需要修改AR模块的部分代码// 在ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc中添加头文件 #include Eigen/Dense #include opencv2/core/eigen.hpp // 替换TrackMonocular调用部分约151行 Sophus::SE3f Tcw_SE3f mpSLAM-TrackMonocular(cv_ptr-image,cv_ptr-header.stamp.toSec()); Eigen::Matrix4f Tcw_Matrix Tcw_SE3f.matrix(); cv::eigen2cv(Tcw_Matrix, Tcw);3. 系统编译与ROS节点生成完成所有修改后开始编译ORB-SLAM33.1 主库编译cd ORB_SLAM3 chmod x build.sh ./build.sh3.2 ROS节点构建cd Examples_old/ROS/ORB_SLAM3 chmod x build_ros.sh ./build_ros.sh注意如果遇到Sophus相关编译错误尝试在build_ros.sh中添加-DCMAKE_CXX_STANDARD14标志4. 数据集准备与运行测试ORB-SLAM3支持多种运行模式下面以EuROC数据集为例演示不同配置下的使用方法。4.1 非ROS环境运行首先下载EuROC数据集中的MH_01_easy序列wget -c 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 MH01运行不同传感器配置模式命令示例适用场景单目./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml ./MH01 ./Monocular/EuRoC_TimeStamps/MH01.txt仅相机双目./Stereo/stereo_euroc ../Vocabulary/ORBvoc.txt ./Examples/Stereo/EuRoC.yaml ./MH01 ./Examples/Stereo/EuRoC_TimeStamps/MH01.txt立体视觉单目IMU./Monocular-Inertial/mono_inertial_euroc ../Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/EuRoC.yaml ./MH01 ./Examples/Monocular-Inertial/EuRoC_TimeStamps/MH01.txt视觉惯性融合4.2 ROS环境实时运行在ROS环境下ORB-SLAM3可以更好地与机器人系统集成。首先确保roscore已运行roscore然后在新终端中启动对应的SLAM节点以双目惯性模式为例rosrun ORB_SLAM3 Stereo_Inertial Vocabulary/ORBvoc.txt Examples/Stereo-Inertial/EuRoC.yaml false最后播放数据集rosbag play MH_01_easy.bag /cam0/image_raw:/camera/left/image_raw /cam1/image_raw:/camera/right/image_raw /imu0:/imu5. 实际应用与性能优化将ORB-SLAM3集成到实际机器人系统中时需要考虑以下关键因素5.1 相机-IMU标定精确的标定是获得良好性能的前提。推荐使用Kalibr工具进行标定# 安装Kalibr sudo apt install python3-dev python3-pip pip install pykalibr # 运行标定 kalibr_calibrate_imu_camera --target april_6x6.yaml --bag dynamic.bag --cam camchain.yaml --imu imu.yaml5.2 参数调优指南ORB-SLAM3的主要可调参数集中在YAML配置文件中# 相机内参需根据实际设备修改 Camera.fx: 435.2046959714599 Camera.fy: 435.2046959714599 Camera.cx: 367.4517211914062 Camera.cy: 252.2008514404297 # ORB特征参数 ORBextractor.nFeatures: 1200 # 提取的特征点数 ORBextractor.scaleFactor: 1.2 # 金字塔缩放因子 ORBextractor.nLevels: 8 # 金字塔层数 # IMU参数如使用 IMU.NoiseGyro: 1.7e-4 # 陀螺仪噪声 IMU.NoiseAcc: 2.0e-3 # 加速度计噪声5.3 常见问题解决方案问题1运行时出现Segmentation fault (core dumped)可能原因Pangolin版本不兼容解决方案切换到Pangolin v0.8分支重新编译问题2ROS节点无法找到ORB词汇表解决方案确保工作目录正确或使用绝对路径指定词汇表文件位置问题3IMU数据融合效果不佳检查项确认IMU与相机的时间同步精度建议1ms调整参数适当增加IMU.NoiseGyro和IMU.NoiseAcc值在实际机器人部署中我发现将ORB特征点数从默认的1200降低到800可以在保持跟踪精度的同时显著提高运行速度特别是在资源受限的嵌入式平台上。同时对于动态环境适当增加关键帧插入阈值可以减少由移动物体引起的定位漂移。

相关新闻