ros2中wait_for_message()函数实现方法

ros2中wait_for_message()函数实现方法

鱼香ROS介绍:

鱼香ROS是由机器人爱好者共同组成的社区,欢迎一起参与机器人技术交流。
进群加V:fishros2048

文章信息:

标题:ros2中wait_for_message()函数实现方法
原文地址:https://fishros.org.cn/forum/topic/16
关键词: ros2,
参与者: 小鱼,
版权声明: 文章中所有知识产权归鱼香ROS及原作者所有。


1. 小鱼听着歌说:

今天有鱼粉在群里问小鱼,如何在ros2中实现wait_for_message()函数?

在ros1中可以使用下面的程序,来获取一条指定话题的数据消息

msg = rospy.wait_for_message('话题名字',话题类型)

该函数实现原理为:创建一个订阅,接收一条消息,取消订阅
https://docs.ros.org/en/diamondback/api/rospy/html/rospy.client-module.html#wait_for_message
等待消息
照着这个原理,我们可以写一个ROS2中相同的函数,但是需要注意ROS2中的rospy不是多线程的了,所以不能和ROS1中该函数实现一样,一直等待消息而不用spin()。

所以在ROS2中我们可以这样来实现这个函数

def wait_for_message(node ,topic_type, topic): 
    class _vfm(object):
        def __init__(self) -> None:
            self.msg = None
            
        def cb(self, msg):
            self.msg = msg

    vfm = _vfm()
    subscription = node.create_subscription(topic_type,topic,vfm.cb,1)
    while rclpy.ok():
        if vfm.msg != None: return vfm.msg
        rclpy.spin_once(node)
        time.sleep(0.001)
    # unsubcription
    subscription.destroy()

完整测试代码如下:

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
import time

def wait_for_message(node ,topic_type, topic): 
    class _vfm(object):
        def __init__(self) -> None:
            self.msg = None
            
        def cb(self, msg):
            self.msg = msg

    vfm = _vfm()
    subscription = node.create_subscription(topic_type,topic,vfm.cb,1)
    while rclpy.ok():
        if vfm.msg != None: return vfm.msg
        rclpy.spin_once(node)
        time.sleep(0.001)
    # unsubcription
    subscription.destroy()

def main(args=None):
    rclpy.init(args=args)
    node = Node("test_message_node")
    msg = wait_for_message(node, String, "/test_sub")
    print(f'wait_for_message:{msg}')
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == '__main__':
    main()
ros2 topic pub /test_sub std_msgs/msg/String '{data: "123"}'
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值