【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的使用
  • 如有错误,欢迎指出!!!感谢大家的支持!!!

请添加图片描述

### 关于ROS2中视觉SLAM的信息 #### ROS2 视觉 SLAM 的实现教程案例 在ROS2环境中,视觉SLAM(Simultaneous Localization and Mapping)的应用日益广泛。随着技术进步,基于ROS2平台的视觉SLAM解决方案不断涌现,提供了丰富的工具支持材料来帮助开发者快上手。 对于希望深入了解如何利用ROS2搭建视觉SLAM系统的人员来说,存在多种资源可供学习: - **官方文档与指南**:ROS官方网站提供了详细的安装指导以及针对不同硬件设备的具体设置说明[^1]。 - **开源项目实例**:例如Isaac ROS Visual SLAM是一个很好的起点,它不仅包含了完整的源码,还附带了详尽的操作手册,能够引导用户完成从环境准备到最终部署的一系列流程[^3]。 具体而言,在创建一个基于ROS2的视觉SLAM应用程序时,常涉及以下几个方面的工作: 1. 配置必要的依赖项服务节点; 2. 定义适合特定应用场景的地图构建策略及相关参数调整; 3. 整合传感器数据流处理逻辑; 4. 设计有效的路径规划机制以支持自主导航功能; 下面给出一段简单的Python脚本作为示例,用于启动一个基本的视觉SLAM进程: ```python import rclpy from nav2_simple_commander.robot_navigator import BasicNavigator, TaskResult def main(): rclpy.init() navigator = BasicNavigator() # Set your initial pose to the origin point (optional). initial_pose = PoseStamped() initial_pose.header.frame_id = &#39;map&#39; initial_pose.pose.position.x = 0.0 initial_pose.pose.position.y = 0.0 initial_pose.pose.orientation.z = 0.0 initial_pose.pose.orientation.w = 1.0 navigator.setInitialPose(initial_pose) # Wait for navigation to fully activate. navigator.waitUntilNav2Active() # Start visual slam process here... print(&#39;Starting visual SLAM...&#39;) if __name__ == &#39;__main__&#39;: main() ``` 这段代码展示了如何初始化一个ROS2导航器对象,并设置了起始位置信息以便后续执行更复杂的任务操作。当然这只是一个非常基础的例子,真实的视觉SLAM开发还需要考虑更多的细节技术要点。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值