【docker】docker打包RoboMaster无人飞行器智能感知技术竞赛

前言

RoboMaster无人飞行器智能感知技术竞赛最后需要把全部代码和环境用docker打包为一个可以一键运行的镜像文件的压缩包,如何把上面的全部环境和代码打包挺麻烦的,记录一下这里的坑:

1.docker安装

(1)安装docker

sudo apt-get install ca-certificates gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

(2)安装nvidia-container-toolkitnvidia-docker2

该工具可以让docker容器里面也可以使用nvidia GPU

# 1.安装nvidia-container-toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
# 2.安装nvidia-docker2
sudo curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -\ndistribution=$(. /etc/os-release;echo $ID$VERSION_ID)
sudo curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
# 3.查看有无安装成功
which nvidia-docker
which nvidia-container-runtime
# 4.以后启动docker容器,只需要添加--gpus all -e NVIDIA_DRIVER_CAPABILITIES=all就可以在容器中使用GPU了,例如:
# 这里的可以使用GPU可以理解为可以直接使用外部PC的CUDA和CUDNN,如果要在docker中部署深度学习框架只需要pip安装库即可
docker run --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all your_docker_image

(3)设置用户组,消除 sudo 限制

每次执行docker命令时都要在命令前加sudoroot权限来执行命令,否则就会报错,下面为当前用户添加权限,使运行docker时不必都用sudo

sudo groupadd docker
sudo gpasswd -a $USER docker
注销账户并重新登录使新的用户组生效
sudo service docker restart

2.docker打包大疆比赛项目

大疆比赛的程序大致包括pytorch-gpu的圆环检测、ORB-SLAM3定位、主程序的ROS程序,所以主要需要配置的环境包括ROS-noetic、pytorch-gpu、ORB-SLAM3;

docker创建镜像文件image是通过写一个Dockerfile文件,在该文件中定义该镜像文件是如何build的,当你修改了Dockerfile文件后都会重新build,而环境很复杂时build一次的时间很长,所以可以每次build一部分环境,然后下一次build在上一次的基础上添加,方便调试和修改Dockerfile文件;

因此我先build一个包含了ROS-noetic和pytorch-gpu环境的镜像文件,然后在此基础上build一个编译了ORB-SLAM3的镜像,最后在该镜像上部署自己的算法:

(1)build一个包含了ROS-noetic和pytorch-gpu环境的镜像文件torch_dev

Dockerfile文件内容如下:

# FROM命令是导进来一个本地镜像文件,会以该镜像文件为基础添加新的内容
# 这里osrf/ros:noetic-desktop-full-focal镜像文件安装了ros-noetc,因此后续只需要在安装pytorch即可
FROM osrf/ros:noetic-desktop-full-focal
# ADD命令是把当前文件夹下的requirements.txt文件(该文件内容是yolo需要的依赖库)复制到docker镜像的/目录下
ADD requirements.txt /
# 启动超级管理员,后续的apt就不需要加sudo了
USER root
# RUN命令相当于在docker终端中运行指定的命令
# 安装ros相关的库
# 注意apt安装库要加上 -y ,-y的意思是如果安装时问你yes/no会直接yes,否则docker build会报错,修改参考本文件的ORB3安装部分内容
RUN apt update && apt install -y python3-catkin-tools ros-noetic-geographic-msgs \
 ros-noetic-tf2-sensor-msgs ros-noetic-tf2-geometry-msgs ros-noetic-image-transport \
 net-tools
# 安装python3和pip3
RUN apt install python3  python3-pip -y
# 安装torch-gpu
RUN pip3 install torch==1.10.0+cu111 torchvision==0.11.0+cu111 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html
# 安装yolo的依赖库
RUN pip3 install --index-url https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt

然后依据Dockerfile文件build生成一个镜像文件:

# -t torch_dev意思是build出来的image叫torch_dev,.表示Dockerfile文件路径在当前路径下
docker build -t torch_dev .

build成功后,可以查看当前电脑的全部images,也可以删除不要的:

# 查看当前电脑的全部images
docker images
# 删除image
docker image rm IMAGE_ID

想要启动镜像文件torch_dev后,让pytorch可以调用本地的GPU,需要安装前面的nvidia-container-toolkitnvidia-docker2,然后添加--gpus all -e NVIDIA_DRIVER_CAPABILITIES=all,例如启动镜像文件torch_dev:(这里的调用本地GPU需要本地已经配置好了nvidia驱动、CUDA、CUDNN)

docker run -it --net host --name test_dev --rm --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all torch_dev

(2)在torch_dev镜像文件基础上,添加ORB-SLAM3的环境,build出新的镜像文件torch_dev/orb3_dev:

Dockerfile文件内容如下:

# 把前面的镜像文件torch_dev导进来
FROM torch_dev
# 先把ORB3的源码和依赖库都先放到Dockerfile同目录下,然后ADD命令复制到docker镜像中
ADD eigen-3.4.0 /eigen-3.4.0
ADD ORB_SLAM3 /ORB_SLAM3
ADD Pangolin /Pangolin

USER root

ENV ROS_DISTRO noetic

# dockerfile里面每一个RUN相当于开一个新的终端运行,并不是在上一个RUN的命令后继续执行,所以多个串行命令就用一个RUN + && 完成

# 1.安装Eigen库
RUN cd /eigen-3.4.0 && mkdir build && cd build && cmake .. && make install

# 2.安装Pangolin
RUN cd /Pangolin && mkdir build && cd build && cmake .. && make && make install

# 3.安装ORBSLAM3,注意需要修改ORB3的代码,取消掉GUI轨迹界面的显示,否则报错
RUN cd /ORB_SLAM3 && chmod +x build.sh && ./build.sh 
RUN . /opt/ros/${ROS_DISTRO}/setup.sh  &&  cd /ORB_SLAM3 && export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/ORB_SLAM3/Examples &&  chmod +x build_ros.sh && ./build_ros.sh

然后依据Dockerfile文件build生成一个镜像文件:

# -t torch_dev意思是build出来的image叫torch_dev,.表示Dockerfile文件路径在当前路径下
docker build -t torch_dev/orb3_dev .

(2.2)补充,如果SLAM用的是vinsfusion,则参考如下:

Dockerfile文件内容如下:

FROM torch_dev

# 在torch_dev基础上,创建一个包含vinsfusion环境的镜像文件,命名为torch_dev/vins_dev

ADD eigen-3.4.0 /eigen-3.4.0
ADD ceres-solver /ceres-solver
ADD src /basic_dev/src/


USER root

ENV ROS_DISTRO noetic
# dockerfile里面每一个RUN相当于开一个新的终端运行,并不是在上一个RUN的命令后继续执行,所以多个串行命令就用一个RUN + && 完成

# 1.安装Eigen库
RUN cd /eigen-3.4.0 && mkdir build && cd build && cmake .. && make install

# 2.安装Ceres
RUN apt install -y liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libeigen3-dev libgtest-dev
RUN cd /ceres-solver && mkdir build && cd build && cmake .. && make -j10 && make install 


# 3.安装vins,注意ros noetic安装的是cv4,而vins需要cv3编译,因此需要修改vins中的代码,修改参考:
# https://blog.csdn.net/weixin_41404597/article/details/132684686#t8
RUN . /opt/ros/${ROS_DISTRO}/setup.sh  && cd /basic_dev/ && catkin build

(3)在torch_dev/orb3_dev镜像文件基础上,部署自己的ROS项目:

Dockerfile文件内容如下:

FROM torch_dev/orb3_dev

ADD src /basic_dev/src/
ADD setup.bash /

RUN chmod +x /setup.bash
RUN chmod +x /basic_dev/src/basic_dev/scripts/test.py
USER root

ENV ROS_DISTRO noetic
# 编译ros项目都需要先运行一下noetic的setup.sh
RUN . /opt/ros/${ROS_DISTRO}/setup.sh  && cd /basic_dev/ && catkin build airsim_ros && catkin build 
# ENTRYPOINT [ "/setup.bash" ]是镜像文件启动后自动运行/setup.bash文件
ENTRYPOINT [ "/setup.bash" ]

setup.bash文件写了要如何启动你的程序,内容如下:

#!/bin/bash
cd /basic_dev
source devel/setup.bash
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/ORB_SLAM3/Examples
# 注意bash文件中的命令是串行运行,只有上一个命令结束了才可以执行下一个命令,因此运行ros程序这样不会停的程序,需要多进程运行,
# 方法就是在这些命令之间用&连接,那么会同时运行这些命令
rosrun ORB_SLAM3 Stereo /ORB_SLAM3/Vocabulary/ORBvoc.txt /ORB_SLAM3/Examples_old/Stereo/DJ.yaml false /camera/left/image_raw:=/airsim_node/drone_1/front_left/Scene /camera/right/image_raw:=/airsim_node/drone_1/front_right/Scene /orbslam3/vision_pose/pose:=/orbslam3/vision_pose/pose &
rosrun my_utils camera_transform &
rosrun global_fusion global_fusion_node &
rosrun my_utils pd_control &
rosrun basic_dev circle_pub.py &
rosrun basic_dev dynamic_circle_test.py &
roslaunch drone_racing robomaster_racing.launch 

然后依据Dockerfile文件build生成一个镜像文件:

# 生成最终的可以直接运行程序的镜像文件
docker build -t program_dev .
# 运行该镜像文件,会直接执行程序
docker run -it --net host --name test_dev --rm --gpus all -e NVIDIA_DRIVER_CAPABILITIES=all program_dev
# 如果镜像文件运行没有问题就可以导出为压缩包上传了
docker image save test_dev:latest > test.tar
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值