首页 关于
树枝想去撕裂天空 / 却只戳了几个微小的窟窿 / 它透出天外的光亮 / 人们把它叫做月亮和星星

深究ROS系统

入门ROS的时候,我们了解到, 通过工具rosrun加载运行一个ROS应用之前, 需要先通过roscore开启ROS的主节点提供名字和参数服务。

所谓的名字服务是指,记录各个节点、话题、服务的运行时名称和宿主机地址端口的服务。 当ROS应用需要发布或者订阅一个话题的时候,都会先通过这个名字服务进行注册, 并通过名字服务器获知话题的订阅者和发布者的地址和端口,最后在应用程序之间建立点对点的通信。

右边是从2018的一篇文章中抠过来的一张图。 该图清晰地表达了ROS系统建立Topic通信的全过程,需要注意的是这个过程中的1,2的顺序是不确定的, 应用程序可以先注册发布器再注册订阅器,反过来也是可以的。

  1. Topic 的发布器通过 xml-rpc 向主节点 ROS Master 注册主题名称TopicName、宿主机地址和端口foo:1234;
  2. Topic 的订阅器通过 xml-rpc 向主节点 ROS Master 注册订阅主题名称TopicName;
  3. 当 Master 发现有TopicName的发布器注册之后,就会通知订阅器,主题源的地址和端口foo:1234;
  4. 订阅器就会拿着这个地址和端口找到发布器,请求建立连接;
  5. 发布器接收到连接请求之后,会拿另外申请一个端口foo:2345告知订阅器,在这个端口上建立实际的连接;
  6. 接着,订阅器就会拿着新的端口建立连接;
  7. 以后,发布器就会在这个连接通道上发送数据给订阅者。

当然除此之外,还有节点、服务的名称需要名字服务进行管理。而参数服务,则记录了运行时各个相关配置数据的键值对, 相关的概念都比较好理解,这里不再赘述,以后详细分析相关代码的时候再具体讨论。 本系列将从这个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



Copyright @ 高乙超. All Rights Reserved. 京ICP备16033081号-1