> 技术文档 > Docker系列(六):一站式搞定ORB_SLAM3容器化部署!ROS2环境+依赖避坑+EuRoc测试_orb-slam3 ros2

Docker系列(六):一站式搞定ORB_SLAM3容器化部署!ROS2环境+依赖避坑+EuRoc测试_orb-slam3 ros2


引言

好几天没有给各位观众老爷更新了,实在是抱歉,我也十分想念各位,今天给大家带来的是ORB_SLAM3如何在Docker中运行。这几天我也在对比各大平台(包括CSDN)这方面文章,老实说,真的很多都是复制粘贴,而且还很不全面面,运行过程中经常会出现报错!

按照我这篇博文操作绝对没有问题,100%能够跑出来,不用看第二篇博文,超级全面。我准备将代码上传到Github上,方便大家能够直接复现。(及时关注我,这几天内我会修改这篇文章,将代码上传,附上链接)

这篇文章主要针对直接创建容器,运行ORB_SLAM3,适合调试并不适合移植(没有使用DockerFile)。下一篇文章就会更新如何使用DockerFile进行创建容器,并运行ORB_SLAM3。提前告知各位观众老爷!

最后,如果大家喜欢我的创作风格,请大家多多关注up主,你们的支持就是我创作最大的动力!如果各位观众老爷觉得我哪些地方需要改进,请一定在评论区告诉我,马上改!在此感谢大家了。

各位观众老爷,本文通俗易懂,快速熟悉Docker,收藏本文,关注up不迷路,后续将持续分享Docker纯干货(请观众老爷放心,绝对又干又通俗易懂)。请多多关注、收藏、评论,评论区等你~~~


文章目录

  • 引言
  • 一、构建容器并安装ROS2
    • 1.1 拉取ROS2镜像
    • 1.2 构建并启动容器
    • 1.3 进入容器,验证ROS2,运行节点
  • 二、安装依赖 -- 下面操作全部在容器中,别忘记!
    • 2.1 基础依赖安装
    • 2.2 安装 Eigen3
    • 2.3 安装 Pangolin
    • 2.4 安装 opencv
    • 2.5 安装 Boost库
    • 2.6 安装 DBoW2 和 g2o
  • 三、安装ORB_SLAM3
    • 3.1 下载ORB_SLAM3
    • 3.2 修改代码
    • 3.3 编译ORB_SLAM3
  • 四、运行ORB_SLAM3并使用EuRoc数据集进行验证
    • 4.1 新建测试集
    • 4.2 下载EuRoc数据集
    • 4.3 运行数据集
  • 往期回顾 --- 往期专栏 和 系列博文


正 文


一、构建容器并安装ROS2

这部分工作内容主要是搭建容器,并在容器中安装ROS,虽然ORB_SLAM3可以在无ROS条件下运行,但是涉及到使用ROS通信,没有安装ROS肯定就无法运行下去。

如果不知道如何安装docker,请参考前面的文章 Docker系列(一):从依赖冲突到标准化交付!容器原理解析×SLAM跨平台实战×10分钟极速部署指南。下面的步骤默认大家已经安装好docker。

1.1 拉取ROS2镜像

docker pull osrf/ros:humble-desktop-full

这里出现问题,说明docker配置文件有问题,可以使用我目前正在用的配置,修改 /etc/docker/daemon.json ,具体操作如下。

# 修改配置sudo nano /etc/docker/daemon.json{ \"registry-mirrors\": [ \"https://docker.xuanyuan.me\" ]}# 重启生效systemctl daemon-reloadsystemctl restart docker

1.2 构建并启动容器

# 设置用户的主机允许任何主机或用户访问其 X 服务器xhost +# 创建容器并启动docker run -it --network host --privileged=true \\  -e XDG_RUNTIME_DIR=/tmp \\  -e WAYLAND_DISPLAY=$WAYLAND_DISPLAY \\  -v $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:/tmp/$WAYLAND_DISPLAY \\  -e QT_QPA_PLATFORM=wayland \\  --name orb3 \\  osrf/ros:humble-desktop-full \\  /bin/bash# 此时已经进入容器,设置.bashrc文件,自动初始化ROSecho \"source /ros_entrypoint.sh\" >> ~/.bashrcsource ~/.bashrc# 退出容器exit

注释: 大家在构建容器的过程中,可能会出现容器内无法连接网络的问题。我这里的解决办法就是容器使用主机的网络,一定要加上 --network host --privileged=true !

1.3 进入容器,验证ROS2,运行节点

# 运行并进入容器docker start orb3docker exec -it orb3 /bin/bash#验证ROS2ros2# 运行小乌龟apt install qtwayland5ros2 run turtlesim turtlesim_node

二、安装依赖 – 下面操作全部在容器中,别忘记!

本部分内容主要为运行ORB_SLAM3安装必要的依赖,部分依赖需要进行编译,这对部分观众老爷有一定的linux基础要求。

2.1 基础依赖安装

apt-get updateapt-get install python-wheelapt-get install git g++ cmake wget nano build-essential libglew-dev libgtk2.0-devapt-get install libgoogle-glog-dev libgflags-dev libatlas-base-dev liblapack-dev libsuitesparse-devapt-get install libwayland-dev libxkbcommon-dev wayland-protocolsapt-get install libepoxy-dev libpthread-stubs0-devapt-get install libudev-dev pkg-config libgtk-3-devapt-get install software-properties-commonapt-get install ffmpegapt-get install libjpeg-dev libpng-dev libtiff5-dev libopenexr-devapt-get install libboost-serialization-dev

注释: 不要有漏项!会影响后续操作!

2.2 安装 Eigen3

apt-get install libeigen3-dev

注释: 一定要先安装Eigen3,否则Pangolin无法编译成功!

2.3 安装 Pangolin

(一)克隆方式安装

git clone https://github.com/stevenlovegrove/Pangolin.gitcd Pangolin && mkdir build && cd buildcmake ..make -j4make installldconfig

(二)手动方式安装

注释: 这种方式是针对无法 git clone 的观众老爷;但是我自己在使用过程中,发现还是非常好用的,甚至我都有点不想用克隆了。

这种方式是直接去官网将其下载到主机主目录中,网址相同。

https://github.com/stevenlovegrove/Pangolin.git

解压,并命令为Pangolin,进入文件夹创建build。

cd Pangolin && mkdir build && cd build

重点!千万不要在主机进行编译,这样实际上就是安装在主机了,这里需要将文件夹复制到容器中!

这里可以打开两个新的终端,方便各位观众老爷能够直观看到变化。

# 第一个终端docker start orb3docker exec -it orb3 /bin/bashls# 第二个终端docker cp ~/Pangolin orb3:/# 再次在第一个终端中查看目录,会发现新增 Pangolinls

对Pangolin进行编译

# 进入容器cd Pangolin/buildcmake ..make -j4make installldconfig

2.4 安装 opencv

注释: 这里我们需要注意,实际上我们的容器中应该已经安装opencv,但是ORB_SLAM3算法对opencv版本有要求,所以不是 opencv3.2.0或4.4.0这两个版本,只能进行更换!

检查容器内opencv版本:

python3 -c \"import cv2; print(cv2.__version__)\"# 这里输出的应该是版本号,如果不是4.4.0或者3.2.0,需要进行更换。

如果opencv版本为4.4.0,则可以忽略下面更换步骤。

  1. 卸载原版本opencv
apt -y remove libopencv* python3-opencv
  1. 安装依赖
apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-devapt install python3-dev python3-numpyapt install libgstreamer-plugins-base1.0-dev libgstreamer1.0-devapt install libpng-dev libopenexr-dev libtiff-dev libwebp-dev
  1. 克隆并进行编译 — 手动方式和上面一致

克隆 opencv4.4.0 文件夹,先修改gapi_async_test.cpp文件,防止后面进行报错!

git clone --depth 1 --branch 4.4.0 https://github.com/opencv/opencv.gitcd /opencv/modules/gapi/test/sudo nano gapi_async_test.cpp#将下面一行添加到头部就可以了#include 

进行编译。

cd opencv/buildcmake -D CMAKE_BUILD_TYPE=Release \\ -D CMAKE_CXX_FLAGS=\"-std=c++11\" \\ -D OPENCV_GENERATE_PKGCONFIG=YES ..make -j16 make install
  1. 再次进行检查opencv版本号,这次应该显示为4.4.0。
python3 -c \"import cv2; print(cv2.__version__)\"

2.5 安装 Boost库

  1. 下载Boost

Boost库: Boost官网,下载1.77.0版本。

Docker系列(六):一站式搞定ORB_SLAM3容器化部署!ROS2环境+依赖避坑+EuRoc测试_orb-slam3 ros2

  1. 解压并修改文件名为boost

  2. 将boost放到主目录下,复制到容器中

docker cp ~/boost orb3:/
  1. 编译安装
cd /boost./bootstrap.shsudo ./b2 installapt-get install libssl-dev

2.6 安装 DBoW2 和 g2o

这两个包不需要下载,ORB_SLAM3自带这两个包,后面在进行编译和安装。

三、安装ORB_SLAM3

这部分工作内容相对比较简单,主要就是修改文件夹中部分文件,仔细点就没什么大问题。建议先克隆到本地,修改完后再复制粘贴到容器内,需要修改的文件还是很多的,我这里使用的就是手动。

3.1 下载ORB_SLAM3

https://github.com/UZ-SLAMLab/ORB_SLAM3.git

注释: 克隆的命令,这里也给各位观众老爷贴出来了,可供使用。

git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git

3.2 修改代码

  1. 修改 ORB_SLAM3/CMakeLists.txt
# 原码# Check C++11 or C++0x supportinclude(CheckCXXCompilerFlag)CHECK_CXX_COMPILER_FLAG(\"-std=c++14\" COMPILER_SUPPORTS_CXX11)CHECK_CXX_COMPILER_FLAG(\"-std=c++0x\" COMPILER_SUPPORTS_CXX0X)if(COMPILER_SUPPORTS_CXX11) set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++14\") add_definitions(-DCOMPILEDWITHC11) message(STATUS \"Using flag -std=c++14.\")elseif(COMPILER_SUPPORTS_CXX0X) set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++0x\") add_definitions(-DCOMPILEDWITHC0X) message(STATUS \"Using flag -std=c++0x.\")else() message(FATAL_ERROR \"The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.\")endif()# 修改为 set(CMAKE_CXX_STANDARD 14)set(CMAKE_CXX_EXTENSIONS OFF)add_definitions(-DCOMPILEDWITHC11)# 原码find_package(Eigen3 3.1.0 REQUIRED)#修改为find_package(Eigen3 REQUIRED)
  1. 修改 ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt
# 原码set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall -O3 -march=native \")set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall -O3 -march=native \")# 修改为set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall -O3\")set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall -O3\")# 原码find_package(Eigen3 3.1.0 REQUIRED)#修改为find_package(Eigen3 REQUIRED)# 原码 set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -std=c++11\")# 修改为  set(CMAKE_CXX_STANDARD 14)# 原码find_package(OpenCV 3.0 QUIET)# 修改为find_package(OpenCV 4.4.0 REQUIRED)
  1. 修改 ORB_SLAM3/Thirdparty/DBoW2 /CMakeLists.txt
# 原码set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall -O3 -march=native \")set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall -O3 -march=native \")# 修改为set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall -O3\")set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall -O3\")
  1. 修改 ORB_SLAM3/Thirdparty/g2o/CMakeLists.txt
# 原码set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall -O3 -march=native \")set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall -O3 -march=native \")# 修改为set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall -O3\")set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wall -O3\")# 原码find_package(Eigen3 3.1.0 REQUIRED)# 修改为find_package(Eigen3 REQUIRED)
  1. 修改 Examples/Monocular/mono_euroc.cc
# 原码ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR, false);# 修改为ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR, true);

3.3 编译ORB_SLAM3

将修改好的ORB_SLAM3文件夹移到容器中。

docker cp ~/ORB_SLAM3 orb3:/

进行编译。

cd ORB_SLAM3sudo nano build.sh# 将make -j或make -j4全部修改为make -j2,避免编译失败,电脑核数多的,可忽略此步骤。chmod +x build.sh./build.sh

四、运行ORB_SLAM3并使用EuRoc数据集进行验证

4.1 新建测试集

在主机的主目录中新建测试集,路径为 datasets/MH01/

4.2 下载EuRoc数据集

EuRoc官网: EuRoc,下载圈红圈下面的。

Docker系列(六):一站式搞定ORB_SLAM3容器化部署!ROS2环境+依赖避坑+EuRoc测试_orb-slam3 ros2

解压后,只保留mav0文件夹,其余删除。

将mav0移动到 datasets/MH01/ 下,故 datasets/MH01/mav0

移动到容器中ORB_SLAM3路径下。

docker cp ~/datasets orb3:/ORB_SLAM3/

4.3 运行数据集

./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml ./datasets/MH01 ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt

反复运行都是没有问题的,结果会进行覆盖。

由于CSDN上传视频真的很不方便,我就上传在bilibili上了,运行结果如下视频。

基于EuRoc数据集运行ORB

如果大家在安装过程中,有哪些问题,欢迎在评论区进行提问!


结 束 语


能够看到这里的观众老爷,无疑是对up的最大肯定和支持,在此恳求各位观众老爷能够多多点赞、收藏和关注。在这个合集中,未来将持续给大家分享关于Docker的多种常见开发实用操作。未来也将继续分享Docker、conda、ROS等等各种实用干货。感谢大家支持!


往期回顾 — 往期专栏 和 系列博文

往期专栏: Ubuntu系列

本期专栏: Docker系列

Docker系列(一):从依赖冲突到标准化交付!容器原理解析×SLAM跨平台实战×10分钟极速部署指南

Docker系列(二):从零构建容器环境|服务自启配置×镜像源加速×免sudo提权×避坑手册

Docker系列(三):深度剖析Dockerfile与图形化容器实战 — 3种容器构建方法对比与性能调优

Docker系列(四):容器操作全栈技术指南 — 从入门到生产级管控

Docker系列(五):ROS容器化三叉戟 — 从X11、Wayland到DockerFile实战全解析