深究ROS系统
在入门ROS的时候,我们了解到,
通过工具rosrun
加载运行一个ROS应用之前,
需要先通过roscore
开启ROS的主节点提供名字和参数服务。
所谓的名字服务是指,记录各个节点、话题、服务的运行时名称和宿主机地址端口的服务。 当ROS应用需要发布或者订阅一个话题的时候,都会先通过这个名字服务进行注册, 并通过名字服务器获知话题的订阅者和发布者的地址和端口,最后在应用程序之间建立点对点的通信。
右边是从2018的一篇文章中抠过来的一张图。 该图清晰地表达了ROS系统建立Topic通信的全过程,需要注意的是这个过程中的1,2的顺序是不确定的, 应用程序可以先注册发布器再注册订阅器,反过来也是可以的。
- Topic 的发布器通过 xml-rpc 向主节点 ROS Master 注册主题名称TopicName、宿主机地址和端口foo:1234;
- Topic 的订阅器通过 xml-rpc 向主节点 ROS Master 注册订阅主题名称TopicName;
- 当 Master 发现有TopicName的发布器注册之后,就会通知订阅器,主题源的地址和端口foo:1234;
- 订阅器就会拿着这个地址和端口找到发布器,请求建立连接;
- 发布器接收到连接请求之后,会拿另外申请一个端口foo:2345告知订阅器,在这个端口上建立实际的连接;
- 接着,订阅器就会拿着新的端口建立连接;
- 以后,发布器就会在这个连接通道上发送数据给订阅者。
当然除此之外,还有节点、服务的名称需要名字服务进行管理。而参数服务,则记录了运行时各个相关配置数据的键值对,
相关的概念都比较好理解,这里不再赘述,以后详细分析相关代码的时候再具体讨论。
本系列将从这个roscore
开始研究这个订阅者/发布者的实现过程。
第一部分:roslaunch
本打算从 roscore 的启动过程开始分析 ROS 的运行环境,看了代码之后发现它只是 roslaunch 中的一个脚本,本质上还是通过 roslaunch 这个工具把主节点(Master)拉起来。 而且在梳理启动过程的时候发现基本上涉及到了 roslaunch 包中的各个模块,所以就先从 roslaunch 开始讨论ROS系统的设计和实现。
包 roslaunch 是一个用 python 写的工具, 它通过解析一个xml格式的文件,启动各个 ros 节点。它是我们日常开启机器人应用的主要方法。
从roscore开始 | roscore 可以说是开启 ROS 环境的第一个指令了。本文中我们将整体过一遍这个执行脚本,然后进入 roslaunch 的入口函数 main 初步了解这个工具。 |
ROSLaunchParent | 上一节的最后,我们看到 roslaunch 构建了一个 ROSLaunchParent 类型的对象。 该对象有两个功能,其一管理本地的进程,加载本地的launch文件;其二提供一个 client/sesrver 的模式用于开启远程的进程。 |
roslaunch.config |