在开始ORB-SLAM3的复现之前,确保你的系统环境已经正确配置。我使用的是Ubuntu 20.04 LTS版本,搭配ROS Noetic。这个组合是目前最稳定的选择之一,因为ORB-SLAM3的依赖库在这个环境下有较好的兼容性。
首先,我们需要安装ROS Noetic。打开终端,依次执行以下命令:
bash复制sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
sudo apt install ros-noetic-desktop-full
安装完成后,记得初始化rosdep并设置环境变量:
bash复制sudo rosdep init
rosdep update
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
接下来创建catkin工作空间,这是ROS开发的标配:
bash复制mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
注意:很多初学者容易忽略环境变量的设置,导致后续出现"package not found"等错误。建议每次打开新终端时都确认一下环境变量是否生效,可以通过
echo $ROS_PACKAGE_PATH命令检查。
ORB-SLAM3的依赖库安装是最容易踩坑的环节。根据我的经验,Pangolin、OpenCV和Sophus这三个库的版本兼容性问题最为突出。
Pangolin是ORB-SLAM3的可视化工具,建议安装0.6版本而非最新版:
bash复制sudo apt-get install libglew-dev libpython2.7-dev
git clone -b v0.6 https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build && cd build
cmake ..
make -j4
sudo make install
如果遇到"slots_reference"编译错误,通常是因为使用了过新的Pangolin版本。这时需要完全卸载现有版本再重新安装0.6版。
ORB-SLAM3官方推荐OpenCV 3.x,但在Ubuntu 20.04上默认安装的是4.2版本。经过多次测试,我发现OpenCV 4.2也能正常工作,但需要修改CMakeLists.txt:
bash复制sudo apt install libopencv-dev python3-opencv
安装后检查版本:
bash复制pkg-config --modversion opencv
如果显示4.x版本,需要在ORB-SLAM3的CMakeLists.txt中找到find_package(OpenCV 3.0 QUIET)这行,将其改为find_package(OpenCV REQUIRED)。
Sophus库的安装最容易出问题,特别是与Eigen3的版本冲突。我推荐使用以下方法:
bash复制git clone https://github.com/strasdat/Sophus.git
cd Sophus
mkdir build && cd build
cmake ..
make -j4
sudo make install
如果遇到"redefinition of class"错误,可能是因为系统中存在多个Sophus版本。这时需要完全清除旧版本:
bash复制sudo rm -rf /usr/local/include/sophus /usr/local/lib/cmake/Sophus
现在我们可以开始编译ORB-SLAM3了。首先克隆官方仓库:
bash复制git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git
cd ORB_SLAM3
chmod +x build.sh
./build.sh
错误1:fatal error: sophus/se3.hpp: 没有那个文件或目录
这是因为Sophus安装路径未被正确识别。解决方法:
bash复制cd ORB_SLAM3/Thirdparty/Sophus
mkdir build && cd build
cmake ..
make -j4
错误2:Pangolin could not be found
检查Pangolin是否安装成功,并在CMakeLists.txt中添加:
cmake复制set(Pangolin_DIR /usr/local/lib/cmake/Pangolin)
错误3:'usleep' was not declared in this scope
这是一个C++11兼容性问题,修改对应源文件,在头部添加:
cpp复制#include <unistd.h>
如果需要ROS支持,还需要编译ROS模块:
bash复制chmod +x build_ros.sh
./build_ros.sh
如果遇到"Failed to invoke rospack"错误,尝试:
bash复制export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/catkin_ws/src/ORB_SLAM3/Examples/ROS
首先下载EuRoC数据集,建议从官方获取MH_01_easy数据集。解压后执行:
bash复制./Examples/Stereo/stereo_euroc ./Vocabulary/ORBvoc.txt ./Examples/Stereo/EuRoC.yaml /path/to/MH01 ./Examples/Stereo/EuRoC_TimeStamps/MH01.txt dataset-MH01_stereo
如果出现"waiting for images"问题,检查时间戳文件与图像序列是否匹配。我遇到过时间戳文件行数与实际图像数量不一致的情况,需要手动修正。
对于TUM VI数据集,命令稍有不同:
bash复制./Examples/Monocular-Inertial/mono_inertial_tum_vi ./Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/TUM-VI.yaml /path/to/dataset-room1_512_16/mav0/cam0/data ./Examples/Monocular-Inertial/TUM_TimeStamps/dataset-room1_512.txt ./Examples/Monocular-Inertial/TUM_IMU/dataset-room1_512.txt dataset-room1_512_monoi
提示:数据集路径建议使用绝对路径,避免相对路径导致的文件找不到错误。我在第一次尝试时就因为路径问题浪费了两小时。
首先安装usb_cam包:
bash复制cd ~/catkin_ws/src
git clone https://github.com/ros-drivers/usb_cam.git
cd ~/catkin_ws
catkin_make
启动摄像头:
bash复制roslaunch usb_cam usb_cam-test.launch
然后运行ORB-SLAM3:
bash复制rosrun ORB_SLAM3 Mono /path/to/ORB_SLAM3/Vocabulary/ORBvoc.txt /path/to/ORB_SLAM3/Examples/Monocular/YourCamera.yaml
对于Gazebo仿真,需要先设置阿克曼小车模型。我参考了以下步骤:
~/.gazebo/models目录bash复制roslaunch smartcar_description display.launch
然后运行ORB-SLAM3:
bash复制rosrun ORB_SLAM3 Mono /path/to/Vocabulary/ORBvoc.txt /path/to/Examples/Monocular/YourGazeboCamera.yaml
如果出现"waiting for images",检查相机话题是否匹配:
bash复制rostopic list
rostopic echo /camera/image_raw
经过基础功能实现后,我们可以进行一些优化:
-DCMAKE_BUILD_TYPE为Release对于实际部署,我建议:
ros::init()后添加ros::NodeHandle::setParam("/use_sim_time", true)确保时间同步Tracking.cc中的特征点提取参数,适应不同场景g2o_viewer工具可视化优化结果在完成所有配置后,我发现ORB-SLAM3在室内环境下能达到厘米级精度,但在快速移动时容易丢失跟踪。这时需要调整ORBextractor.cc中的特征点数量和尺度因子。经过一周的反复调试,最终在i7-10750H处理器上实现了稳定的30fps实时运行。