2.07ros话题通信介绍
1、概念
话题(Topics):节点可以将消息发布到话题,或者通过订阅话题来接收消息。话题是用于标识消息内容的名称。对某种数据感兴趣的节点会订阅到相应的话题。单个话题可能有多个并行发布者(publishers)和订阅者(subscribers),并且单个节点可以同时发布和订阅多个话题,单个节点也可以发布或订阅(监听)多个话题。通常,发布者和订阅者不知道彼此的存在。它们之间是属于解耦合的关系。从逻辑上讲,可以将话题视为强类型的消息总线。每条总线都有一个名称,只要类型正确,任何人都可以连接到总线以发送或接收消息。 消息(Messages):订阅或发布话题时所使用的ROS数据类型。消息是由类型化字段组成。支持标准原始类型(整数、浮点、布尔值等),以及原始类型数组。消息可以包括任意嵌套的结构和数组(很像C结构)。
2、话题通信机制
话题通信是ROS通信中最常用的一种基于发布和订阅模型的通信方式。用于实时性、周期性、少逻辑处理的数据传输场景。 ROS Node想要通过topic方式来传递消息,首先 publisher 节点和 Subscriber 节点都要到ROS Master(节点管理器)中进行注册节点名称、话题名称、消息类型、URI地址和端口,然后ROS Master向 Subcriber 节点发送 publisher 节点信息, Subscriber 节点根据接收的 publisher 节点信息,向 publisher 节点请求直接连接,它们建立连接后, publisher 节点向 Subscriber 节点发送消息。节点间通信使用一种基于TCP/IP的消息传输,称为TCPROS。
3、话题命令rostopic
rostopic命令工具能让你获取ROS话题的信息。
命令 | 功能 |
---|---|
rostopic bw | 列出消息发布带宽 |
rostopic delay | 显示主题相对于时间戳的延迟 |
rostopic echo | 显示某个话题上发布的数据 |
rostopic find | 根据消息类型查找话题 |
rostopic hz | 报告数据发布的速率 |
rostopic info | 获取指定Topic 当前发布的消息 |
rostopic list | 列出当前所有的Topic |
rostopic pub | 把数据发布到当前某个正在广播的话题上 |
rostopic type | 查看所有发布话题的消息类型 |
4、话题通讯的组成:
- 发布者(Publisher):发布者节点负责发布消息到指定的话题。它定期或根据某些事件生成数据,并将其发送到话题中。
- 订阅者(Subscriber):订阅者节点负责订阅一个或多个话题,并接收发布者发送的消息。当消息到达时,订阅者节点会通过回调函数来处理这些消息。
- 话题(Topic):话题是消息的目的地,它是一个命名的通道,用于传递消息。话题名称通常是全局唯一的,并且遵循命名约定,如
/namespace/topic_name
。 - 消息(Message):消息是发布者发送到话题的数据。在ROS中,消息必须遵循特定的格式,这些格式通过
.msg
文件定义。
5、话题通讯的步骤:
- 定义消息类型:使用
.msg
文件定义消息的结构,这是发布和订阅消息的基础。 - 创建发布者:在发布者节点中,使用
rospy
库创建一个发布者对象,并指定话题名称和消息类型。 - 创建订阅者:在订阅者节点中,使用
rospy
库创建一个订阅者对象,并指定话题名称和消息类型。同时定义一个回调函数来处理接收到的消息。 - 启动ROS节点:发布者和订阅者节点都需要启动ROS节点,并通过
rospy.init_node()
函数进行初始化。 - 发布和订阅消息:发布者节点定期调用
publish()
方法发送消息,而订阅者节点通过回调函数接收并处理消息。