> ## 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_benchmark 评估 ROS 组件性能

> qrb_ros_benchmark 是一款基准测试工具，专为在 Qualcomm 机器人平台上评估 ROS 组件的性能而设计。它提供可复用的组件用于对各种消息类型和 ROS 节点进行基准测试，并重点支持零拷贝传输机制。

`qrb_ros_benchmark` 基于 [ros2\_benchmark](https://github.com/NVIDIA-ISAAC-ROS/ros2_benchmark) 构建，并使用专用组件对其进行扩展，以对 QRB ROS 传输类型进行基准测试，包括：

* QRB 传输类型（Image、IMU、PointCloud2）

* DMABuf 传输类型（Image、PointCloud2）

* 标准 ROS 消息类型

## 软件结构

下图展示了 `qrb_ros_benchmark` 的软件结构。

<Frame caption="qrb_ros_benchmark 的软件结构。">
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/SDKs/QIR-SDK-Ubuntu/images/image22.png" alt="Layered stack with the QRB ROS benchmark monitor and playback nodes above the ROS2 benchmark nodes, QRB transport components, and ROS2." />
</Frame>

基本用法与 [ros2\_benchmark](https://github.com/NVIDIA-ISAAC-ROS/ros2_benchmark) 类似，以下是 `qrb_ros_benchmark` 独有支持的消息类型：

**QRB 传输类型：**

* `qrb_ros/transport/type/Image`

* `qrb_ros/transport/type/Imu`

* `qrb_ros/transport/type/PointCloud2`

* `qrb_ros_tensor_list_msgs::msg::TensorList`

**DMABuf 传输类型：**

* `dmabuf_transport/type/Image`

* `dmabuf_transport/type/PointCloud2`

## 前提条件

你已根据[安装 QIR SDK](./install-the-qir-sdk)完成设备设置，并在设备上安装了 ROS2 Jazzy 和 Qualcomm Intelligent Robotics (QIR) SDK。

## 开箱即用运行 `qrb_ros_benchmark`

<Steps>
  <Step title="安装 qrb_ros_benchmark 包">
    ```bash Install the packages theme={null}
    sudo apt install ros-jazzy-qrb-ros-benchmark
    ```
  </Step>

  <Step title="创建用于评估 qrb_ros/transport/type/Image 的最小模板">
    ```bash Create the launch file theme={null}
    vim qrb-ros-transport-image-type_launch.py
    ```

    <Accordion title="qrb-ros-transport-image-type_launch.py">
      ```python qrb-ros-transport-image-type_launch.py theme={null}
        from launch_ros.actions import ComposableNodeContainer
        from launch_ros.descriptions import ComposableNode
        from ros2_benchmark import ImageResolution
        from ros2_benchmark import ROS2BenchmarkConfig, ROS2BenchmarkTest
        def launch_setup(container_prefix, container_sigterm_timeout):
            data_loader_node = ComposableNode(
                name='DataLoaderNode',
                namespace=TestQrbNode.generate_namespace(),
                package='ros2_benchmark',
                plugin='ros2_benchmark::DataLoaderNode',
            )
            # QrbPlaybackNode
            playback_node = ComposableNode(
                name='QrbPlaybackNode',
                namespace=TestQrbNode.generate_namespace(),
                package='qrb_ros_benchmark',
                plugin='qrb_ros::benchmark::QrbPlaybackNode',
                parameters=[{
                    'data_formats': [
                        'qrb_ros/transport/type/Image'
                    ],
                }],
                remappings=[
                    ('buffer/input0', '/data_loader_image'),
                    ('input0', '/playback_image')
                ]
            )
            # Insert QRB ROS nodes
            # QrbMonitorNode
            monitor_node = ComposableNode(
                name='QrbMonitorNode',
                namespace=TestQrbNode.generate_namespace(),
                package='qrb_ros_benchmark',
                plugin='qrb_ros::benchmark::QrbMonitorNode',
                parameters=[{
                    'monitor_data_format': 'qrb_ros/transport/type/Image',
                }]
            )
            composable_node_container = ComposableNodeContainer(
                name='container',
                namespace=TestQrbNode.generate_namespace(),
                package='rclcpp_components',
                executable='component_container_mt',
                prefix=container_prefix,
                sigterm_timeout=container_sigterm_timeout,
                composable_node_descriptions=[
                    data_loader_node,
                    playback_node,
                    monitor_node,
                    # Insert QRB ROS nodes
                ],
                output='screen'
            )
            return [composable_node_container]
        def generate_test_description():
            return TestQrbNode.generate_test_description_with_nsys(launch_setup)
        class TestQrbNode(ROS2BenchmarkTest):
            config = ROS2BenchmarkConfig(
                benchmark_name='Qrb_ros_transport image Test Benchmark',
                input_data_path='/path/to/rosbag',
                publisher_upper_frequency=100.0,
                publisher_lower_frequency=10.0,
                playback_message_buffer_size=10
            )
            def test_benchmark(self):
                self.run_benchmark()
      ```
    </Accordion>
  </Step>

  <Step title="启动 qrb-ros-transport-image-type 基准测试">
    ```bash Start the benchmark theme={null}
    source /opt/ros/jazzy/setup.bash
    launch_test qrb-ros-transport-image-type_launch.py
    ```
  </Step>
</Steps>

## 从源码构建

<Steps>
  <Step title="安装依赖">
    ```bash Install the dependencies theme={null}
    sudo apt install ros-jazzy-qrb-ros-transport-image-type
    ```
  </Step>

  <Step title="下载源码并使用 colcon 构建">
    ```bash Clone the repositories and build theme={null}
    mkdir -p ~/ros-ws/src
    cd ~/ros-ws/src
    git clone https://github.com/qualcomm-qrb-ros/ros2_benchmark.git
    git clone https://github.com/qualcomm-qrb-ros/qrb_ros_transport.git
    git clone https://github.com/qualcomm-qrb-ros/lib_mem_dmabuf.git
    git clone https://github.com/qualcomm-qrb-ros/qrb_ros_imu.git
    git clone https://github.com/qualcomm-qrb-ros/dmabuf_transport.git
    git clone https://github.com/qualcomm-qrb-ros/qrb_ros_benchmark.git
    cd ~/ros-ws/
    colcon build
    ```
  </Step>

  <Step title="运行和调试">
    ```bash Source the workspace theme={null}
    source install/setup.bash
    ```
  </Step>

  <Step title="运行 qrb-ros-benchmark">
    根据[开箱即用运行 `qrb_ros_benchmark`](./evaluate-ros-component-performance-with-qrb_ros_benchmark#run-out-of-the-box-qrb_ros_benchmark) 的步骤 2 运行 `qrb-ros-benchmark`。
  </Step>
</Steps>
