Docker系列(六):一站式搞定ORB_SLAM3容器化部署!ROS2环境+依赖避坑+EuRoc测试
引言
好几天没有给各位观众老爷更新了,实在是抱歉,我也十分想念各位,今天给大家带来的是ORB_SLAM3如何在Docker中运行。这几天我也在对比各大平台(包括CSDN)这方面文章,老实说,真的很多都是复制粘贴,而且还很不全面面,运行过程中经常会出现报错!
按照我这篇博文操作绝对没有问题,100%能够跑出来,不用看第二篇博文,超级全面。我准备将代码上传到Github上,方便大家能够直接复现。(及时关注我,这几天内我会修改这篇文章,将代码上传,附上链接)
这篇文章主要针对直接创建容器,运行ORB_SLAM3,适合调试并不适合移植(没有使用DockerFile)。下一篇文章就会更新如何使用DockerFile进行创建容器,并运行ORB_SLAM3。提前告知各位观众老爷!
最后,如果大家喜欢我的创作风格,请大家多多关注up主,你们的支持就是我创作最大的动力!如果各位观众老爷觉得我哪些地方需要改进,请一定在评论区告诉我,马上改!在此感谢大家了。
各位观众老爷,本文通俗易懂,快速熟悉Docker,收藏本文,关注up不迷路,后续将持续分享Docker纯干货(请观众老爷放心,绝对又干又通俗易懂)。请多多关注、收藏、评论,评论区等你~~~
文章目录
一、构建容器并安装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-reload
systemctl 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文件,自动初始化ROS
echo "source /ros_entrypoint.sh" >> ~/.bashrc
source ~/.bashrc
# 退出容器
exit
注释: 大家在构建容器的过程中,可能会出现容器内无法连接网络的问题。我这里的解决办法就是容器使用主机的网络,一定要加上 --network host --privileged=true !
1.3 进入容器,验证ROS2,运行节点
# 运行并进入容器
docker start orb3
docker exec -it orb3 /bin/bash
#验证ROS2
ros2
# 运行小乌龟
apt install qtwayland5
ros2 run turtlesim turtlesim_node
二、安装依赖 – 下面操作全部在容器中,别忘记!
本部分内容主要为运行ORB_SLAM3安装必要的依赖,部分依赖需要进行编译,这对部分观众老爷有一定的linux基础要求。
2.1 基础依赖安装
apt-get update
apt-get install python-wheel
apt-get install git g++ cmake wget nano build-essential libglew-dev libgtk2.0-dev
apt-get install libgoogle-glog-dev libgflags-dev libatlas-base-dev liblapack-dev libsuitesparse-dev
apt-get install libwayland-dev libxkbcommon-dev wayland-protocols
apt-get install libepoxy-dev libpthread-stubs0-dev
apt-get install libudev-dev pkg-config libgtk-3-dev
apt-get install software-properties-common
apt-get install ffmpeg
apt-get install libjpeg-dev libpng-dev libtiff5-dev libopenexr-dev
apt-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.git
cd Pangolin && mkdir build && cd build
cmake ..
make -j4
make install
ldconfig
(二)手动方式安装
注释: 这种方式是针对无法 git clone 的观众老爷;但是我自己在使用过程中,发现还是非常好用的,甚至我都有点不想用克隆了。
这种方式是直接去官网将其下载到主机主目录中,网址相同。
https://github.com/stevenlovegrove/Pangolin.git
解压,并命令为Pangolin,进入文件夹创建build。
cd Pangolin && mkdir build && cd build
重点!千万不要在主机进行编译,这样实际上就是安装在主机了,这里需要将文件夹复制到容器中!
这里可以打开两个新的终端,方便各位观众老爷能够直观看到变化。
# 第一个终端
docker start orb3
docker exec -it orb3 /bin/bash
ls
# 第二个终端
docker cp ~/Pangolin orb3:/
# 再次在第一个终端中查看目录,会发现新增 Pangolin
ls
对Pangolin进行编译
# 进入容器
cd Pangolin/build
cmake ..
make -j4
make install
ldconfig
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,则可以忽略下面更换步骤。
- 卸载原版本opencv
apt -y remove libopencv* python3-opencv
- 安装依赖
apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
apt install python3-dev python3-numpy
apt install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
apt install libpng-dev libopenexr-dev libtiff-dev libwebp-dev
- 克隆并进行编译 — 手动方式和上面一致
克隆 opencv4.4.0 文件夹,先修改gapi_async_test.cpp文件,防止后面进行报错!
git clone --depth 1 --branch 4.4.0 https://github.com/opencv/opencv.git
cd /opencv/modules/gapi/test/
sudo nano gapi_async_test.cpp
#将下面一行添加到头部就可以了
#include <thread>
进行编译。
cd opencv/build
cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_CXX_FLAGS="-std=c++11" \
-D OPENCV_GENERATE_PKGCONFIG=YES ..
make -j16
make install
- 再次进行检查opencv版本号,这次应该显示为4.4.0。
python3 -c "import cv2; print(cv2.__version__)"
2.5 安装 Boost库
- 下载Boost
Boost库: Boost官网,下载1.77.0版本。

-
解压并修改文件名为boost
-
将boost放到主目录下,复制到容器中
docker cp ~/boost orb3:/
- 编译安装
cd /boost
./bootstrap.sh
sudo ./b2 install
apt-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 修改代码
- 修改
ORB_SLAM3/CMakeLists.txt
# 原码
# Check C++11 or C++0x support
include(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)
- 修改
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)
- 修改
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")
- 修改
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)
- 修改
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_SLAM3
sudo 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,下载圈红圈下面的。

解压后,只保留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种容器构建方法对比与性能调优
更多推荐

所有评论(0)