kinetic-ros-base
, kinetic-ros-base-xenial
, kinetic
kinetic-robot
, kinetic-robot-xenial
kinetic-perception
, kinetic-perception-xenial
melodic-ros-core
, melodic-ros-core-bionic
melodic-ros-base
, melodic-ros-base-bionic
, melodic
, latest
melodic-robot
, melodic-robot-bionic
melodic-perception
, melodic-perception-bionic
melodic-ros-core-stretch
melodic-ros-base-stretch
melodic-robot-stretch
melodic-perception-stretch
dashing-ros-core
, dashing-ros-core-bionic
dashing-ros-base
, dashing-ros-base-bionic
, dashing
eloquent-ros-core
, eloquent-ros-core-bionic
eloquent-ros-base
, eloquent-ros-base-bionic
, eloquent
Where to get help: the Docker Community Forums, the Docker Community Slack, or Stack Overflow
Where to file issues: https://github.com/osrf/docker_images/issues
Maintained by: the Open Source Robotics Foundation
Supported architectures: (more info) amd64
, arm32v7
, arm64v8
Published image artifact details: repo-info repo's repos/ros/
directory (history) (image metadata, transfer size, etc)
Image updates: official-images PRs with label library/ros
official-images repo's library/ros
file (history)
Source of this description: docs repo's ros/
directory (history)
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
创建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的配置文件托管
ROS使用ROS ~/.ros/目录存放日志文件和debugging信息。
如果你希望容器死亡后仍然保存ROS文件, ~/.ros/
目录可以作为额外的挂载项存放与本地,在run镜像时将目录挂载. 默认使用root账户执行该命令, 所以/root/.ros/
将会被用于存放ROS相关的文件
举例来说,如果你的执行用户并非root,可以使用当前执行用户家目录下的.ros目录作为挂载目录,比如ubuntu用户,在run镜像时使用卷挂载
$ docker run -v "/home/ubuntu/.ros/:/root/.ros/" ros
有些工程会需要用到硬件设备如摄像头,来自操作员的控制输入信息, 或者GPUS硬件加速. 可以通过 --device
参数来挂载设备到容器,提供硬件访问内部进程
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.
如果想要ROS节点间可通信,我们要使用虚拟网络(virtual network)来连接点独立的容器,在下面的例子中我们要创建虚拟网络,创建一个容器来运行roscore主服务,然后在同一个虚拟网中spawn一对发布者(message publisher)和订阅( subscriber process)
使用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
现在我们已经了解如何单独起节点,现在我们把它们整合到一起,使用 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
.
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
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.