跳转至

话题(Topics)

目录

  • 发布/订阅(Publish/Subscribe)
  • 匿名性(Anonymous)
  • 强类型(Strongly-typed)

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

如前所述,ROS 2 是一个强类型、匿名的发布/订阅系统。下面我们将逐句拆解并进一步解释这句话的含义。


发布/订阅(Publish/Subscribe)

发布/订阅系统包含两类实体:数据生产者(发布者,publishers)和数据消费者(订阅者,subscribers)。它们通过“话题”(topic)这一概念相互联系——话题是一个公共名称,使各方能够相互发现。

例如: - 创建发布者时,必须为其指定一个话题名称(字符串) - 创建订阅者时,同样需要指定要订阅的话题名称

所有使用相同话题名称的发布者和订阅者可以直接通信。
任意话题上可以有: - 零个或多个发布者 - 零个或多个订阅者

当任意发布者向该话题发布数据时,系统中所有订阅者都会收到该数据

这种机制也被称为“总线”(bus),因为它类似于电子工程中的设备总线。
正是这种“总线”概念使 ROS 2 成为一个强大且灵活的系统:
- 发布者和订阅者可以按需动态加入或退出 - 调试和内省(introspection)成为系统的自然延伸

例如,若要记录数据,可使用:

ros2 bag record <topic_name>
其底层原理是:ros2 bag record 会为指定话题创建一个新的订阅者,而不会中断数据流向系统的其他部分。


匿名性(Anonymous)

ROS 2 的另一个特点是“匿名性”。
这意味着:当订阅者收到一条数据时,它通常不知道也不关心该数据最初是由哪个发布者发送的(尽管它可以根据需要查询来源)。

这种架构的优势在于:
- 发布者和订阅者可以随时替换,而不会影响系统其余部分


强类型(Strongly-typed)

最后,ROS 2 的发布/订阅系统是“强类型”的,这在此上下文中有两层含义:

1. 字段类型严格定义

ROS 消息中每个字段的类型都是明确的,并在多个层面强制执行。
例如,若某 ROS 消息包含:

uint32 field1
string field2
则系统代码会确保: - field1 始终为无符号整数 - field2 始终为字符串

2. 字段语义明确

每个字段的语义含义有明确定义(尽管没有自动化机制强制语义正确性)。
所有核心 ROS 类型都具有清晰的语义约定。

例如: - IMU 消息中包含一个三维向量表示角速度 - 每个维度都明确规定单位为 弧度/秒(radians/second)
- 不应将其他含义或单位填入该字段