前面的例子显示了单个发布者/单个订阅者的情况,但是一个节点也可以同时是一个发布者和订阅者,或者拥有多个订阅和发布。
实际上,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,然后订阅者接收到
就完成了协同工作