使用ros2 写一个节点通过订阅/sensing/camera/traffic_light/image_raw,发布一个/sensing/camera/traffic_light/image_raw/

该文指导如何在ROS2环境下安装最新版ROS,创建处理图像的节点,订阅/sensing/camera/traffic_light/image_raw话题,用OpenCV压缩图像并发布到压缩话题。同时,文章提到了处理QoS策略不兼容问题,确保消息传输的可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先你需要先安装ROS2(推荐使用最新的版本),在终端中输入以下命令:

sudo apt update
sudo apt install ros-<distro>-desktop-full

其中需要替换成你安装的ROS2版本。这个命令会安装ROS2以及相关的依赖项。

接下来,我们需要创建一个ROS2节点来执行我们的任务。请按照以下步骤操作:

创建一个包
ros2 pkg create traffic_light
在traffic_light目录下创建一个python节点
cd traffic_light
ros2 pkg create --build-type ament_python --node-name image_comp node

编写代码
根据你的需求,你需要订阅/sensing/camera/traffic_light/image_raw话题,并在回调函数中发布/sensing/camera/traffic_light/image_raw/compressed话题。以下是一个使用OpenCV压缩图像并将其发布到话题的示例代码:

import cv2
import numpy as np
from rclpy.node import Node
from sensor_msgs.msg import Image, CompressedImage
from cv_bridge import CvBridge

class TrafficLightNode(Node):
    def __init__(self):
        super().__init__('image_comp')

        self.subscription = self.create_subscription(
            Image,
            '/sensing/camera/traffic_light/image_raw',
            self.listener_callback,
            10)
        self.publisher_ = self.create_publisher(
            CompressedImage,
            '/sensing/camera/traffic_light/image_raw/compressed',
            10)
        self.brg = CvBridge()

    def listener_callback(self, data):
        np_img = self.brg.imgmsg_to_cv2(data)
        _, jpg_data = cv2.imencode(".jpg", np_img, [cv2.IMWRITE_JPEG_QUALITY, 40])
        compressed_msg = CompressedImage()
        compressed_msg.format = "jpeg"
        compressed_msg.data = jpg_data.tobytes()
        self.publisher_.publish(compressed_msg)


def main(args=None):
    rclpy.init(args=args)
    traffic_light_node = TrafficLightNode()
    rclpy.spin(traffic_light_node)
    traffic_light_node.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()

编译代码
编译我们的包,并确保它被添加到ROS2环境中。在包目录下运行以下命令:

colcon build --packages-select traffic_light
source install/setup.bash
启动节点
执行以下命令以启动节点:

ros2 run traffic_light image_comp
现在,你的节点已经在运行了,会实时订阅/sensing/camera/traffic_light/image_raw话题,按要求处理图像,并将压缩后的图像发布到/sensing/camera/traffic_light/image_raw/compressed话题中。

[WARNING]: Unknown license ‘TODO: License declaration’. This has been set in the package.xml, but no LICENSE file has been created. It is recommended to use one of the ament license identitifers:
此警告意味着在包的package.xml中设置了一个未知的许可证,但是没有创建相应的LICENSE文件。建议使用ament许可证标识符来指定许可证类型。

你可以通过在package.xml的字段中指定一个ament标识符来解决这个问题。以下是常用的一些例子:

MIT
BSD-2-Clause
BSD-3-Clause
Apache-2.0
你可以在ament官方文档中找到完整的标识符列表,以及如何指定更复杂许可证的说明。

一旦你指定了合适的ament标识符,你就需要创建一个相应的LICENSE文件并将其放置在包的根目录中。你可以使用touch LICENSE命令来创建一个空的LICENSE文件,然后在其中添加你选择的标识符和其他信息,如作者、版权年份和其他声明。

在完成这些步骤后,你需要重新编译并运行你的节点,以确保警告已经被解决了。
NameError: name ‘rclpy’ is not defined
这个错误通常会在ROS 2 Python节点中出现,通常发生在没有正确导入rclpy包的情况下。

要解决这个问题,只需在你的Python脚本中添加以下导入:

import rclpy
这将导入rclpy包并使其在脚本中可用。如果你的脚本还需要使用其他ROS2相关的包,可以添加类似的导入语句来导入这些包。

如果你已经正确导入rclpy但是仍然遇到此错误,那么这可能是由于没有正确的ROS2环境变量导致的。请确保你已经正确安装ROS2,并使用以下命令启动ROS2环境:

source /opt/ros//setup.bash
注意,应该替换为你安装的ROS 2版本如foxy或者galactic等。

重启终端后,应该能够正确导入rclpy并运行你的节点。
N] [1684754219.113368985] [image_comp]: New publisher discovered on topic ‘/sensing/camera/traffic_light/image_raw’, offering incompatible QoS. No messages will be received from it. Last incompatible policy: RELIABILITY
这个错误通常是由于在发布者和订阅者之间定义的QoS策略不兼容导致的。QoS策略控制ROS 2话题中消息如何传输和丢弃。例如,reliability QoS策略决定在消息传输中是否可以容忍丢失消息。

在这种情况下,错误消息中指出订阅者和发布者之间存在不兼容的reliability QoS策略。这表明发布者使用非默认QoS策略,而订阅者使用默认QoS。因此,我们需要在订阅者的代码中指定一个明确的QoS策略来匹配发布者。

以下是一个在订阅者中指定ALLOWED_MATCHING_POLICY QoS的例子:

from rclpy.qos import QoSProfile, QoSReliabilityPolicy

Set QoS to match the publisher

qos_profile = QoSProfile(
reliability=QoSReliabilityPolicy.RMW_QOS_POLICY_RELIABILITY_RELIABLE,
depth=10,
durability=QoSDurabilityPolicy.RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL)

Create subscriber

self.subscription = self.create_subscription(
Image,
‘/sensing/camera/traffic_light/image_raw’,
self.listener_callback,
qos_profile)
上面的代码会将订阅者的可靠性QoS策略设置为与发布者相同的值,并将深度设置为10(如果需要,您可以根据需要调整这些值)。这样,订阅者就可以与发布者兼容,并能够顺利接收消息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值