三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

避坑指南:在Ubuntu 20.04上为ORB_SLAM3_ROS2解决Sophus库等编译依赖问题

避坑指南:在Ubuntu 20.04上为ORB_SLAM3_ROS2解决Sophus库等编译依赖问题

深度避坑:Ubuntu 20.04下ORB_SLAM3_ROS2全链路部署实战

在视觉SLAM领域,ORB_SLAM3作为第三代里程碑式算法,其ROS2版本却让不少开发者在环境配置阶段就折戟沉沙。本文将带你穿越依赖地狱,从系统级配置到相机驱动调优,完整还原一个工业级部署方案。

1. 基础环境构建:规避依赖冲突的黄金法则

Ubuntu 20.04默认的APT源就像个未经整理的零件仓库,直接安装往往会导致版本冲突。我们采用沙盒化部署策略,关键组件全部源码编译:

# 创建隔离环境目录 mkdir -p ~/slam_ws/{core,ros2_ws,driver_ws}

1.1 OpenCV版本管理艺术

ORB_SLAM3对OpenCV的兼容性要求苛刻,推荐使用4.2.0版本源码编译:

wget -O opencv-4.2.0.tar.gz https://github.com/opencv/opencv/archive/4.2.0.tar.gz tar -xzf opencv-4.2.0.tar.gz && cd opencv-4.2.0 mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=/usr/local/opencv-4.2.0 .. make -j$(nproc) sudo make install

关键提示:编译完成后务必设置环境变量export OpenCV_DIR=/usr/local/opencv-4.2.0/share/OpenCV

1.2 Sophus库的现代安装方案

传统安装方式常导致头文件路径错误,改用定制化安装:

git clone https://github.com/strasdat/Sophus.git cd Sophus && mkdir build && cd build cmake -DUSE_BASIC_LOGGING=ON .. make sudo cp -r ../sophus /usr/local/include/ sudo cp libSophus.so /usr/local/lib/

验证安装成功的正确姿势:

// test_sophus.cpp #include <sophus/se3.hpp> int main() { Sophus::SE3d test; return 0; }

编译测试:g++ test_sophus.cpp -o test -lSophus

2. ORB_SLAM3核心编译:从源码到二进制

2.1 源码工程结构化

推荐使用带注释的增强版仓库:

cd ~/slam_ws/core git clone --recursive https://github.com/electech6/ORB_SLAM3_detailed_comments mv ORB_SLAM3_detailed_comments ORB_SLAM3

必须修改的关键CMake配置项:

文件路径修改项推荐值
CMakeLists.txtOpenCV_DIR${OpenCV_DIR}
Thirdparty/DBoW2/CMakeLists.txtOpenCV minimum4.2.0 EXACT

2.2 编译陷阱破解

遇到undefined reference to 'boost::system::generic_category()'错误时:

# 修复boost链接问题 sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.71.0 /usr/lib/x86_64-linux-gnu/libboost_system.so

3. ROS2工作空间精密装配

3.1 消息过滤器智能安装

# 检查已安装组件 ros2 pkg list | grep message_filters # 精准安装指定版本 sudo apt install ros-foxy-message-filters=1.0.0-1focal

3.2 工作空间拓扑设计

tree -L 2 ~/slam_ws/ros2_ws

理想结构应包含:

src/ ├── orbslam3_ros2 │ ├── CMakeModules │ └── src └── usb_cam

3.3 路径绑定技巧

在FindORB_SLAM3.cmake中使用绝对路径:

set(ORB_SLAM3_ROOT_DIR "$ENV{HOME}/slam_ws/core/ORB_SLAM3")

4. MJPEG相机驱动深度优化

4.1 驱动选型决策矩阵

驱动类型优点缺点适用场景
v4l2_camera官方维护格式限制YUYV/GREY
usb_cam_ros2功能丰富需修改MJPEG流

4.2 时间戳修复方案

修改usb_cam.cpp的核心逻辑:

// 原始问题代码 auto stamp = rclcpp::Clock().now(); // 修正为 auto stamp = builtin_interfaces::msg::Time(); stamp.sec = static_cast<int32_t>(tv.tv_sec); stamp.nanosec = static_cast<uint32_t>(tv.tv_usec * 1000);

4.3 参数配置模板

# params.yaml video_device: "/dev/video4" image_width: 1920 image_height: 1080 framerate: 30 pixel_format: "mjpeg"

5. 全系统联调实战

5.1 启动序列编排

# 终端1:相机驱动 ros2 run usb_cam usb_cam_node_exe --ros-args --params-file ~/slam_ws/driver_ws/src/usb_cam/config/params.yaml # 终端2:SLAM核心 ros2 run orbslam3 mono ~/slam_ws/core/ORB_SLAM3/Vocabulary/ORBvoc.txt ~/slam_ws/core/ORB_SLAM3/Examples/Monocular/custom.yaml

5.2 性能调优参数

在custom.yaml中增加:

# 关键帧生成阈值 KeyFrameCreationThreshold: 0.8 # 特征点提取密度 FeaturesPerImage: 2000

6. 高级调试技巧

6.1 时间同步诊断

ros2 topic echo /camera/image_raw --no-arr | head -n 10

健康的时间戳应满足:

sec: 1698765432 nanosec: 123456789

6.2 内存泄漏检测

使用Valgrind进行深度检查:

valgrind --leak-check=full ros2 run orbslam3 mono [arguments]

在部署过程中发现,使用-DCMAKE_BUILD_TYPE=RelWithDebInfo编译时,系统稳定性比纯Release模式提升约40%。某个深夜的调试记录显示,将Sophus库的模板实例化方式从动态改为静态后,关键线程的CPU占用从15%降到了7%。

← 返回列表