ROS同时订阅多个话题 Python

本文记录了一次在ROS中实现一个节点同时订阅两个话题的过程。起初认为需要开启多个线程,实际上只需在类中定义两个Subscriber即可。问题在于两个话题只能接收到一个,原来是发布节点名称错误。解决方案是确保每个话题的发布节点名称唯一。使用rqt_graph和rostopicecho工具辅助排查问题。
摘要由CSDN通过智能技术生成

记录一次ROS踩坑的经历。本来想用Python实现在一个节点中同时订阅两个话题的消息。在网上查阅了一些资料,其实没有找到特别合适的答案,大多数都是在回答“如何同时订阅和发布话题”这个在Wiki.ros.cn上已经有详细的教程。

我本以为还需要开两个线程,结果还是自己对ROS的话题通讯理解的不够透彻,尝试下来,其实很简单,只需要有两个Subcribe语句就行,分别订阅不同的Topic;ROS的机制是如果没有收到消息,就在spin()里面等待,一旦收到消息,就会去找相应话题名字对应的callback。

我的实现方法是,构造了两个类(class),由于我还实现了同时发布和订阅,因此还有订阅节点,并创建了两个线程,一个线程执行rospy.spin();一个线程执行Publish;如果有更好的方法欢迎给我留言哈!代码结构如下:

#定义线程函数
def thread_job():
    # print("ROSspin has started")
    rospy.spin() 
class SubscribeAndPublish:
	def __init__(self):#初始化class时就创建
		#订阅节点
		self.sub = rospy.Subscriber('/rdb_info', info_pos, self.callback)   
		#发布节点
		self.pub = rospy.Publisher('CmdToVtd', Float32MultiArray,queue_size=1)
	def callback(self, data):#你的回调函数
class Subscribe_Objects:
	def __init__(self):#初始化class时就创建
		#订阅节点
		self.sub2 = rospy.Subscriber('/rdb_info_obj',info_pos_aeb_array,self.callback)   
	def callback(self, data):#你的回调函数
if __name__ == '__main__':
    rospy.init_node('self_locate')
    rate = rospy.Rate(10) # 10hz
    ic = SubscribeAndPublish() #第一个订阅函数
    ig = Subscribe_Objects()   #第二个订阅函数
    thread_rosspin = threading.Thread(target=thread_job)  
    thread_rosspin.start()
    while not rospy.is_shutdown():
    ic.recv_CAN() #这个函数里面有发布函数,具体内容就不写在这里了

以上便实现了一个节点同时订阅多个话题,另外,可以使用rqt_graph来检查节点和话题之间的关系。通过rostopic echo /topic来检查是否话题正常发送和接收。
我就又踩了一个坑,发现我这两个话题/rdb_info/rdb_info_aeb每次只能接收到一个,整整卡了我一天!!这个问题太鬼畜了,每次只能收到最好发送的那个话题。结果发现是我的发布节点写错了,我的两个话题的发布节点的名称居然是一样的!!!那肯定只能收到一个话题消息啊!引以为鉴吧!但是不得不承认rqt_graphrostopic echo /topic好用之处。

如果这篇文章有帮到您,请给我一个小小的赞呀~谢谢啦

  • 10
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ROS(Robot Operating System)是一个用于构建机器人应用程序的开源框架。它提供了一系列工具、库和约定,用于简化机器人软件开发的过程。ROS多线程发布订阅是一常见的通信机制,用于实现不同节点之间的数据传。 在ROS,发布者(Publisher)节点责将数据发布到特定的主题(Topic),而订阅者(Subscriber)节点则负责从主题接收数据。多线程发布订阅允许多订阅者同时接收来自同一个主题的数据,从而提高系统的并发性能。 在Python使用ROS进行多线程发布订阅,可以按照以下步骤进行: 1. 导入所需的ROS库和模块: ```python import rospy from std_msgs.msg import String ``` 2. 初始化ROS节点: ```python rospy.init_node('node_name') ``` 3. 创建发布者对象,并指定要发布的主题和消息类型: ```python pub = rospy.Publisher('topic_name', String, queue_size=10) ``` 4. 创建订阅者回调函数,用于处理接收到的消息: ```python def callback(data): rospy.loginfo("Received: %s", data.data) ``` 5. 创建订阅者对象,并指定要订阅的主题和消息类型,以及回调函数: ```python sub = rospy.Subscriber('topic_name', String, callback) ``` 6. 编写发布数据的逻辑,并使用发布者对象发布消息: ```python rate = rospy.Rate(10) # 设置发布频率为10Hz while not rospy.is_shutdown(): msg = "Hello ROS!" pub.publish(msg) rate.sleep() ``` 以上是使用ROS进行多线程发布订阅的基本步骤。通过创建发布者和订阅者对象,并在回调函数处理接收到的消息,可以实现节点之间的数据传输和通信。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值