鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    ros2中wait_for_message()函数实现方法

    已定时 已固定 已锁定 已移动
    综合问题
    ros2
    1
    1
    522
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 小鱼小
      小鱼 技术大佬
      最后由 编辑

      今天有鱼粉在群里问小鱼,如何在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"}'
      

      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

      1 条回复 最后回复 回复 引用 0
      • 小鱼小 小鱼 将这个主题标记为已解决,在
      • 小鱼小 小鱼 将这个主题转为普通主题,在
      • 小鱼小 小鱼 从 中的 小伊记录 移动了该主题
      • 第一个帖子
        最后一个帖子
      皖ICP备16016415号-7
      Powered by NodeBB | 鱼香ROS