ros中的Publisher和Subscriber

  1. topic是ros的通信方式之一,节点(node)之间通过向主题(topic)上发布(publish)和订阅(subscribe)消息(message)来进行消息传递
  2. 以下是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()
阅读更多
个人分类: ROS
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭