使用python写的发布者和订阅者

网上的示例大多是小乌龟的,难免单一,不方便对照理解,这里写个更基础的发布者和订阅者模块(我太菜了,不记下来的话过段时间肯定会忘):

一、最基础的一收一发

发布者:

#!/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:

猜你喜欢

转载自blog.csdn.net/aniclever/article/details/129839483