Skip to main content
qrb_ros_transport 是面向 Qualcomm 机器人平台的零拷贝 ROS 2 传输。它基于 REP 2007(类型适配)实现,允许 ROS 节点声明自定义消息类型可与标准类型互换——因此中间件可以直接传递摄像头 ISP 写入的 DMA‑buf 文件描述符,而不是序列化并复制像素负载。 在标准路径中,每个订阅者都会收到帧的独立副本,而每个副本都是一次 CPU memcpy。在 QRB 路径中,生产者和所有消费者共享同一个 DMA 缓冲区——在 ROS 计算图中传递的是 fd,而不是像素。

支持的适配类型

上游也存在 Imu 适配类型,但通过它生产数据需要 qrb_sensor_client 以及 RB3 Gen2 套件上特定的 ICM-42688 IMU。如果您正好有这套硬件,请参见 qrb_ros_imu。对于典型用例,带宽收益体现在 ImagePointCloud2 上——IMU 负载非常小,零拷贝带来的收益不大。

支持的目标

上游 qrb_ros_transport README 目前未列出 IQ‑8275 EVK。构建之前,请在上游仓库中查看最新的受支持目标。

与标准 image_transport 对比

标准 image_transport / sensor_msgs::Image 总是将负载序列化到 ROS 消息中,并将其复制到每个订阅者的缓冲区。这对于小话题和驻留在 CPU 中的数据没有问题,但当生产者是将帧写入 DMA 内存的硬件模块(摄像头 ISP 是常见情况)、而消费者是另一个硬件模块(GPU 做颜色转换、NPU 做推理、EVA 做计算机视觉运算)时,这就是无谓的开销。qrb_ros_transport 正是为这种硬件到硬件的场景而生——像素留在 DMA 内存中,移动的只有 fd。 如果话题的两端都是 CPU 代码,那么标准 image_transport 已经够用且更简单。零拷贝的收益随(负载大小 × 订阅者数量 × 跨越的节点边界数量)而扩大。

安装

这些步骤需要 Qualcomm® IoT 平台上的 UbuntuROS 2 Jazzy。如果尚未安装,请从在 Qualcomm IoT 平台上安装 Ubuntu安装 ROS Jazzy 开始。对于 Qualcomm Linux,请改用 QIRP SDK
1

添加 Qualcomm IoT PPA

2

安装 Debian 软件包

用法

将适配类型添加为依赖项,然后像针对任何有类型的 ROS 消息一样编写代码——其余的由中间件处理。
安装开发依赖项:
使用 colcon 克隆并构建:
qrb_ros_transport 建立在同一组织的两个上游软件包之上:使用 qrb_ros_transport 时您不会直接与这两者交互——它们会被间接引入。此处提供链接是为想了解完整技术栈、或需要将代码移植到具有 DMA-heap 支持的非 Qualcomm Linux SoC 的读者准备的:
  • dmabuf_transportImagePointCloud2 的可移植 REP 2007 适配类型。可在任何具有 DMA heap 的 Linux 5.12+ SoC 上运行。
  • lib_mem_dmabuf — 用户空间 C++ DMA-buf 分配库。只有在进行非 ROS 互操作(GStreamer、V4L2、自定义驱动、OpenGL ES)时才直接使用。

相关内容