前言
在运行vitfly无人机仿真数据采集时,发现在headless服务器运行虚拟显示器,采集视觉数据总会遇到问题,于是改为在本地PC上采集数据。而为了标准化,想到本地环境也可以使用docker。
实验流程
镜像构建
首先给出如下的Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| FROM nvidia/cuda:11.8.0-devel-ubuntu20.04
ENV DEBIAN_FRONTEND=noninteractive ENV TZ=Etc/UTC
RUN apt update && apt install -y curl gnupg2 lsb-release && \ sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list' && \ curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | apt-key add - && \ apt update && \ apt install -y --no-install-recommends ros-noetic-desktop-full
RUN apt-get update && apt-get install -y --no-install-recommends \ git \ python3-pip \ build-essential \ cmake \ libzmqpp-dev \ libopencv-dev \ unzip \ python3-catkin-tools \ mesa-utils \ libxcb-icccm4 \ libxcb-image0 \ libxcb-keysyms1 \ libxcb-randr0 \ libxcb-render-util0 \ libxcb-shape0 \ libxcb-xinerama0 \ libxcb-xkb1 \ libxkbcommon-x11-0 \ && rm -rf /var/lib/apt/lists/*
RUN pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple RUN pip3 install --no-cache-dir \ torch==2.4.1 \ torchvision==0.19.1 \ numpy==1.24.4 \ pandas==2.0.3 \ matplotlib==3.7.5 \ opencv-python==4.10.0.84 \ pyyaml==5.3.1 \ uniplot==0.16.2 \ ConfigArgParse==1.7 \ scipy \ tensorboard==2.14.0
RUN echo "source /opt/ros/noetic/setup.bash" >> /root/.bashrc
ENV FLIGHTMARE_PATH=/root/vitfly_ws/src/vitfly/flightmare ENV NVIDIA_DRIVER_CAPABILITIES=compute,graphics,display
SHELL ["/bin/bash", "-c"] CMD ["bash"]
|
其中的基础镜像部分,ros官方其实提供了自己的docker镜像,可以用以下方式拉取
1
| sudo docker pull osrf/ros:noetic-desktop-full
|
但是由于本实验需要使用nvidia显卡即会用到cuda,可以预见的从配置好cuda的基础镜像去下载ros,会比从配置好ros的基础镜像去下载cuda更方便。在dockerfile所在文件夹运行docker build -t vitlfy .构建镜像
本地运行
使用以下脚本来运行容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # Allow Docker containers to connect to the X server xhost +local:docker > /dev/null 2>&1
docker run -it --rm \ --gpus all \ --device=/dev/dri:/dev/dri \ --ipc=host \ -v /tmp/.X11-unix:/tmp/.X11-unix:rw \ -e DISPLAY=$DISPLAY \ -e QT_X11_NO_MITSHM=1 \ -e XAUTHORITY=/root/.Xauthority \ -v $HOME/.Xauthority:/root/.Xauthority:ro \ -e XDG_RUNTIME_DIR=/tmp \ -v path/to/vitfly_ws:/root/vitfly_ws \ --network host \ --name vitfly \ vitfly
|
这里有许多参数的作用是为了让容器中运行的程序能够在问宿主机上显示出来
服务器运行
在服务器上可以简化上述运行脚本
1 2 3 4 5 6
| docker run -d \ --gpus all \ --network host \ -v path/to/vitfly_ws:/root/vitfly_ws \ --bane vitfly vitfly
|
后续改进
尝试是否能在服务器上的容器中用虚拟显示器来采集数据,现在采集了数据还要上传到服务器还是太复杂了,希望本地仅用来运行测试。