1.4 在Linux容器中运行ROS

随着虚拟化技术的快速发展,各种类型的容器技术开始崭露头角。目前,其中的Docker和LXC技术占据了Linux操作系统虚拟机市场的最大份额。

1.4.1 准备工作

LXC(Linux Containers)是一种可以在单个主机上创建和运行多个隔离Linux虚拟环境(VE)的操作系统级虚拟技术。这些隔离级别(level)或者Container可以用来实现特定应用程序的沙箱或者模拟出全新的主机。LXC使用了Linux 2.6.24版本中引入的控制组(cgroup)功能,它允许主机CPU可以更好地将内存分配给称为工作区(namespace)的隔离级别。

Docker之前一直被称作dotCloud,它最开始只是作为一个业余项目开发出来的,在2013年开始对外开源。实际上它是LXC功能的扩展。这是通过使用一个高等级的API实现的,它提供了一个可以独立运行进程的轻量级虚拟化解决方案。Docker是使用Go语言开发出来的,它利用了LXC、cgroup和Linux内核的功能。由于Docker Container是基于LXC实现的,所以它并不包括单独的操作系统。相反它要依赖操作系统自身的功能(例如底层设备提供的功能)。因此Docker是一个可以移植的容器引擎,你可以将虚拟容器中的应用程序及其依赖项打包复制到其他Linux服务器上运行。

注意,Linux VE与虚拟机(VM)并不相同。

1.4.2 如何完成

由于Docker是一个有助于应用程序和完整系统分发的开放平台,并且它基于LXC,所以我们将研究如何使用ROS Docker镜像,以及如何将复杂的应用程序与完整的系统集成为一个独立的镜像进行分发。

1.安装Docker

在安装Docker之前,我们需要下载更新的包文件:

$ sudo apt-get update

使用下面的命令向系统添加官方DOCK软件库的GPG密钥:

$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 –recv -keys 58118E89F3A912897C070ADBF76221572C52609D

2.将DOCK软件库添加到APT源中

对于Ubuntu 16.04,需要执行以下命令:

$ echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo
tee /etc/apt/sources.list.d/docker.list

对于Ubuntu 18.04,需要执行以下命令:

$ echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo
tee /etc/apt/sources.list.d/docker.list

使用新添加软件库中的Docker包来更新功能包数据库,使用的命令如下所示:

$ sudo apt-get update

接下来确保我们是从Docker软件库,而不是从默认的Ubuntu软件库完成下载:

$ apt-cache policy docker-engine

注意此时如果还没有安装docker-engine,可以使用下面的命令来安装它:

$ sudo apt-get install -y docker-engine

检查Docker是否启动:

$ sudo systemctl status docker

使用以下命令来启动Docker服务:

$ sudo service docker start
$ docker

我们可以使用docker命令的search子命令在Docker Hub中查找可用的镜像。

$ sudo docker search Ubuntu

最后使用下面的命令来运行Docker container:

$ sudo docker run -it hello-world

3.获取和使用ROS Docker镜像

Docker镜像是类似于虚拟机中设置完毕的操作系统的快照文件。有些服务器中提供了镜像,用户只需要执行下载操作即可。主服务器是Docker Hub,从这里你可以找到不同类型系统和经过各种配置的Docker镜像。

好了!在官方的ROS软件库中列出了所有的ROS Docker镜像。我们将使用ROS Kinetic镜像,下面给出了获取它的命令:

$ sudo docker pull ros
$ sudo docker pull kinetic-ros-core
$ sudo docker pull kinetic-ros-base
$ sudo docker pull kinetic-robot
$ sudo docker pull kinetic-perception

我们使用相同的方法也可以获取ROS Melodic镜像,下面给出了获取它的命令:

$ sudo docker pull ros
$ sudo docker pull melodic-ros-core
$ sudo docker pull melodic-ros-base
$ sudo docker pull melodic-robot
$ sudo docker pull melodic-perception

成功下载容器之后,我们可以使用下面的命令来运行它:

$ docker run -it ros

这就像进入到Docker container的会话中一样。前面的命令将从主镜像中创建新的container,这个主镜像中已经安装好了完整的Ubuntu操作系统和ROS Kinetic。这样我们就能像使用常规系统一样,安装额外的包和运行ROS节点。

下面的命令可以列出所有可用的Docker containers以及它们镜像的源:

$ sudo docker ps

恭喜你现在已经完成了Docker的安装。为了在Container中建立ROS环境以便开始使用ROS,我们必须运行以下命令(ros_version: kinetic/melodic):

$ source /opt/ros/<ros_version>/setup.bash

虽然运行docker应该已经足够了,但是我们可以使用SSH通过名称或者ID来远程控制一个运行的Docker containers,就像控制一个普通设备一样。

$ sudo docker attach 665b4a1e17b6 #by ID ...OR
$ sudo docker attach loving_heisenberg #by Name

如果使用attach命令的话,那么我们只能使用shell的一个实例。但是如果我们想在containers中打开新的命令行(shell),并且可以启动新的进程,就需要运行以下的几条命令:

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID ...OR
$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name

我们在另外的一个命令行(shell)中使用docker stop也可以结束Docker containers,而且它们也可以使用docker rm命令来删除。

1.4.3 参考资料

本书附带了一个可以正常工作的Docker镜像,它基于ROS Kinetic建立并包含了所有的实例代码。在GitHub软件库可以找到下载和安装它的说明文件,在那里还可以找到其他的代码。