ROS Docker 支持

可供支持的DockerFile文件

Quick reference

什么是 ROS?

ROS是一套对机器人提供支持的软件和工具集合. From drivers to state-of-the-art algorithms, and with powerful developer tools, ROS has what you need for your next robotics project. And it's all open source.

wikipedia.org/wiki/Robot_Operating_System

logo

如何使用image

通过使用DockerFile的方式

创建Dockerfile文件

$ mkdir bulid && cd build   
$ touch Dockerfile

文章开头给出的链接地址提供了更多DockerFile,将以下内容填入Dockerfile

镜像为ros:indigo

FROM ros:indigo
# place here your application's setup specifics
CMD [ "roslaunch", "my-ros-app my-ros-app.launch" ]

build然后run这个文件

$ docker build -t my-ros-app .
$ docker run -it --rm --name my-running-app my-ros-app

背景

docker化的ROS镜像旨在提供标准稳定的ROS平台来开展你的机器人项目。official Ubuntu image 和 ROS's 官方 Debian 包,它包括最新的版本,用于快速访问和下载。这为研究和工业领域的机器人学家提供了一种开发、重用和发布用于自主行动和任务规划、控制动力学、定位和映射、群体行为以及一般系统集成的软件的简便方法。

利用最新发布的算法的尖端实现来开发这样复杂的系统仍然具有挑战性,因为机器人软件的可重复性和可复制性可能会在创新的竞争中被淘汰。随着在跨许多工程学科的多个软件组件的编码、调优和部署方面的困难增加,一种更具协作性的方法变得有吸引力。然而,在多个机器人和平台上共享和维护一个软件集合的技术困难已经超过了许多小型实验室和企业所能承受的时间和精力。

随着软件容器的进步和标准化,机器人学家准备获得一系列改进的开发工具,用于构建和发布软件。为了帮助减轻采用新实践带来的日益增长的痛苦和技术挑战,我们将重点放在为使用这些新技术的ROS提供官方资源上。

部署建议

可用的标记包括所支持的发行版,以及基于最常见的源包依赖项的层次结构标记,设计用于具有较小体积和简单的配置:

  • ros-core: barebone ROS install(裸ROS系统)
  • ros-base: basic tools and libraries (also tagged with distro name with LTS version as latest)(包含工具和库集的ROS系统)
  • robot: basic install for robots(对机器人的基本支持版本)
  • perception: basic install for perception tasks(对感知模块的基本支持版本)

其他常见的源包,如desktop和desktop full,都托管在OSRF的Docker Hub配置文件下的自动构建repo上,here

这些源软件包包括图形依赖项,并挂接大量其他大型软件包,如X11、X服务器等。因此,为了保持官方图像的简洁和安全,桌面软件包仅由OSRF的配置文件托管

Volumes 挂载卷

ROS使用ROS ~/.ros/目录存放日志文件和debugging信息。如果你希望容器死亡后仍然保存ROS文件,  ~/.ros/ 目录可以作为额外的挂载项存放与本地,在run镜像时将目录挂载. 默认使用root账户执行该命令, 所以/root/.ros/ 将会被用于存放ROS相关的文件

举例来说,如果你的执行用户并非root,可以使用当前执行用户家目录下的.ros目录作为挂载目录,比如ubuntu用户,在run镜像时使用卷挂载

$ docker run -v "/home/ubuntu/.ros/:/root/.ros/" ros

Devices 硬件设备支持

有些工程会需要用到硬件设备如摄像头,来自操作员的控制输入信息, 或者GPUS硬件加速. 可以通过 --device 参数来挂载设备到容器,提供硬件访问内部进程

Networks 网络支持

ROS的时间模式是点对点的,

The ROS runtime "graph" is a peer-to-peer network of processes (potentially distributed across machines) that are loosely coupled using the ROS communication infrastructure.ROS支持多种形式的交流方式, 包括服务间同步RPC-style交流,话题间的异步数据流传输, 参数服务器上的存储. To abide by the best practice of one process per container, Docker 网络可以支持多ROS节点间交流。For further details about ROS NetworkSetup wik article,or see the Deployment example below.

Deployment example 部署案例

如果想要ROS节点间可通信,我们要使用虚拟网络(virtual network)来连接点独立的容器,在下面的例子中我们要创建虚拟网络,创建一个容器来运行roscore主服务,然后在同一个虚拟网中spawn一对发布者(message publisher)和订阅( subscriber process)

Build image

使用Dockerfile来运行

$ vim Dockerfile
FROM ros:indigo-ros-base
# install ros tutorials packages
RUN apt-get update && apt-get install -y \
    ros-indigo-ros-tutorials \
    ros-indigo-common-tutorials \
    && rm -rf /var/lib/apt/lists/

构建dockerfile

$ docker build --tag ros:ros-tutorials .

创建网络

创建docker网络,使用以下命令

docker network create foo

现在我们有了网络,我们可以创建服务。服务在网络上公布该位置,使解析特定于服务的容器的位置/地址变得容易。我们将使用这个确保我们的ROS节点能够找到并连接到我们的ROS主节点。

Run services

创建ROS master 执行以下命令

$ docker run -it --rm \
    --net foo \
    --name master \
    ros:ros-tutorials \
    roscore

现在你可以看到主节点正在运行,并准备好管理我们的其他ROS节点。要添加我们的talker节点,我们需要将相关环境变量指向主节点:

$ docker run -it --rm \
    --net foo \
    --name talker \
    --env ROS_HOSTNAME=talker \
    --env ROS_MASTER_URI=http://master:11311 \
    ros:ros-tutorials \
    rosrun roscpp_tutorials talker

然后是另一个容器,订阅者节点:

$ docker run -it --rm \
    --net foo \
    --name listener \
    --env ROS_HOSTNAME=listener \
    --env ROS_MASTER_URI=http://master:11311 \
    ros:ros-tutorials \
    rosrun roscpp_tutorials listener

Ok,现在主节点、订阅者、发布者已经启动了,你可以通过以下命令查看

$ docker service ls
SERVICE ID          NAME                NETWORK             CONTAINER
67ce73355e67        listener            foo                 a62019123321
917ee622d295        master              foo                 f6ab9155fdbe
7f5a4748fb8d        talker              foo                 e0da2ee7570a

或者通过以下命令

$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS               NAMES
a62019123321        ros:ros-tutorials   "/ros_entrypoint.sh    About a minute ago   Up About a minute   11311/tcp           listener
e0da2ee7570a        ros:ros-tutorials   "/ros_entrypoint.sh    About a minute ago   Up About a minute   11311/tcp           talker
f6ab9155fdbe        ros:ros-tutorials   "/ros_entrypoint.sh    About a minute ago   Up About a minute   11311/tcp           master

深入容器调整

好的,现在我们看到两个节点正在通信,让我们进入其中一个容器,并对主题进行一些深入调查:

$ docker exec -it master bash
$ source /ros_entrypoint.sh

如果们我的节点启动正常,可以看到如下消息

$ rostopic list
/chatter
/rosout
/rosout_agg

关闭容器

为了关闭我们建造的容器,我们只需要停止容器和服务。我们可以使用Ctrl^C(在启动容器的位置)或使用stop命令(具有给定的名称)停止并移除容器:

$ docker stop master talker listener
$ docker rm master talker listener

Compose 组合

 

现在我们已经了解如何单独起节点,现在我们把它们整合到一起,使用 docker-compose.

首先创建一个名为rostutorials的文件夹,并将之前使用的Dockerfile移到这个目录中。然后在同一目录中创建一个名为docker compose.yml的yaml文件,并在其中粘贴以下内容:

version: '2'
services:
  master:
    build: .
    container_name: master
    command:
      - roscore

  talker:
    build: .
    container_name: talker
    environment:
      - "ROS_HOSTNAME=talker"
      - "ROS_MASTER_URI=http://master:11311"
    command: rosrun roscpp_tutorials talker

  listener:
    build: .
    container_name: listener
    environment:
      - "ROS_HOSTNAME=listener"
      - "ROS_MASTER_URI=http://master:11311"
    command: rosrun roscpp_tutorials listener

在当前目录下,使用docker copose启动我们的ROS节点,并指定它们的共用同一网络

$ docker-compose up -d

现在rostutorials_default网络已经被创建,我们可以查看它

$ docker network inspect rostutorials_default

我们可以监视每个服务的日志输出,例如订阅者节点,如下所示:

$ docker-compose logs listener

Finally, we can stop and remove all the relevant containers using docker-copose from the same directory:

最后,我们可以使用docker copose停止并删除所有相关容器:

$ docker-compose stop
$ docker-compose rm

Note: 

自动生成的网络,rostutorials_default,将在docker引擎的整个生命周期内持续存在,或者直到手动删除它为止,使用docker network rm.

More Resources

ROS.org: Main ROS website
Wiki: Find tutorials and learn more
ROS Answers: Ask questions. Get answers
Blog: Stay up-to-date
OSRF: Open Source Robotics Foundation

License

The core of ROS is licensed under the standard three-clause BSD license. This is a very permissive open license that allows for reuse in commercial and closed source products. You can find more about the BSD license from the Opensource.org BSD 3-Clause page and Wikipedia's BSD Licenses entry.

While the core parts of ROS are licensed under the BSD license, other licenses are commonly used in the community packages, such as the Apache 2.0 license, the GPL license, the MIT license, and even proprietary licenses. Each package in the ROS ecosystem is required to specify a license, so that it is easy for you to quickly identify if a package will meet your licensing needs.

As with all Docker images, these likely also contain other software which may be under other licenses (such as Bash, etc from the base distribution, along with any direct or indirect dependencies of the primary software being contained).

Some additional license information which was able to be auto-detected might be found in the repo-info repository's ros/ directory.

As for any pre-built image usage, it is the image user's responsibility to ensure that any use of this image complies with any relevant licenses for all software contained within.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值