在docker环境中rviz qt等可视化较为简单,原理一般是利用宿主机的界面来进行显示,话不多说,直接上干货!
1.需要镜像的启动文件(实际上就是运行docker容器的脚本,此脚本配置了一些需要的环境变量)
HERE=$(pwd)
DEV_CONTAINER="rviz_test:latest"
xhost +
XAUTH=/tmp/.docker.xauth
touch $XAUTH
if [ ! -f $XAUTH ]
then
xauth_list=$(xauth nlist :0 | sed -e 's/^..../ffff/')
if [ ! -z "$xauth_list" ]
then
echo $xauth_list | xauth -f $XAUTH nmerge -
else
touch $XAUTH
fi
chmod a+r $XAUTH
fi
docker run -it \
--env="DISPLAY=$DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--env="XAUTHORITY=$XAUTH" \
--volume="$XAUTH:$XAUTH" \
-v $HERE:/workspace:rw \
-w /workspace \
-u root \
--privileged=true --rm \
--name=rviz_test\
--runtime=nvidia \
$DEV_CONTAINER \
bash
注意:以上的脚本基本上需要的配置都涵盖了,其他镜像不需要这么复杂
2.需要运行界面的docker容器(此处以ubuntu16.04 下ros1的官方镜像作为示例,原因是这个更改的有点复杂,容易体现工作量…)
此处为具体的docker file:
FROM nvidia/opengl:1.2-glvnd-runtime-ubuntu16.04 as glvnd
FROM osrf/ros:kinetic-desktop-full
COPY --from=glvnd /usr/local/lib/x86_64-linux-gnu /usr/local/lib/x86_64-linux-gnu
COPY --from=glvnd /usr/local/lib/i386-linux-gnu /usr/local/lib/i386-linux-gnu
#COPY 10_nvidia.json /usr/local/share/glvnd/egl_vendor.d/10_nvidia.json
RUN echo '/usr/local/lib/x86_64-linux-gnu' >> /etc/ld.so.conf.d/glvnd.conf && \
echo '/usr/local/lib/i386-linux-gnu' >> /etc/ld.so.conf.d/glvnd.conf && \
ldconfig
ENV LD_LIBRARY_PATH /usr/local/lib/x86_64-linux-gnu:/usr/local/lib/i386-linux-gnu${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES \
${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES \
${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics
RUN apt-get update && \
apt-get install -y \
build-essential \
libgl1-mesa-dev \
libglew-dev \
libsdl2-dev \
libsdl2-image-dev \
libglm-dev \
libfreetype6-dev \
libglfw3-dev \
libglfw3 \
libglu1-mesa-dev \
freeglut3-dev \
dbus
3.宿主机的其他需要
我的主机需要另外安装了docker,nvidia-docker,nvidia-docker2 ,这个安装说明很多,就不一一说了
注意:另外,虽然使用了docker 环境,但是不能保证按照步骤来都可以实现,因为毕竟主机环境还有些区别,主要是把报错解决掉,就可以了。
4.其他
本人主要使用ros环境,但是ubuntu16.04基本要被淘汰,还是建议直接上ubuntu18.04+,ubuntu18.04+的ros docker官方镜像已经做好了NVIDIA的支持,因此本文中docker file都不需要,只需要第一项的启动脚本。
5.本文的参考:
https://blog.csdn.net/weixin_39837709/article/details/109099684