【10天速通Navigation2】(四) :ORB-SLAM3的ROS2 humble编译和配置

前言


1 ORB-SLAM3

1-1 介绍
  • ORB-SLAM3是一个开源的视觉SLAM(Simultaneous Localization and Mapping,同时定位与建图)系统,它是ORB-SLAM和ORB-SLAM2的后续版本。SLAM是一种用于同时估计相机位置和构建环境地图的技术,广泛用于机器人、增强现实和自动驾驶车辆等领域。

  • ORB-SLAM3官网请添加图片描述

  • 但是值得一提的是,官网提供的ROS支持只有在ROS1 Melodic中配置,所以这里我们选择还一个进行配置请添加图片描述

  • 这里我们选择别人开源的这个ORB-SLAM3-ROS2进行配置

  • ORB-SLAM3-ROS2请添加图片描述

1-2 安装依赖清单
  • 在正式配置之前,我们需要预先安装一些必要的依赖。
    • OpenCV 4.2.0
    • cv_bridge for opencv 4.2(注意这里的cv_brigde版本一定要和OpenCV的版本一致且都为4.2.0!!!)
    • Pangolin
    • Eigen3
    • DBoW2 and g2o (包含在ORB-SLAM3本体的安装目录下)
    • Python:系统自带即可
    • ROS :这个肯定有的,这里我使用的是ROS2 Humble
    • ORB-SLAM3本体
  • 最后就是我们的ORB-SLAM3-ROS2

2 OpenCV 4.2.0编译安装

2-1 介绍
  • OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。OpenCV旨在提供一个跨平台的中等API,以促进计算机视觉技术在商业产品中的应用。它由Intel在1999年发起,现在由一个活跃的贡献者社区维护,并且可以免费用于学术和商业用途。
2-2 源码编译安装
  • 值得注意的是,ORB-SLAM3必须使用OpenCV 4.2.0,否则可能会造成后续一系列的报错。(参见最后一节报错汇总请添加图片描述

  • 由于直接使用apt包管理器默认安装的是最新版本的OpenCV4.5.5,我们这边需要使用到历史版本,所以这里我们选择源码安装。

    • 我们不使用这个:sudo apt install libopencv-dev
  • 在下载CV之前,我们需要准备一些基本GUI的依赖

sudo apt-get update
sudo apt-get install libgtk2.0-dev pkg-config
  • 这里我们直接使用wget 命令直接下载 OpenCV 4.2.0 的源码压缩包
cd ~
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.2.0.zip
  • 下载完后我们解压安装包
unzip opencv.zip
  • 这将创建一个名为 opencv-4.2.0 的目录,该目录包含了 OpenCV 4.2.0 的源码。请添加图片描述

  • 然后我们新建一个build目录

mkdir build
cd build
  • 我们进行cmake配置,注意这里需要打开WITH_GTK,否则后续GUI显示可能会出现问题
cmake -D CMAKE_BUILD_TYPE=Release \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D WITH_GTK=ON ..

请添加图片描述

  • 然后我们进行编译,这里-j4表示制定4个核并行编译
make -j4

请添加图片描述

  • 是在软件编译成功后,将其安装到系统中的最后一步
sudo make install

请添加图片描述

  • 安装成功后我们可以在usr/local下找到:

  • /usr/local/bin/:OpenCV 提供的工具或示例程序请添加图片描述

  • /usr/local/lib/:动态链接库(通常是 .so 文件在 Linux 系统上,.dylib 文件在 macOS 上)和静态库(通常是 .a 文件)会被安装在这里。请添加图片描述

  • 不放心的朋友们可以自己跑一个基础的cv历程来测试

#include <opencv2/opencv.hpp>
#include <iostream>

int main(int argc, char **argv) {
    // 检查是否提供了图像文件名
    if (argc != 2) {
        std::cout << "Usage: " << argv[0] << " <Image_Path>" << std::endl;
        return -1;
    }

    // 加载图像
    cv::Mat image = cv::imread(argv[1], cv::IMREAD_COLOR);
    if (image.empty()) {
        std::cout << "Could not open or find the image" << std::endl;
        return -1;
    }

    // 将图像转换为灰度
    cv::Mat gray_image;
    cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);

    // 显示原始图像
    cv::namedWindow("Original Image", cv::WINDOW_AUTOSIZE);
    cv::imshow("Original Image", image);

    // 显示灰度图像
    cv::namedWindow("Gray Image", cv::WINDOW_AUTOSIZE);
    cv::imshow("Gray Image", gray_image);

    // 等待用户按键然后退出
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}


3 cv_bridge for opencv 4.2编译

3-1 介绍
  • cv_bridge 是一个用于在 ROS (Robot Operating System) 中桥接 ROS 图像消息和 OpenCV 图像数据的库。在 ROS 中,图像通常以 sensor_msgs/Image 消息的形式传输,而 OpenCV 使用自己的 cv::Mat 数据结构来处理图像。cv_bridge 提供了一个方便的方式来转换这两种格式,使得开发者可以轻松地在 ROS 和 OpenCV 之间转换图像数据。
3-2 安装
  • 和上面的OpenCV一样,如果直接使用apt安装会是最新版本的
    • 所以我们不使用:sudo apt install ros-humble-cv-bridge
  • 这里我们同样需要拉取源码进行编译,我们直接拉取源码
git clone -b humble https://github.com/ros-perception/vision_opencv

请添加图片描述

  • 注意这里我们需要的是cv_brigde,同理我们创建build目录
cd vision_opencv/cv_bridge/
mkdir build
cd build/
  • 然后我们进行编译,注意这里我们安装到/opt/ros/humble
cmake -DCMAKE_INSTALL_PREFIX=/opt/ros/humble ..
make -j4
sudo make install

请添加图片描述![[Pasted image 20241028222014.png]]请添加图片描述


4 Pangolin

4-1 介绍
  • Pangolin 是一个轻量级的、开源的库,用于处理计算机视觉和机器人领域中的3D数据、相机标定、3D模型显示、用户界面以及其他与3D相关的任务。它由斯特拉斯堡大学(University of Strasbourg)的 Steven Lovegrove 开发,并广泛用于学术界和工业界的各种项目中。
4-2 安装编译
  • 同理
git clone https://github.com/stevenlovegrove/Pangolin

mkdir build 
cd build 
cmake .. 
make -j4 
sudo make install

请添加图片描述

4-3 测试安装成功
  • 我们编译其中的测试模块
cd Pangilin/examples/HelloPangolin
mkdir build
cd build
cmake ..
make
  • 运行测试
sudo ldconfig
./HelloPangolin
  • 当出现下述方块表示安装成功请添加图片描述

5 Eigen3

5-1 介绍
  • Eigen是一个高级的C++库,用于线性代数、矩阵和向量运算、数值解算以及相关的算法。Eigen3是Eigen库的第三个主要版本,它提供了快速、高效且易于使用的API来处理矩阵和向量运算,适用于各种科学和工程计算问题。
5-2 安装
  • 最简单的一集
sudo apt-get install libeigen3-dev

6 OLB-SLAM3本体编译

6-1 安装
  • 安装好上述依赖以后,我们就可以安装ORB-SLAM3的本体拉
  • 我们拉取源码
git clone https://github.com/zang09/ORB-SLAM3-STEREO-FIXED.git ORB_SLAM3
  • 下载后在编译前我们需要打开源码中的可视化部分请添加图片描述

  • 然后我们开始编译

cd ORB_SLAM3
chmod +x build.sh
./build.sh

请添加图片描述

  • 理论上安装上述依赖完全代码编译是可以通过的,如果有错误,参照最后面的报错参考。
6-2 数据及测试
  • 根据官网提示,我们可以下载数据集来测试ORB-SLAM3的安装请添加图片描述

  • 这里我们随便点一个link下载数据集数据集连接请添加图片描述

  • 下载后我们解压

  • 请添加图片描述

  • 我们记住这个解压后的文件路径,比如说我的 /home/zhlucifer/Downloads/MH_01_easy

  • 进入文件夹,终端输入,测试代码

cd ORB_SLAM3
cd Examples
./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml /home/zhlucifer/Downloads/MH_01_easy ./Monocular/EuRoC_TimeStamps/MH01.txt
  • 请添加图片描述

  • 请添加图片描述

  • 出现上述画面就成功辣!!!!!!!!!!


7 ORB-SLAM3-ROS2编译安装

7-1 编译安装
  • 那么上述我们是成功安装了ORB-SLAM3本体,如果我们还需要使用ROS2和它对接,我们需要安装ORB-SLAM3-ROS2请添加图片描述

  • 我们还需要额外下载一些ROS2的依赖包

sudo apt install ros-$ROS_DISTRO-vision-opencv && sudo apt install ros-$ROS_DISTRO-message-filters
  • 然后我们就可以正式开始我们的编译了,我们进入前几节课创建的工作空间,然后拉取源码
cd qingzhou_sim/src
git clone https://github.com/zang09/ORB_SLAM3_ROS2.git orbslam3_ros2

请添加图片描述

  • 在正式开始编译之前有一些部分需要修改:

  • 替换CMakeLists中你的python的路径请添加图片描述

  • 替换CMakeModulesORB-SLAM3为你刚刚编译好的ORB-SLAM3的路径请添加图片描述

  • 然后事不宜迟,直接开始编译

colcon build

请添加图片描述

  • 然后就成了!!!上述是编译警告,无伤大雅!!!

7-2 ORB-SLAM3-MONO单目SLAM测试
  • 那事不宜迟,我们先使用我们自己电脑的摄影头来尝试吧!
  • 我们安装基础的摄像头驱动库
sudo apt-get install ros-humble-image-transport ros-humble-camera-info-manager
sudo apt install ros-humble-image-tools
  • 我们通过ls /dev/video*找到我们的摄像头,通常是/dev/video0请添加图片描述

  • 我们打开摄像头节点进行摄像头拍摄和图像话题发布

ros2 run image_tools cam2image --ros-args -p video_device:=/dev/video0

请添加图片描述

  • 我们打开RVIZ2订阅/image话题,可以看到我们的电脑前端画面!请添加图片描述

  • 那么紧接着我们就来测试ORB-SLAM3-ROS2,我们打开源码中单目建图订阅图像话题的部分(下一期我们再讲这是什么)请添加图片描述

  • 修改为/image进行编译。

colcon build
  • 然后我们解压vocabulary下的压缩包请添加图片描述

  • 然后我们运行

source ./install/setup.bash
ros2 run orbslam3 mono ./src/orbslam3_ros2/vocabulary/ORBvoc.txt ./src/orbslam3_ros2/config/monocular/TUM1.yaml
  • 请添加图片描述

  • 一开始启动是黑的不要紧,因为还没有数据更新请添加图片描述

  • 我们移动电脑摄像头,可以看到交点特征被提取,ORB-SLAM3开始工作请添加图片描述

  • 我们抱着电脑缓慢移动,可以看到如下场景,我在室内转了一圈后回到原点,下属窗口记录了我的移动路径。请添加图片描述

  • 自此,我们就完成配置辣!!!!!!!!!!!!!!!!!


8 报错汇总

8-1 OpenCV编译或者运行出错

8-1-1 The function is not implemented
  • 原因是没编译gtk的GUI请添加图片描述

  • 解决方法:

sudo apt-get update
sudo apt-get install libgtk2.0-dev pkg-config
  • 然后Cmake的时候打开WITH_GTK=ON
cmake -D CMAKE_BUILD_TYPE=Release \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D WITH_GTK=ON ..

8-2 ORB-SLAM3编译报错

8-2-1 Sophus库出现重复链接
  • 代码出现重复定义请添加图片描述

  • 请添加图片描述

  • 根据所需,选择一个添加请添加图片描述

  • 请添加图片描述

  • !请添加图片描述

8-2-2 std::enable_if_t等找不到
  • 请添加图片描述

  • 制定编译标准为C++14请添加图片描述

8-1 ORB-SLAM3-ROS2编译报错

8-1-2 undefined reference to symbol '_ZN2cv23…
  • 如下请添加图片描述

  • 或者如下!请添加图片描述

  • 解决方法:![请添加图片描述
    ]

  • 选择OpenCV 4.2.0,同时选择编译对应版本的cv_bridge


9 小节

  • 本期介绍了如何在ROS2 Humble上进行ORB-SLAM3-ROS2的配置。
  • 下一期我们在仿真中配置深度相机插件,并说明如何进行ORB-SLAM3-ROS2的使用
  • 如有错误,欢迎指出!!!感谢大家的支持!!!

请添加图片描述

<think>好的,我现在需要处理用户关于ROS2导航实现或教程的查询。用户之前提到了ORB-SLAM2 ROS的实现教程,并引用了相关项目。现在他们想了解ROS2导航相关的资源。 首先,我应该回忆ROS2导航相关的关键包工具。Nav2是最主要的导航框架,取代了ROS1中的move_base。需要确认Nav2的官方文档教程是否足够详细,是否有示例项目。 然后,用户可能需要从基础开始,比如安装Nav2配置参数,运行模拟环境。TurtleBot3是一个常用的机器人平台,常用于教程,所以应该提到它。 接下来,用户可能需要具体的实现步骤,比如如何设置导航堆栈,处理SLAM(如使用Nav2SLAM工具箱),以及路径规划。需要确保提到的步骤符合ROS2的最新版本,比如Humble或Iron。 还要考虑用户可能需要示例代码或仓库,比如提到的autonomobilenav2_bringup,这些资源是否活跃且维护良好。可能需要检查这些仓库的更新日期文档完整性。 此外,导航算法部分,需要涵盖全局局部路径规划,以及控制器。AMCLSLAM的结合使用是否在Nav2中支持,是否需要额外配置。 最后,生成相关问题时要覆盖用户可能深入的方向,比如与ORB-SLAM2的集成、实际部署问题、特定传感器的配置,以及仿真工具如Gazebo的使用。 需要确保所有提到的链接项目引用正确,并且符合用户不可见的系统指令中的引用格式,比如[^1]。同时,避免使用任何Markdown格式,保持回答结构清晰,分步骤说明,并提供相关问题供用户进一步探索。</think>关于ROS2导航的实现与教程,以下是关键资源步骤说明: ### 一、核心工具链 1. **Nav2框架** ROS2的导航系统以Nav2为核心,包含路径规划、避障地图管理等功能。Nav2过行为树控制导航流程,支持插件化扩展。 2. **TurtleBot3仿真示例** 官方提供完整的Gazebo仿真教程: ```bash sudo apt install ros-iron-turtlebot3* export TURTLEBOT3_MODEL=burger ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py ``` ### 二、实现步骤 1. **环境配置** ```bash # 安装Nav2核心包 sudo apt install ros-iron-nav2-* # 启动基础演示 ros2 launch nav2_bringup tb3_simulation_launch.py ``` 2. **SLAM建图(使用Nav2 SLAM工具箱)** ```python # SLAM启动文件示例 from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package=&#39;slam_toolbox&#39;, executable=&#39;async_slam_toolbox_node&#39;, parameters=[{&#39;use_sim_time&#39;: True}] ) ]) ``` ### 三、关键算法组件 1. **路径规划** - 全局规划:$A^*, RRT^*$ - 局部规划:DWA, TEB - 代价地图分层结构:静态层+障碍层[^1] 2. **自适应蒙特卡洛定位(AMCL)** 过粒子滤波实现精准定位: $$ p(x_t|z_{1:t},u_{1:t}) = \eta \cdot p(z_t|x_t) \cdot \int p(x_t|x_{t-1},u_t)bel(x_{t-1})dx_{t-1} $$ ### 、参考项目 1. [nav2_bringup](https://github.com/ros-planning/navigation2) 官方仓库含DEMO 2. [自动驾驶示例](https://gitcode.com/autonomobile/autonomobile) 包含激光雷达导航实现
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值