ros之发布者和订阅者协同工作

前面的例子显示了单个发布者/单个订阅者的情况,但是一个节点也可以同时是一个发布者和订阅者,或者拥有多个订阅和发布。

实际上,ROS节点最常做的事情是传递消息,并在消息上进行运算。

例doubler.py

首先定义一个中间节点

1 #!/usr/bin/env python
 2 import rospy                                                                      
 3 from std_msgs.msg import Int32
 4 rospy.init_node('doubler')
 5 
 6 def callback(msg):
 7     doubled=Int32()
 8     doubled.data=msg.data*2
 9 
10     pub.publish(doubled)
11 
12 sub=rospy.Subscriber('counter',Int32,callback)
13 pub=rospy.Publisher('doubled',Int32,queue_size='number')
14 
15 
16 rospy.spin()

发布者:topic_publisher.py

 1 #!/usr/bin/env python                                                             
 2 import rospy
 3 from std_msgs.msg import Int32
 4 rospy.init_node('topic_publisher')
 5 pub = rospy.Publisher('counter',Int32,queue_size='number')
 6 rate = rospy.Rate(2)
 7 count = 0
 8 while not rospy.is_shutdown():
 9     pub.publish(count)
10     count += 1
11     rate.sleep()

这里的发布者要对应中间节点的订阅者

订阅者:topic_subscriber.py

1 #!/usr/bin/env python 
 2 import rospy
 3 from std_msgs.msg import Int32
 4 def callback(msg):
 5     print msg.data
 6 rospy.init_node('topic_subscriber')
 7 sub=rospy.Subscriber('doubled',Int32,callback)                                    
 8 rospy.spin()

这里的订阅者要对应中间节点的发布者

然后运行各节点,结果如下

qqtsj@qqtsj-Nitro-AN515-51:~/catkin_ws$ rosrun basic topic_subscriber.py 
24
26
28
30
32
34
36
38
40
42
44
46
48
50
52
54
56
58
60
62
64

通过中间节点使得发布者的数据×2,然后订阅者接收到

就完成了协同工作

原文地址:https://www.cnblogs.com/tanshengjiang/p/11777123.html