> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 qrb_ros_colorspace_convert 在 NV12 和 RGB888 之间转换

`qrb_ros_colorspace_convert` 示例应用在 NV12 和 RGB888 格式之间进行转换。

Qualcomm 的智能设备（例如 Qualcomm Dragonwing<sup>TM</sup> IQ-9075 Evaluation Kit）使用 NV12 作为默认的图像色彩空间转换格式。然而，大多数 ROS 2 图像处理节点期望 RGB888。使用 `qrb_ros_colorspace_convert` 来桥接这两者。`qrb_ros_colorspace_convert` 示例应用实现了以下功能：

* 通过 ROS 节点 API 将 NV12 转换为 RGB888。
* 通过 ROS 节点 API 将 RGB888 转换为 NV12。
* 接受并返回 `dmabuf` 文件描述符，以便共享缓冲区而不是复制。
* 通过 QRB ROS 传输发送和接收图像。
* 通过 OpenGL ES 在 GPU 上运行转换。

## `qrb_ros_colorspace_convert` 的流水线流程

<img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/color-space-convert-pipeline.svg" style={{width: "90%"}} />

<p style={{ textAlign: 'center', fontWeight: 'bold' }}>
  图：`qrb_ros_colorspace_convert` 的流水线流程
</p>

## `qrb_ros_colorspace_convert` 流水线中使用的 ROS 节点

|         **ROS 节点**        |                                      **说明**                                     |
| :-----------------------: | :-----------------------------------------------------------------------------: |
|     `custom_ros_node`     | `custom_ros_node` 是将输入图像信息发布到 colorspace\_convert\_node 的 ROS 包。你需要实现该 ROS2 节点。 |
| `colorspace_convert_node` |         `colorspace_convert_node` 是一个用于在 NV12 和 RGB888 之间转换色彩空间的 ROS 包。         |

## `qrb_ros_colorspace_convert` 流水线中使用的 ROS topic

| **ROS topic** |          **消息类型**         |           **发布者/订阅者**          |          **说明**          |
| :-----------: | :-----------------------: | :----------------------------: | :----------------------: |
|  `/image_raw` | `sensor_msgs::msg::Image` |           订阅来自其他节点的图像          |   输入的 NV12/RGB888 编码图像。  |
|    `/image`   | `sensor_msgs::msg::Image` | 由 `colorspace_convert_node` 发布 | 发布转换后的 NV12/RGB888 编码图像。 |

## 前提条件

* 你已根据 [设置运行示例应用的环境](./set-up-env-for-sample-app) **设置设备**。
* `custom_ros_node` 已准备就绪。
* 你已将设备连接到显示监视器。

## 开箱即用运行 `qrb_ros_colorspace_convert`

<Accordion title="试一试">
  <Steps>
    <Step title="设置运行环境">
      `ROS_DOMAIN_ID` 的取值范围：\[0, 232]

      ```bash title="SSH Session" theme={null}
      # Set up the runtime environment
      source /usr/share/qirp-setup.sh
      export ROS_DOMAIN_ID=xx
      # Set up the Weston environment
      export XDG_RUNTIME_DIR=/dev/socket/weston/
      mkdir -p $XDG_RUNTIME_DIR
      export WAYLAND_DISPLAY=wayland-1
      # Set up the shared memory
      export FASTRTPS_DEFAULT_PROFILES_FILE=/usr/ros/jazzy/share/qrb_ros_colorspace_convert/config/large_message_profile.xml
      ```
    </Step>

    <Step title="运行示例 qrb_ros_colorspace_convert">
      ```bash title="SSH Session" theme={null}
      # To convert color space from NV12 to RGB888, run the following command
      ros2 launch qrb_ros_colorspace_convert colorspace_convert.launch.py 'conversion_type:=nv12_to_rgb8' 'latency_fps_test:=False'
      # To convert color space from RGB888 to NV12, run the following command
      ros2 launch qrb_ros_colorspace_convert colorspace_convert.launch.py 'conversion_type:=rgb8_to_nv12' 'latency_fps_test:=False'
      ```

      **结果**

      要确认转换效果，请比较输入主题和输出主题的编码：

      ```bash title="SSH Session" theme={null}
      ros2 topic echo /image_raw | grep "encoding"
      ros2 topic echo /image | grep "encoding"
      ```

      这两个命令会报告不同的编码 — 根据你选择的方向，一个是 NV12，另一个是 RGB8。
    </Step>
  </Steps>
</Accordion>
