Docker内运行ROS(melodic版本)以及使用Rviz

写在前文

Docker的安装以及介绍本文就不再累述了,安装Docker的版本任意,但是要注意的一点是你是ARM板子还是x86的板子,一般在ARM板上实现上述功能较为麻烦,如果是在ARM板子上使用Docker+ROS的话可以参考这篇文章http://wiki.ros.org/docker/Tutorials/Hardware%20Acceleration#nvidia-docker1 在ROS的官网上有教程,但是还是有些坑的,如果你使用的是Nvidia的板子,要注意CUDA的版本,以及nvidia-docker的一些操作。

安装Portainer

在正式使用之前我们先安装一个操作容器的图形界面–Portainer,这个可视化的界面其实和ROS关系并不大,但是使用起来非常的方便,可以让我们更快速的利用Docker学习ROS,而不是要完整的学习完Docker的繁杂的命令再学习ROS。
安装使用Portainer的操作如下:

sudo systemctl restart docker
sudo docker pull portainer/portainer
sudo docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name prtainer portainer/portainer

运行上述命令等待执行成功后,放行防火墙,访问本机的9000端口进入Portainer,创建账号密码之后即可登录到控制台。

arm docker 安装apt arm docker 安装ros_容器

在这里我们可以查看到运行容器内部的信息,也可以快速的删除废弃的容器及镜像。也可以构建虚拟网络实现容器间隔离。具体操作可以在网上另行搜索,本文也不再累述。

在Docker内运行ROS

在完成这项操作之前,我们首先要寻找一个合适的Docker镜像来完成这件事情
使用下面命令可以查看目前docker hub上有哪些大神上传的公共镜像:

sudo docker search ros

我们选用一个桌面环境什么的都安装完整的melodic版本的docker镜像:

sudo docker pull osrf/ros:melodic-desktop-full

接下来我们需要写一个Dockerfile,来帮我们完成一些简单的环境依赖安装工作:

mkdir rocker
cd rocker
vim Dockerfile
#######复制下面的Dockerfile
FROM osrf/ros:melodic-desktop-full
# 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 
vim

接下来使用下面的命令构建容器,注意目录所在的位置以及后面的"."不能少

docker build -t rocker .

如果上面Dockerfile的下面安装部分安装不成功的话也没有关系,删除RUN节,不报错的话跳过此节

FROM osrf/ros:melodic-desktop-full
# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES 
${NVIDIA_VISIBLE_DEVICES:-all}

ENV NVIDIA_DRIVER_CAPABILITIES 
${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics

然后后续进入容器后在安装即可,

###在运行容器后输入下面的命令,然后任意安装
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
apt update
apt install vim

构建成功容器后,接下来启动容器:

sudo xhost +local:
sudo docker run -it --device=/dev/dri --group-add video --volume=/tmp/.X11-unix:/tmp/.X11-unix  --env="DISPLAY=$DISPLAY"  --name=rocker osrf/ros:melodic-desktop-full  /bin/bash

在x86的机器上一般是可以运行成功的,我使用KALI都可以正常的运行,可见Docker的强大之处。。

运行上述命令我们即可进入到容器内部

arm docker 安装apt arm docker 安装ros_容器_02

在容器内部有一个ros_entrypoint.sh的文件,./ros_entrypoint.sh执行这个脚本

然后就可以正常使用roscore和rviz了

在使用rviz的时候我们当然需要再开启一个终端,那么对应的我们要进入启动roscore的这个容器

sudo docker ps
###找到运行的rocker容器的id
####进入容器
sudo docker exec -it f62d8436e5c2 /bin/bash
rviz

即可显示rviz的界面,原理的话实际上是linux和UNIX对X11的支持。X11也叫做X Window系统,X Window系统 (X11或X)是一种 位图 显示的 视窗系统 。它是在 Unix 和 类Unix 操作系统 ,以及 OpenVMS 上建立图形用户界面的标准工具包和协议,并可用于几乎所有已有的现代操作系统。

由于时间有限本篇不细讲Docker中的ROS与宿主机之间的通信,改天等用到的时候在写,同时也可以参考下面的一些比较好的文章进行Docker操作ROS的研究。

http://wiki.ros.org/docker/Tutorials/Hardware%20Acceleration#nvidia-docker1