引言


好几天没有给各位观众老爷更新了,实在是抱歉,我也十分想念各位,今天给大家带来的是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,则可以忽略下面更换步骤。

  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-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
  1. 克隆并进行编译 — 手动方式和上面一致

克隆 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
  1. 再次进行检查opencv版本号,这次应该显示为4.4.0。
python3 -c "import cv2; print(cv2.__version__)"

2.5 安装 Boost库

  1. 下载Boost

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

在这里插入图片描述

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

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

docker cp ~/boost orb3:/
  1. 编译安装
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 修改代码

  1. 修改 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)
  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_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种容器构建方法对比与性能调优

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

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐