> ## 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_camera 运行零拷贝相机

`qrb_ros_camera` 示例应用程序实现了一个相机 ROS2 节点,以在数据从相机服务器输出时启用零拷贝性能。该示例大大降低了 ROS 节点之间的延迟。

<Note>
  **注意**

  Dragonwing IQ-9075 评估套件仅支持以下相机:

  * `ov9282`
  * `LI-VENUS-OX03F10-96717-120H camera`
  * `LI-VENUS-OX03F10-OAX40-GM2A-118H camera`
</Note>

## Dragonwing IQ-9075 上连接不同相机的 DIP 拨码开关操作

<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/qrb-ros-camera_IQ-9075-EVK-main-board.svg" alt="main-board" style={{ display: 'block', margin: '0 auto' }} />

<p style={{ textAlign: 'center', fontWeight: 'bold' }}>
  图: Dragonwing IQ-9075 评估套件上的 DIP 拨码开关
</p>

|                     **DIP 设置**                     |                                               **启用的相机**                                              |
| :------------------------------------------------: | :--------------------------------------------------------------------------------------------------: |
|                    保持所有引脚为 DOWN。                   |                                              **ov9282**                                              |
| 将 SW1 的 Pin5、Pin6、Pin7 和 Pin8 设为 ON,其他所有引脚保持 DOWN。 |      <ul><li>`LI‑VENUS‑OX03F10‑96717‑120H`</li><li>`LI‑VENUS‑OX03F10‑OAX40‑GM2A‑118H`</li></ul>      |
|      将 SW1 的 Pin7 和 Pin8 设为 ON,其他所有引脚保持 DOWN。      | <ul><li>`LI‑VENUS‑OX03F10‑OAX40‑GM2A‑118H`</li><li>**ov9282**(连接到 MIPI CSI0 或 MIPI CSI1 时)</li></ul> |

<p style={{ textAlign: 'center', fontWeight: 'bold' }}>
  表: 相机的 DIP 设置
</p>

<Note>
  **注意**

  有关如何连接相机的信息,请参见 Connect camera hardware sensor。此文档仅对授权用户可用。
</Note>

## `qrb_ros_camera` 的管道流程

Qualcomm Camera-Server 提供从相机传感器获取的相机数据。`qrb_ros_camera` 使用此相机服务器获取最新的相机数据。

<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/qrb-ros-camera-pipeline1.5.svg" alt="pipeline" style={{ display: 'block', margin: '0 auto' }} />

## `qrb_ros_camera` 管道中使用的 ROS 节点

| **ROS 节点** |                                    **描述**                                   |
| :--------: | :-------------------------------------------------------------------------: |
|  `CAMERA`  | 发布 `/cam${camera_id}_${stream_name}`、`/cam${camera_id}_camera_info` ROS 主题。 |

* `camera_id` 表示相机设备 ID,默认值为 0。
* `stream_name` 表示相机流名称,默认值为 "stream1"。

## `qrb_ros_camera` 管道中使用的 ROS 主题

|             **ROS 主题**            |            **消息类型**            |   **发布者/订阅者**  |     **描述**    |
| :-------------------------------: | :----------------------------: | :------------: | :-----------: |
| `/cam${camera_id}_${stream_name}` |    `sensor_msgs::msg::Image`   | 由 `camera` 发布。 | 发布 NV12 编码图像。 |
|   `/cam${camera_id}_camera_info`  | `sensor_msgs::msg::CameraInfo` | 由 `camera` 发布。 |    发布相机信息。    |

## 前提条件

您已根据 [设置运行示例应用程序的环境](./set-up-env-for-sample-app) **设置好设备**。

## 运行开箱即用的 `qrb_ros_camera`

<Accordion title="试一试">
  <Steps>
    <Step title="运行相机 ROS 节点">
      a. 设置 CAMX 叠加层

      ```bash title="SSH Session" theme={null}
      echo -n "camx" > /var/data
      efivar -n 882f8c2b-9646-435f-8de5-f208ff80c1bd-VendorDtbOverlays -w -f /var/data
      efivar -n 882f8c2b-9646-435f-8de5-f208ff80c1bd-VendorDtbOverlays -p
      sync
      reboot
      ```

      b. 检查状态

      要确认 CamX 叠加层已生效，请运行以下命令。当叠加层已应用时脚本返回 `0`。

      ```bash title="SSH Session" theme={null}
      /usr/libexec/qmmf-server/check-camx-overlay.sh
      echo $?                   
      ```

      c. 运行 `qrb_ros_camera` 节点。

      ```bash title="SSH Session" theme={null}
      ros2 launch qrb_ros_camera qrb_ros_camera_launch.py
      ```
    </Step>

    <Step title="获取相机图像数据">
      a. 在设备上设置 QIR SDK 和 ROS2 环境。

      <Note>
        `ROS_DOMAIN_ID` 的取值范围：\[0, 232]
      </Note>

      ```bash theme={null}
      ssh root@[ip-addr]
      ```

      ```bash title="SSH Session" theme={null}
      source /usr/share/qirp-setup.sh
      export ROS_DOMAIN_ID=xx
      ```

      b. 验证 ROS 主题。

      ```bash title="SSH Session" theme={null}
      ros2 topic echo /cam0_stream1
      ```
    </Step>
  </Steps>
</Accordion>

## 构建并运行 `qrb_ros_camera`

<Accordion title="试一试">
  <Steps>
    <Step title="在主机上构建 qrb_ros_camera">
      ```bash theme={null}
      cd <qirp_decompressed_workspace>
      source setup.sh
      cd qirp-samples/platform/qrb_ros_camera
      colcon build --merge-install --cmake-args ${CMAKE_ARGS} -DBUILD_TESTING=ON
      ```
    </Step>

    <Step title="将 qrb_ros_camera 推送到设备">
      ```bash theme={null}
      cd qirp-samples/platform/qrb_ros_camera/install
      tar czvf qrb_ros_camera.tar.gz lib share include
      scp qrb_ros_camera.tar.gz root@[ip-addr]:/opt/
      ssh root@[ip-addr]
      ```

      ```bash title="SSH Session" theme={null}
      tar --no-overwrite-dir --no-same-owner -zxf /opt/qrb_ros_camera.tar.gz -C /usr/ros/jazzy/
      ```
    </Step>

    <Step title="在设备上运行 qrb_ros_camera">
      按照 [运行开箱即用的 `qrb_ros_camera`](#run-out-of-the-box-qrb_ros_camera) 中的步骤操作。
    </Step>
  </Steps>
</Accordion>

## 限制

相机 ROS 节点中支持的格式为 NV12。当前不支持对图像大小的动态更改。
