Skip to content

关于话题

话题(topic)是 ROS 2 提供的三种主要接口类型之一。 话题适用于连续数据流,如传感器数据、机器人状态等。

如前所述,ROS 2 是一个强类型的、匿名的发布/订阅系统。 下面我们来详细解释这两个概念。

发布/订阅系统中有数据的生产者——发布者(publisher),和数据的消费者——订阅者(subscriber)。 发布者和订阅者通过”话题”这一概念来建立联系:话题是一个公共名称,让各个实体能够找到彼此。 例如,创建发布者时,你必须给它指定一个字符串作为话题名称;订阅者也是如此。 同一个话题上的任何发布者和订阅者都可以直接相互通信。 任何特定的话题上可以有零个或多个发布者,以及零个或多个订阅者。 当某个发布者向话题发布数据时,该话题上的所有订阅者都会收到这份数据。 这个系统也被称为”总线”(bus),因为它有点类似于电气工程中的设备总线。 总线概念是让 ROS 2 成为强大而灵活系统的原因之一。 发布者和订阅者可以根据需要加入和离开,因此调试和内省天然地融入了系统的设计之中。 例如,如果你想记录数据,可以使用 ros2 bag record 命令。 在底层,ros2 bag record 会为你指定的每个话题创建一个新的订阅者,而不会中断数据流向系统的其他部分。

引言中提到的另一个事实是 ROS 2 是”匿名的”。 这意味着订阅者收到数据时,通常不知道也不关心最初是哪个发布者发送的(尽管如果需要,它可以查到)。 这种架构的好处是发布者和订阅者可以随意替换,而不会影响系统的其余部分。

最后,引言中还提到发布/订阅系统是”强类型的”。 在此上下文中,这有两个含义:

  1. ROS 消息中每个字段的类型都是明确的,并且该类型在多个层面被强制执行。 例如,如果 ROS 消息包含:

    uint32 field1
    string field2

    那么代码将确保 field1 始终是无符号整数,field2 始终是字符串。

  2. 每个字段的语义是明确定义的。 虽然没有自动化机制来确保这一点,但所有核心 ROS 类型都有与之关联的强语义。 例如,IMU 消息包含一个用于测量角速度的三维向量,并且每个维度都指定为以弧度/秒为单位。 不应将其他含义放入该消息中。