网上的示例大多是小乌龟的,难免单一,不方便对照理解,这里写个更基础的发布者和订阅者模块(我太菜了,不记下来的话过段时间肯定会忘):
一、最基础的一收一发
发布者:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from std_msgs.msg import Float32
import sys
if __name__ == '__main__':
rospy.init_node("publisher") # 初始化节点
pub = rospy.Publisher("/pubtest/position", Float32, queue_size=10)
# 创建发布者
i = 0.0
rate = rospy.Rate(1)
while not rospy.is_shutdown():
i +=1
if i== 15.0:
i=0.0
pub.publish(i)
rospy.loginfo("send msg: %2f", i) # 将信息打印到shell
rate.sleep()
# rospy.spin()
订阅者:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from std_msgs.msg import Float32
import sys
def callback(msg):
rospy.loginfo("get the msgs: %.2f",msg.data) # 注意这里的data在msg里面
if __name__ == '__main__':
rospy.init_node("listener") # 初始化节点
sub = rospy.Subscriber("/pubtest/position", Float32, callback, queue_size=10)
# 创建订阅者
rospy.spin() # 当sub执行完(即被关闭时)才结束程序
二、稍微复杂点,每个节点都有收发
从第一个节点发布一个数字,第二个节点订阅后加上0.02然后在发布出来,第一个节点再订阅这个加了0.02的数字
节点1:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from std_msgs.msg import Float32
import sys
from threading import Thread
import time
pub = None # 创建全局变量,浪费空间,但是省事
def pub_node():
global pub # 使用全局变量
i = 0.0
rate = rospy.Rate(1)
while not rospy.is_shutdown():
i +=1
if i== 15.0:
i=0.0
pub.publish(i)
rospy.loginfo("%s send msg: %2f", "publisher", i)
rate.sleep()
def callback(msg):
rospy.loginfo("get the msgs from man2: %.2f",msg.data)
if __name__ == '__main__':
rospy.init_node("pub_man1",disable_signals=True)
pub = rospy.Publisher("/man1/position", Float32, queue_size=10)
sub = rospy.Subscriber("/man2/position", Float32, callback, queue_size=10)
mthread = Thread(target = pub_node)
mthread.start()
rospy.spin()
或者在创建多线程时传入pub作为参数:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from std_msgs.msg import Float32
import sys
from threading import Thread
import time
def pub_node(pub):
i = 0.0
rate = rospy.Rate(1)
while not rospy.is_shutdown():
i +=1
if i== 15.0:
i=0.0
pub.publish(i)
rospy.loginfo("%s send msg: %2f", "publisher", i)
rate.sleep()
def callback(msg):
rospy.loginfo("get the msgs from man2: %.2f",msg.data)
if __name__ == '__main__':
rospy.init_node("pub_man1",disable_signals=True)
pub = rospy.Publisher("/man1/position", Float32, queue_size=10)
sub = rospy.Subscriber("/man2/position", Float32, callback, queue_size=10)
mthread = Thread(target = pub_node, kwargs = {'pub':pub})
# 记住这里的参数输入方式
mthread.start()
rospy.spin()
节点2:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from std_msgs.msg import Float32
import sys
from threading import Thread
import time
pub = None
def callback(msgs):
global pub
msgs.data += 0.02
pub.publish(msgs.data)
print(msgs.data)
if __name__ == "__main__":
rospy.init_node("trans")
pub = rospy.Publisher("/man2/position", Float32, queue_size=10)
sub = rospy.Subscriber("/man1/position", Float32, callback, queue_size=10)
rospy.spin()
下图是通讯效果,左边是节点2,右边是节点1: