- topic是ros的通信方式之一,节点(node)之间通过向主题(topic)上发布(publish)和订阅(subscribe)消息(message)来进行消息传递
- 以下是wiki上的示例,可以直接访问:Writing a Simple Publisher and Subscriber
下面上代码
首先是用到的std_msgs/msg路径下的String.msg文件中的内容:
string data # 定义了数据类型和name
Publisher
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def talker():
# 节点的初始化操作
rospy.init_node('talker_node', anonymous=True)
# 定义一个publisher,topic名字是'chatter',传输数据类型为由String文件定义
pub = rospy.Publisher('chatter', String, queue_size=10)
# 消息发布频率:10次/s
rate = rospy.Rate(10) # 10hz
while not rospy.is_shutdown():
info = 'hello world %s' % rospy.get_time()
# 发布消息
pub.publish(info)
rospy.loginfo(info)
# sleep()函数确保以10hz的频率发布消息
rate.sleep()
if __name__ == '__main__':
try:
talker()
except rospy.ROSIterruptException:
pass
Subscriber
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def listener():
# 初始化节点
rospy.init_node('listener', anonymous=True)
# 订阅name是'chatter'的topic,传输数据类型为由String文件定义,收到消息后调用函数callback,并将message作为第一个参数传入
rospy.Subscriber('chatter', String, callback)
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
def callback(data):
# 输出信息,此处第一个data是接收到的message,第二个data是String文件中定义的数据的name
rospy.loginfo('I heard %s' % data.data)
if __name__ == '__main__':
listener()