写点什么

ROS 通信机制全解析:Topic、Service、Parameter Service 和 Actionlib 的核心原理与应用

作者:芯动大师
  • 2025-01-11
    四川
  • 本文字数:1776 字

    阅读完需:约 6 分钟

ROS通信机制全解析:Topic、Service、Parameter Service和Actionlib的核心原理与应用

ROS 的通信方式是 ROS 最为核心的概念,ROS 系统的精髓就在于它提供的通信架构。ROS 的通信方式有以下四种:

  • Topic 主题

  • Service 服务

  • Parameter Service 参数服务器

  • Actionlib 动作库

Topic(发布/订阅)

ROS 中的通信方式中,topic 是常用的一种。对于实时性、周期性的消息,使用 topic 来传输是最佳的选择。topic 是一种点对点的单向通信方式,这里的“点”指的是 node,也就是说 node 之间可以通过 topic 方式来传递信息。topic 要经历下面几步的初始化过程:首先,publisher 节点和 subscriber 节点都要到节点管理器进行注册,然后 publisher 会发布 topic,subscriber 在 master 的指挥下会订阅该 topic,从而建立起 sub-pub 之间的通信。注意整个过程是单向的。其结构示意图如下:



Subscriber 接收消息会进行处理,一般这个过程叫做回调(Callback)。所谓回调就是提前定义好了一个处理函数(写在代码中),当有消息来就会触发这个处理函数,函数会对消息进行处理。

注意整个过程是单向的。

  • Talker 向 ROS Master 注册

  • Listener 向 ROS Master 注册

  • ROS Master 通过 RPC 向 Listener 发送 Talker 的地址信息

  • Listener 接收到地址信息,通过 RPC 向 Talker 发送连接请求

  • Talker 确认连接请求,通过 RPC 向 Listener 确认连接

  • Listener 与 Talker 建立网络连接

  • Talker 向 Listener 发布数据

总结:前五步的通信协议都是 RPC,最后两步传输数据才用 TCP

通信示例

怎么样来理解“异步”这个概念呢?在 node1 每发布一次消息之后,就会继续执行下一个动作,至于消息是什么状态、被怎样处理,它不需要了解;而对于 node2 图像处理程序,它只管接收和处理/camera_rgb上的消息,至于是谁发来的,它不会关心。所以 node1、node2 两者都是各司其责,不存在协同工作,我们称这样的通信方式是异步的。

ROS 是一种分布式的架构,一个 topic 可以被多个节点同时发布,也可以同时被多个节点接收。比如在这个场景中用户可以再加入一个图像显示的节点,我们在想看看摄像头节点的画面,则可以用自己的笔记本连接到机器人上的节点管理器,然后在自己的电脑上启动图像显示节点。

这就体现了分布式系统通信的好处:扩展性好、软件复用率高。

总结三点

  1. topic 通信方式是异步的,发送时调用 publish()方法,发送完成立即返回,不用等待反馈。

  2. subscriber 通过回调函数的方式来处理消息。

  3. topic 可以同时有多个 subscribers,也可以同时有多个 publishers。ROS 中这样的例子有:/rosout、/tf 等等。

操作命令

在实际应用中,我们应该熟悉 topic 的几种使用命令,下表详细的列出了各自的命令及其作用。



如果你一时忘记了命令的写法,可以通过rostopic helprostopic command -h查看具体用法。

topic 的通信方式是 ROS 中比较常见的单向异步通信方式,它在很多时候的通信是比较易用且高效的。但是有些需要交互的通信时该方式就显露出自己的不足之处了,后续我们会介绍双向同步的通信方式 service

Message

topic 有很严格的格式要求,比如上节的摄像头进程中的 rgb 图像 topic,它就必然要遵循 ROS 中定义好的 rgb 图像格式。这种数据格式就是 Message。Message 按照定义解释就是 topic 内容的数据类型,也称之为 topic 的格式标准。这里和我们平常用到的 Massage 直观概念有所不同,这里的 Message 不单单指一条发布或者订阅的消息,也指定为 topic 的格式标准。

结构与类型

基本的 msg 包括 bool、int8、int16、int32、int64(以及 uint)、float、float64、string、time、duration、header、可变长数组 array[]、固定长度数组 array[C]。那么具体的一个 msg 是怎么组成的呢?我们用一个具体的 msg 来了解,例如上例中的 msg sensor_msg/image,位置存放在sensor_msgs/msg/image.msg里,它的结构如下:

std_msg/Header header    uint32    seq    time    stamp    string    frame_iduint32    heightuint32    widthstring    encodinguint8    is_bigendianuint32    stepuint8[]    data
复制代码

观察上面 msg 的定义,是不是很类似 C 语言中的结构体呢?通过具体的定义图像的宽度,高度等等来规范图像的格式。所以这就解释了 Message 不仅仅是我们平时理解的一条一条的消息,而且更是 ROS 中 topic 的格式规范。或者可以理解 msg 是一个“类”,那么我们每次发布的内容可以理解为“对象”,这么对比来理解可能更加容易。 我们实际通常不会把 Message 概念分的那么清,通常说 Message 既指的是类,也是指它的对象。而 msg 文件则相当于类的定义了。

操作命令

rosmsg 的命令相比 topic 就比较少了,只有两个如下:



发布于: 刚刚阅读数: 7
用户头像

芯动大师

关注

凡事预则立,不预则废! 2022-06-01 加入

某公司芯片AE工程师,嵌入式开发工程师,InfoQ签约作者,阿里云专家博主,华为云·云享专家,51CTO专家博主,腾讯云社区优秀共创官。

评论

发布
暂无评论
ROS通信机制全解析:Topic、Service、Parameter Service和Actionlib的核心原理与应用_ROS2_芯动大师_InfoQ写作社区