qrb_ros_transport is a zero‑copy ROS 2 transport for Qualcomm robotics platforms. It’s implemented on top of REP 2007 (Type Adaptation), which lets a ROS node declare that a custom message type is interchangeable with a standard one — so the middleware can hand off the DMA‑buf file descriptor that the camera ISP wrote instead of serializing and copying the pixel payload.
In the stock path every subscriber receives its own copy of the frame, and every copy is a CPU memcpy. In the QRB path the producer and all consumers share the same DMA buffer — the fd is what travels through the ROS graph, not the pixels.
Supported adapted types
| QRB adapted type | Stock ROS interface |
|---|---|
qrb_ros::transport::type::Image | sensor_msgs::msg::Image |
qrb_ros::transport::type::PointCloud2 | sensor_msgs::msg::PointCloud2 |
An
Imu adapted type also exists upstream, but producing data through it requires qrb_sensor_client + the specific ICM-42688 IMU on the RB3 Gen2 kit. If you have that exact hardware, see qrb_ros_imu. For typical use cases the bandwidth case lives in Image and PointCloud2 — IMU payloads are tiny enough that zero-copy adds little.Supported targets
| Hardware |
|---|
| Qualcomm Dragonwing™ IQ‑9075 EVK |
IQ‑8275 EVK is not currently listed by the upstream
qrb_ros_transport README. Check the upstream repo for the latest supported targets before building.Vs. stock image_transport
Stock image_transport / sensor_msgs::Image always serializes the payload into the ROS message and copies it into each subscriber’s buffer. That’s fine for small topics and CPU-resident data, but it’s wasted work when the producer is a hardware block that wrote the frame into DMA memory (the camera ISP is the common case) and the consumer is another hardware block (GPU for color conversion, NPU for inference, EVA for computer-vision ops). qrb_ros_transport exists specifically for that hardware‑to‑hardware case — the pixels stay in DMA memory, and only the fd moves.
If both ends of your topic are CPU code, stock image_transport is fine and simpler. The zero‑copy win scales with (payload size × number of subscribers × number of node boundaries crossed).
Installation
These steps require Qualcomm Ubuntu and ROS 2 Jazzy. Start from Install Ubuntu on Qualcomm IoT Platforms and Install ROS Jazzy if you haven’t already. For Qualcomm Linux, use the QIRP SDK instead.
Usage
Add the adapted type as a dependency and write against it the same way you’d write against any typed ROS message — the middleware handles the rest.Build from source
Build from source
Install the development dependencies:Clone and build with
colcon:How it's built
How it's built
qrb_ros_transport sits on top of two upstream packages in the same org:You don’t interact with either directly when using qrb_ros_transport — they’re pulled in transitively. The pointers are here for readers who want the full stack or who need to port code to non-Qualcomm Linux SoCs with DMA-heap support:dmabuf_transport— portable REP 2007 adapted types forImageandPointCloud2. Works on any Linux 5.12+ SoC with a DMA heap.lib_mem_dmabuf— the userspace C++ DMA-buf allocation library. Use directly only if you’re doing non-ROS interop (GStreamer, V4L2, custom drivers, OpenGL ES).
Related
- Sample pipelines that use
qrb_ros_transportas the camera path: QRB ROS Samples. - Upstream source and latest docs:
qualcomm-qrb-ros/qrb_ros_transport.

