1.什么是Topic话题与Message消息?
在 ROS 中,Topic(话题)是节点Node之间通信的通道,用于实现消息的发布和订阅,类似广播频道;Message(消息)是通过 Topic 传输的数据内容,定义了数据的结构和类型。Topic 负责建立通信桥梁,而 Message 是传递的具体数据内容,两者共同实现节点间的解耦通信。
需要注意的是数据只能从发布者(Publish)流向订阅者(Subscribe),没有直接的反馈机制,一个节点Node可以发布到多个(话题) Topic,也可以订阅多个 (话题)Topic,当然一个 (话题)Topic 也可以有多个发布者或订阅者。
2.如何发布相应的话题信息?
我们以python为列,先给出完整的一个发布者代码:
#!/usr/bin/env python3
#coding=utf-8import rospy
from std_msgs.msg import Stringif __name__ == "__main__":rospy.init_node("www_node")rospy.logwarn("好好学习")pub = rospy.Publisher("NB888",String,queue_size=10)rate=rospy.Rate(1)while not rospy.is_shutdown():rospy.loginfo("开始次挨揍")msg=String()msg.data ="12341234\n"pub.publish(msg)rate.sleep()
这段代码啥意思呢,首先告诉操作系统用 Python 3 来运行该脚本,以及指定脚本文件的编码格式为 UTF-8,也就是能够显示中文。接下来导入 ROS 的 Python 接口,以及消息的标准类型。
之后是一个主函数,然后对节点进行初始化,然后在控制台打印警告信息 "好好学习",这个没用可以删了,接着定义一个发布者,其中,"NB888"
是话题的名称,String
是发布的消息类型(std_msgs/String
),queue_size=10
是消息队列大小,指定最多缓存 10 条未发送的消息,接下来是消息发布的频率。
最后是一个主循环的退出条件是 ROS 节点被关闭,下面是提示信息,发不内容的格式以及发布的内容是12341234,调用发布者以及发布的频率。
3.如何订阅相应的话题信息?
同样我们给出一个完整的订阅者代码:
#!/usr/bin/env python3
# coding=utf-8import rospy
from std_msgs.msg import String def zzp_callback(msg):rospy.loginfo(f"NB888 String: {msg.data}")if __name__ == "__main__":rospy.init_node("ma_node") # 初始化 ROS 节点# 订阅 NB888 的 String 消息sub_2 = rospy.Subscriber("NB888", String, zzp_callback, queue_size=10)rospy.spin() # 保持节点运行
这段代码跟上段代码差不多, 不同点在哪呢,一是定义了一个回调函数,用来发布接受的话题信息,接着是一个主函数,节点初始化,然后订阅了NB888 的 String 消息,并保持节点的运行。呢么对比发布者和订阅者的消息,我们可以发现都是通过rospy这个大管家来实现的,然后我们运行上述两个文件:
4.节点信息如何可视化?
输入一下代码,记得启动核心roscore,我理解为相当于开机
rqt_graph
之后会出现相应的节点和话题:
当然这只有一个订阅者和发布者不需要可视化,但出现很多的节点时,当出现很多时,这个就很香。