前言
- 往期内容:
- 第一期:【10天速通Navigation2】(一) 框架总览和概念解释
- 第二期:【10天速通Navigation2】(二) :ROS2gazebo阿克曼小车模型搭建-gazebo_ackermann_drive等插件的配置和说明
- 第三期:【10天速通Navigation2】(三) :Cartographer建图算法配置:从仿真到实车,从原理到实现
- 本教材将贯穿nav2的全部内容,使用ROS2和C++实现一些仿真乃至实车中常见的建图和路径规划算法,例如
cartographer
,ORB-SLAM
,RRT
,hybrid-astar
。我们将注重与原理讲解和代码实现,去详细讲解每一步的配置过程和代码复现细节。 - 同理本教材默认大家有一些基础的
ROS2
和C++
的编程基础,故不对一些基础部分进行详细说明。 - 本教程使用的环境:
ROS2 humble
ubuntu 22.04 LTS
- 接下来两期我们将进行
ORB-SLAM3
的配置和原理讲解,本期我们将重点讲解ORB-SLAM3
在ROS2的环境配置,由于环境配置稍微复杂,所以这一期我们单独挑出来说明。 - 配置成功后,下图是抱着电脑使用电脑摄像头进行的
ORB-SLAM3-ROS2
的建图
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/Pangolinmkdir 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的路径 -
替换
CMakeModules
中ORB-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的使用
- 如有错误,欢迎指出!!!感谢大家的支持!!!