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

以下是一个简单的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)

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()

在上面的示例中,我们创建了一个名为 `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 主题上:

#!/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()

该节点继承自 ROS2 中的 Node 类,并在初始化时创建订阅者和发布者。订阅者会接收到压缩的图像数据,然后使用 OpenCV 将其转换为未压缩的图像,并将其发布到 /sensing/camera/traffic_light/image_raw 主题上。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值