当前位置:   article > 正文

通过ros2 订阅这个 /sensing/camera/traffic_light/image_raw/compressed,发布 /sensing/camera/traffic_light/imag_ros2 发布compassedimage

ros2 发布compassedimage

以下是一个简单的ROS2节点代码,可以订阅 /sensing/camera/traffic_light/image_raw/compressed 主题并使用图像压缩处理。然后,节点将解压缩图像并发布到 /sensing/camera/traffic_light/image_raw 主题上:

    i

      mport rclpy
      from sensor_msgs.msg import CompressedImage, Image
      import cv2
      import numpy as np

      class TrafficLightCameraNode:
      def init(self):
      self.node = rclpy.create_node(‘traffic_light_camera_node’)
      self.subscriber = self.node.create_subscription(
      CompressedImage,
      ‘/sensing/camera/traffic_light/image_raw/compressed’,
      self.callback,
      10)
      self.publisher = self.node.create_publisher(Image, ‘/sensing/camera/traffic_light/image_raw’, 10)

      def callback(self, msg: CompressedImage):
          np_arr = np.fromstring(msg.data, np.uint8)
          image_np = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
          self.publish_image(image_np, msg.header)
          
      def publish_image(self, image_np, header):
          msg = Image()
          msg.header = header
          msg.encoding = 'bgr8'
          msg.data = np.array(image_np).tobytes()
          msg.width = image_np.shape[1]
          msg.height = image_np.shape[0]
          msg.step = image_np.shape[1] * 3
          self.publisher.publish(msg)
      
      def run(self):
          rclpy.spin(self.node)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

      if name == ‘main’:
      rclpy.init()
      node = TrafficLightCameraNode()
      node.run()
      rclpy.shutdown()

        该节点通过 rclpy 库与 ROS2 通信。在初始化节点时,创建订阅者和发布者。回调函数 callback 解压缩压缩的图像数据,并调用 publish_image 方法以发布未压缩的图像。publish_image 方法将图像数据转换为 ROS2 中的 Image 类型,并发布到 /sensing/camera/traffic_light/image_raw 主题上。

        请注意,此代码仅解压 CompressedImage 消息中的图像数据,并将其转换为未压缩的图像。如果需要对图像进行其他处理,如目标检测或分类,可以使用 OpenCV 或其他计算机视觉库对图像进行处理。
        AttributeError: module ‘traffic_light_de.image_de’ has no attribute ‘main’ [ros2run]: Process exited with failure 1
        这个错误可能是由于您在 ROS2 包的 traffic_light_de 模块中缺少一个名为 main 的函数或方法导致的。您可以检查您的代码并确保 traffic_light_de.image_de 模块中有一个名为 main 的函数或方法,并且它已正确实现。

        以下是一个示例 main 方法的框架,用于订阅图像主题并进行图像处理:

        ```python
        #!/usr/bin/env python
        
        import rclpy
        from rclpy.node import Node
        from sensor_msgs.msg import Image, CompressedImage
        
        class TrafficLightDetector(Node):
            def __init__(self):
                super().__init__('traffic_light_detector')
                self.subscription = self.create_subscription(
                    CompressedImage,
                    '/sensing/camera/traffic_light',
                    self.image_callback,
                    10)
        
            def image_callback(self, msg):
                # Convert compressed image to OpenCV image format
                # Do traffic light detection
                # Publish traffic light information
        
        def main(args=None):
            rclpy.init(args=args)
            traffic_light_detector = TrafficLightDetector()
            rclpy.spin(traffic_light_detector)
            traffic_light_detector.destroy_node()
            rclpy.shutdown()
        
        if __name__ == '__main__':
            main()
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        
        在上面的示例中,我们创建了一个名为 `TrafficLightDetector` 的节点,并使用 `create_subscription` 方法来订阅 `/sensing/camera/traffic_light` 主题。在回调函数 `image_callback` 中,我们将压缩的图像数据转换为 OpenCV 格式,并对图像进行处理和分析。最后,我们可以将分析结果发布到其他 ROS2 主题上。
        
        如果您的代码中已经实现了 `main` 函数或方法,但仍然遇到此错误,请检查您的导入语句是否正确,并确保您的代码中没有拼写错误或语法错误。
        以下是一个重新生成的 Python 节点,可以订阅 /sensing/camera/traffic_light/image_raw/compressed 主题并使用图像压缩处理,然后将解压缩的图像数据发布到 /sensing/camera/traffic_light/image_raw 主题上:
        
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        #!/usr/bin/env python3
        
        import rclpy
        from rclpy.node import Node
        from sensor_msgs.msg import CompressedImage, Image
        import cv2
        import numpy as np
        
        
        class TrafficLightDetectorNode(Node):
        
            def __init__(self):
                super().__init__('traffic_light_detector_node')
                self.subscription = self.create_subscription(
                    CompressedImage,
                    '/sensing/camera/traffic_light/image_raw/compressed',
                    self.image_callback,
                    10)
                self.publisher = self.create_publisher(Image, '/sensing/camera/traffic_light/image_raw', 10)
        
            def image_callback(self, msg: CompressedImage) -> None:
                np_arr = np.frombuffer(msg.data, np.uint8)
                image_np = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
                self.publish_image(image_np, msg.header)
        
            def publish_image(self, image_np: np.ndarray, header) -> None:
                msg = Image()
                msg.header = header
                msg.encoding = 'bgr8'
                msg.data = image_np.tobytes()
                msg.width = image_np.shape[1]
                msg.height = image_np.shape[0]
                msg.step = image_np.shape[1] * 3
                self.publisher.publish(msg)
        
        
        def main(args=None):
            rclpy.init(args=args)
            traffic_light_detector_node = TrafficLightDetectorNode()
            rclpy.spin(traffic_light_detector_node)
            traffic_light_detector_node.destroy_node()
            rclpy.shutdown()
        
        
        if __name__ == '__main__':
            main()
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
        • 23
        • 24
        • 25
        • 26
        • 27
        • 28
        • 29
        • 30
        • 31
        • 32
        • 33
        • 34
        • 35
        • 36
        • 37
        • 38
        • 39
        • 40
        • 41
        • 42
        • 43
        • 44
        • 45
        • 46
        
        该节点继承自 ROS2 中的 Node 类,并在初始化时创建订阅者和发布者。订阅者会接收到压缩的图像数据,然后使用 OpenCV 将其转换为未压缩的图像,并将其发布到 /sensing/camera/traffic_light/image_raw 主题上。
        
        
        • 1
        • 2
        • 3
        声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/845610
        推荐阅读
        相关标签
          

        闽ICP备14008679号