# 每天一篇论文 253/365 ROSLab:在JupyterLab上基于Docker运行ROS

ROSLab:Sharing ROS Code Interactively With Docker and JupyterLab By Enric Cervera and Angel P. del Pobil

[原文](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8762218)

与Docker和JupyterLab交互共享ROS代码

机器人操作系统(ROS)的成功和开源思想的进步,从根本上改变和改善了机器人社区成员之间共享软件的经验。然而,缺乏一个适合机器人技术中持续集成和验证的工作流程,这对开发可由独立用户运行以进行测试和重用的软件构成了重大障碍。一个典型的情况是,开发人员生成一个新的ros包,并通过一个公共源代码存储库共享它,用户可以从中下载和执行软件。但是,由于用户运行不同的ros发行版、包依赖项的不兼容版本和第三方库,执行环境可能不兼容。另一个障碍是缺乏运行软件的适当文档。

几乎没有记录大多数共享代码,因为它主要是为研究小组内部使用而开发的。 开发人员是机器人技术专家,但不一定是软件工程专家。由于开发人员对软件的熟悉,因此某些配置或执行步骤可能无法在文档中很好地说明。因此,需要一个完整,明确的可运行环境来测试可公开使用的ROS代码,以确保程序正确运行,而不管特定的主机配置如何。 这样的环境应该与ROS开发的典型工作流程兼容,以避免过程中的任何额外负担。

最近,事实证明,Docker是实现更好,可重复和可再现的环境设置的有用框架[1]。 Docker是Linux容器的实现; 换句话说,它是一种OS级虚拟化方法,用于在控制主机上运行隔离的系统。 它类似于虚拟机,但开销较少。尽管Docker逐渐流行,但它对机器人技术社区的许多用户并不熟悉。 在本文中,我们旨在通过引入ROSLab来降低采用Docker的障碍,ROSLab是一个结合了Docker和JupyterLab的框架,该框架将代码存储库转变为可重现的,可运行的软件包。 ROSLab使用开发人员环境中的简单规范自动生成Docker映像。

使用jupyterlab的动机是需要将文档与软件集成在一起,因为有一种趋势,即实验代码几乎没有解释性。jupyterlab基于笔记本电脑、包含可执行代码的交互式文档和叙述性文本,因此允许开发人员和用户显式共享运行软件的命令。

在之前的研究中,我们发现不完整或模棱两可的文档是机器人代码重用的一个重要障碍[2]。图1演示了代码共享过程以及如何使用RosLab扩展它。在开发了一个用ros编程的新的研究实验之后,用户通常可以访问一个公共代码库(例如github),其中包含一个或多个ros包、一个带有代码描述的文档文件(readme)以及一些构建和运行代码的说明。感兴趣的没有经验的用户
测试新的发展面临两大困难。首先,用户主机中的ros分布可能与开发人员的不同,无论是较新的(使用未预先准备好的包)还是较旧的(缺少功能),都会导致包和库依赖关系可能会打破所谓的依赖地狱。第二个问题是文件可能不完整或不一致。可能缺少有关第三方库的说明,或者可能未包括某些配置和执行步骤。
在这里插入图片描述
这些组成是镜像。开发人员无需编写完整的dockerfile,只需指定运行映像所需的镜像,即ros分发、构建方法和库依赖项。
这些组件在另一个标记语言(yaml)文件中描述,该文件被处理以生成Dockerfile,用于生成镜像的脚本,以及另一个用于运行image的脚本。此外,roslab还处理git存储库的自述文件,以生成jupyterlab笔记本,其中的命令片段将自动分离为可执行单元。这个创建Docker镜像的过程是通用的,可以扩展到其他软件框架,但是我们最初关注的是ROS,因为它在机器人领域的广泛应用。不过,目的地只需安装Docker和Web浏览器即可运行该软件。不需要本地ROS安装;即使存在,也不会干扰ROSLAB DOCKER映像。

 name: nanomap_ros
 distro: kinetic
 build: catkin_make

在这里插入图片描述

packages:
- libeigen3-dev
- ros-kinetic-cv-bridge
- ros-kinetic-image-transport
- liborocos-kdl-dev
- ros-kinetic-tf2-sensor-msgs

要处理yaml文件,必须在主机中安装docker。roslab处理步骤用命令执行

docker run --rm -v <DIR>:/project:rw
roslab/create

dir>是包含存储yaml文件的git存储库的本地文件夹的完整路径。该命令在同一目录中生成以下文件:
●dockerfile:基于请求的ros分布,docker映像的完整描述,以及安装所有第三方依赖项和构建存储库代码的说明
●docker_build.sh:调用docker生成镜像的脚本文件
●docker_run.sh:调用docker运行镜像并启动jupyterlab服务器的脚本文件。接下来,构建脚本在终端中运行,并构建实际的docker映像。最后,会触发运行脚本,并使用在本地主机中启动的jupyterlab服务器执行映像,用户可以通过在浏览器(http://local host:8888/lab/tree/readme.ipynb)中打开统一资源定位器(url)来连接到该服务器。图2描述了在处理过的存储库的readme笔记本中执行测试命令后的浏览器窗口。值得注意的是,必须添加change directory命令才能转换到正确的工作目录;否则,该命令将产生执行错误。

另一篇icra论文[4]中的一个更复杂的例子包括使用图形处理单元(gpu)-为3d应用程序加速运行时环境,从其源安装包,以及安装用于访问数据集文件的主机文件夹。可在https://github.com/icra-2018/vins mono上获得。

name: vins-mono
distro: kinetic
build: catkin_make
runtime: nvidia
volume:
- host_path:/Data/EuRoC_MAV_Dataset
 container_path:/EuRoC_MAV_Dataset
 options: ro
packages:
- ros-kinetic-cv-bridge
- - ros-kinetic-tf
- ros-kinetic-message-filters
- ros-kinetic-image-transport
source:
- name: ceres-solver
repo: https://github.com/ceressolver/ceres-solver.git
depends:
 - libgoogle-glog-dev
 - libatlas-base-dev
 - libeigen3-dev
 - libsuitesparse-dev
build: cmake

来自存储库中的自述文件和第三方库ceres的主页。执行的结果如图3所示,它描述了浏览器窗口和由笔记本中的一个命令启动的ros可视化(rviz)工具。在最后一个同样基于icra会议论文[5]的示例中,可视化工具不是rviz,而是一个自定义应用程序,这表明roslab不会干扰包工作流。它可以在https://github.com/icra-2018/fast_change_detection上找到,yaml文件是

name: fast-change-detection
distro: kinetic
build: catkin_build
runtime: nvidia
packages:
- libeigen3-dev
- - libboost-all-dev
- qtbase5-dev
- libglew-dev
- libopencv-dev
source:
- name: glow
repo: https://github.com/jbehley/glow.git
 depends:
 build: catkin_build

示例的输出如图4所示。基于本文中给出的例子和机器人软件的其他库中,我们提出了在现有的Git存储库中编写ROSLAY-YAML文件的以下准则:1)定义ROS分布(动力学、月历或旋律)。
2)选择ROS包的构建方法(catkin_u make、catkin_u build)。
3)如果需要3D图形输出,请激活NVIDIA运行时。
4)添加软件依赖项。
a)尽可能使用二进制软件包。
b)在她的WISE中,使用源代码存储库。
在这种情况下,除了存储库的url之外,还应该指定其依赖项和构建方法。运行Docker容器所需的磁盘空间可能很大,特别是在图形环境中。但是,软件层可以在不同的Docker之间共享
在这里插入图片描述

在这里插入图片描述
示例的输出如图4所示。基于本文中给出的例子和机器人软件的其他库中,我们提出了在现有的Git存储库中编写ROSLAY-YAML文件的以下准则:1)定义ROS分布(动力学、月历或旋律)。
2)选择ROS包的构建方法(catkin_u make、catkin_u build)。
3)如果需要3D图形输出,请激活NVIDIA运行时。
4)添加软件依赖项。
a)尽可能使用二进制软件包。
b)在她的WISE中,使用源代码存储库。
在这种情况下,除了存储库的url之外,还应该指定其依赖项和构建方法。运行Docker容器所需的磁盘空间可能很大,特别是在图形环境中。但是,软件层可以在不同的docker镜像之间共享,从而减少系统中使用的磁盘空间总量。
表1总结了三个示例的Docker镜像的大小以及Roslab基础镜像的大小。“标签”栏指的是Docker标签,表示Docker镜像的版本或变体的一些信息(“最新”是指示例的最新构建版本;对于RosLab,有两个版本:带有或不带有图形开放图形库运行时环境的Ros Kinetic)。
在这里插入图片描述
对于每个镜像,都有一个共享部分和一个唯一部分。共享层只存储在磁盘上一次,因此节省了大量空间。在我们的例子中,总大小是5.131 GB+4.471 GB+2.517 GB=12.119 GB,但是由于Docker的共享特性,它减少到3.742 GB+1.474 GB+1.39 GB+0.729 GB+1.042 GB=8.377 GB。如果安装了额外的存储库(基于相同的roslab镜像),则节省的成本将更加显著。roslab镜像的大小与官方ros镜像的大小非常相似,并添加了jupyterlab软件,与ros相比,jupyterlab软件非常小。Kineticros Base Xenial映像已经占用了1.191 GB,开源机器人基金会/Ros KineticDesktop全映像的大小达到了3.367 GB。首次使用Roslab镜像时,必须从Docker Cloud(https://hub.docker.com/r/Roslab/Roslab)下载到本地计算机。镜像被压缩,因此它们的大小分别为511和1μg,分别为NVIDIA版本的动力学和动力学,约为未压缩大小的三分之一。下载时间显然取决于用户的互联网连接。对于一个典型的100 Mb/s线,需要大约1分钟30秒来下载和解压缩ROSLAP动态镜像和3分钟50秒的动态NVIDIA镜像。构建存储库所需的其余时间与以本机方式构建的时间相同。下载额外的包并编译源代码在Docker上的运行速度几乎与在本机系统中相同。

使用jupyterlab的主要好处是文档和执行之间的紧密联系。自述文件中记录的代码实际上是在同一个笔记本中执行的。另一种方法是打开Docker映像中的一个或多个终端,将自述文件中的代码示例复制并粘贴到终端,然后执行代码。这个过程很容易出错,如果文档没有用测试中得到的更改进行更新,或者如果开发人员忘记在终端中记录一个步骤,则可能会产生不一致。jupyterlab自述笔记本始终包含最新版本的可执行命令,只需重新启动笔记本并运行所有代码单元即可轻松测试这些命令。没有错误是保证代码对于同一个docker镜像的任何用户都能以类似的方式运行。此外,使用Docker,无论用户的计算机上安装了哪个操作系统,软件都可以运行。它还将运行环境与本地系统隔离,避免与任何预安装的库或第三方软件发生冲突。docker映像包含开发人员定义的所有必要依赖项。

Git存储库的自述文件中的可执行命令应根据标记规范(https://github.github.com/gfm/)编写,例如,在代码块前后用三个倒勾``隔开,或用四个空格缩进。ros以外的计算环境在可重复性方面确实很重要。例如,tensorflow[6]中实现了一些深度学习机器人算法,该算法正在积极开发中,因此非常依赖于软件版本。在不久的将来,roslab将扩展为tensorflow和其他流行软件包的附加基础镜像。
Roslab正在西班牙卡斯特罗拉普拉纳Jaume I大学的机器人智能实验室开发,可在https://github.com/robinlabji/ros lab上免费公开创建Ros动能、月球和旋律镜像。尽管仍然是实验性的,但如前面的例子所示,它是完全功能性的。我们已经发布了视频教程,使用户可以从头开始重新运行我们的示例(https://tinyurl.com/roslab examples),并逐步演示如何为roslab应用程序设置正确的代码存储库。本文中的所有示例都在一台配备有四个intel内核的cpu的机器上进行了测试
i5-2500处理器,3.3ghz,8gb随机存取存储器,以及带有nvidia geforce gtx 960图形卡的gpu。计算机运行的是ubuntu 14.04.5lts和docker 18.03.1-ce和nvidia docker 2.0。这些示例提供了一个小型演示的功能,因为只有shell命令被执行:更为雄心勃勃的示例可能包括Python或C++代码片段。

尽管生成的Docker映像在主机中本地执行,但它们与联机服务(如 Binder(https://mybinder.org/)兼容,这些服务允许远程执行JupyterLab服务器。显然,rviz和其他图形命令无法执行;相反,ros图像将在云中运行,并且软件可以由任何具有浏览器和互联网连接的用户进行测试。我们还致力于使roslab与 codeoan(https://codeoan.com/)等其他在线软件平台兼容,后者被提议为ieee机器人和自动化杂志(ieee robotics and automation magazine)[7]实施可重复研究文章的推荐框架。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值