前言
- 往期内容:
- 本教材将贯穿nav2的全部内容,使用ROS2和C++实现一些仿真乃至实车中常见的建图和路径规划算法,例如
cartographer,ORB-SLAM,RRT,hybrid-astar。我们将注重与原理讲解和代码实现,去详细讲解每一步的配置过程和代码复现细节。 - 同理本教材默认大家有一些基础的
ROS2和C++的编程基础,故不对一些基础部分进行详细说明。 - 本教程使用的环境:
ROS2 humbleubuntu 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是一种用于同时估计相机位置和构建环境地图的技术,广泛用于机器人、增强现实和自动驾驶车辆等领域。 -
但是值得一提的是,官网提供的ROS支持只有在
ROS1 Melodic中配置,所以这里我们选择还一个进行配置
-
这里我们选择别人开源的这个
ORB-SLAM3-ROS2进行配置
1-2 安装依赖清单
- 在正式配置之前,我们需要预先安装一些必要的依赖。
OpenCV 4.2.0cv_bridge for opencv 4.2(注意这里的cv_brigde版本一定要和OpenCV的版本一致且都为4.2.0!!!)PangolinEigen3DBoW2 and g2o(包含在ORB-SLAM3本体的安装目录下)Python:系统自带即可ROS:这个肯定有的,这里我使用的是ROS2 HumbleORB-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的路径
-
替换
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的使用
- 如有错误,欢迎指出!!!感谢大家的支持!!!



1282

被折叠的 条评论
为什么被折叠?



