话题(Topics)¶
目录¶
- 发布/订阅(Publish/Subscribe)
- 匿名性(Anonymous)
- 强类型(Strongly-typed)
话题是 ROS 2 提供的三种主要接口风格之一。话题适用于连续数据流,例如传感器数据、机器人状态等。
如前所述,ROS 2 是一个强类型、匿名的发布/订阅系统。下面我们将逐句拆解并进一步解释这句话的含义。
发布/订阅(Publish/Subscribe)¶
发布/订阅系统包含两类实体:数据生产者(发布者,publishers)和数据消费者(订阅者,subscribers)。它们通过“话题”(topic)这一概念相互联系——话题是一个公共名称,使各方能够相互发现。
例如: - 创建发布者时,必须为其指定一个话题名称(字符串) - 创建订阅者时,同样需要指定要订阅的话题名称
所有使用相同话题名称的发布者和订阅者可以直接通信。
任意话题上可以有:
- 零个或多个发布者
- 零个或多个订阅者
当任意发布者向该话题发布数据时,系统中所有订阅者都会收到该数据。
这种机制也被称为“总线”(bus),因为它类似于电子工程中的设备总线。
正是这种“总线”概念使 ROS 2 成为一个强大且灵活的系统:
- 发布者和订阅者可以按需动态加入或退出
- 调试和内省(introspection)成为系统的自然延伸
例如,若要记录数据,可使用:
其底层原理是:ros2 bag record 会为指定话题创建一个新的订阅者,而不会中断数据流向系统的其他部分。
匿名性(Anonymous)¶
ROS 2 的另一个特点是“匿名性”。
这意味着:当订阅者收到一条数据时,它通常不知道也不关心该数据最初是由哪个发布者发送的(尽管它可以根据需要查询来源)。
这种架构的优势在于:
- 发布者和订阅者可以随时替换,而不会影响系统其余部分
强类型(Strongly-typed)¶
最后,ROS 2 的发布/订阅系统是“强类型”的,这在此上下文中有两层含义:
1. 字段类型严格定义¶
ROS 消息中每个字段的类型都是明确的,并在多个层面强制执行。
例如,若某 ROS 消息包含:
field1 始终为无符号整数
- field2 始终为字符串
2. 字段语义明确¶
每个字段的语义含义有明确定义(尽管没有自动化机制强制语义正确性)。
所有核心 ROS 类型都具有清晰的语义约定。
例如:
- IMU 消息中包含一个三维向量表示角速度
- 每个维度都明确规定单位为 弧度/秒(radians/second)
- 不应将其他含义或单位填入该字段