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

# 使用 simulation_remote_assistant 在模拟器中体验远程助手

`simulation_remote_assistant` 示例应用程序是一个 ROS 软件包,它将 AMR 用作虚拟办公环境中的远程助手。用户可以通过输入自然语言命令与机器人交互,例如"去办公室查看某人"。机器人可以自主导航到指定位置,并按指令执行对象检测任务。

<Note>
  **注意**

  更多信息,请参见 GitHub 上的 [simulation\_remote\_assistant](https://github.com/qualcomm-qrb-ros/qrb_ros_samples/tree/main/robotics/simulation_remote_assistant)。
</Note>

<video
  autoPlay
  muted
  loop
  playsInline
  width={2400}
  height={1080}
  src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-staging/zh/SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/simulation_remote_assistant_detection.mp4"
  style={{
width: "100%",
display: "block",
margin: "0 auto" }}
/>

<p style={{ textAlign: 'center', fontWeight: 'bold' }}>
  图: `simulation_remote_assistant` 的示例效果
</p>

## Simulation Remote Assistant 的管道流程

<img
  src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-staging/zh/SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/ga1.6-remote-assistant-sim.svg"
  style={{
width: "100%",
display: "block",
margin: "0 auto" }}
/>

<p style={{ textAlign: 'center', fontWeight: 'bold' }}>
  图: `simulation_remote_assistant` 的管道流程
</p>

## simulation\_remote\_assistant 管道中使用的 ROS 节点

<table>
  <thead>
    <tr>
      <th style={{ width: '30%' }}>ROS 节点</th>
      <th style={{ width: '70%' }}>描述</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`qrb_ros_simulation`</td>
      <td>`qrb_ros_simulation` 是一个用于设置 Qualcomm 机器人仿真环境的 ROS 软件包。详细信息,请参见 [QRB ROS Simulation](https://github.com/qualcomm-qrb-ros/qrb_ros_simulation)。</td>
    </tr>

    <tr>
      <td>`nn_inference_node`</td>
      <td>加载已训练的 AI 模型、接收预处理后的图像、执行推理并发布结果。详细信息,请参见 [NN Inference Node](https://github.com/qualcomm-qrb-ros/qrb_ros_nn_inference)。</td>
    </tr>

    <tr>
      <td>`yolo_preprocess_node`</td>
      <td rowSpan={3}>为 Yolo 模型执行预处理和后处理。详细信息,请参见 [QRB ROS Tensor Process](https://github.com/qualcomm-qrb-ros/qrb_ros_tensor_process)。</td>
    </tr>

    <tr>
      <td>`yolo_detection_postprocess_node`</td>
    </tr>

    <tr>
      <td>`yolo_detection_overlay_node`</td>
    </tr>

    <tr>
      <td>`cartographer_node`</td>
      <td>处理传感器数据以执行 SLAM。</td>
    </tr>

    <tr>
      <td>`cartographer_occupancy_grid_node`</td>
      <td>发布 ROS 占用栅格地图。</td>
    </tr>

    <tr>
      <td>`nav2_bringup`</td>
      <td>用于机器人导航的 Navigation2 堆栈。</td>
    </tr>

    <tr>
      <td>`build_map_node`</td>
      <td>构建办公室世界的地图。</td>
    </tr>

    <tr>
      <td>`nav_preparation_node`</td>
      <td>重新定位并启动导航节点。</td>
    </tr>

    <tr>
      <td>`task_manager_node`</td>
      <td>解析输入命令并执行操作。</td>
    </tr>
  </tbody>
</table>

## Simulation Remote Assistant 管道中使用的 ROS 主题

<table>
  <thead>
    <tr>
      <th style={{ width: '20%' }}>ROS 主题</th>
      <th style={{ width: '30%' }}>类型</th>
      <th style={{ width: '20%' }}>发布者</th>
      <th style={{ width: '30%' }}>描述</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`/scan`</td>
      <td>`sensor_msgs::msg::LaserScan`</td>
      <td>`qrb_ros_simulation`</td>
      <td>用于 SLAM 和建图的 2D 激光雷达扫描数据。</td>
    </tr>

    <tr>
      <td>`/map`</td>
      <td>`nav_msgs::msg::OccupancyGrid`</td>
      <td>`cartographer_occupancy_grid_node`</td>
      <td>用于导航的占用栅格地图。</td>
    </tr>

    <tr>
      <td>`/tf`</td>
      <td>`tf2_msgs::msg::TFMessage`</td>
      <td>`qrb_ros_simulation` / `cartographer_node`</td>
      <td>坐标系之间的坐标变换。</td>
    </tr>

    <tr>
      <td>`/odom`</td>
      <td>`nav_msgs::msg::Odometry`</td>
      <td>`qrb_ros_simulation`</td>
      <td>用于位姿估计的里程计数据。</td>
    </tr>

    <tr>
      <td>`/cmd_vel`</td>
      <td>`geometry_msgs::msg::Twist`</td>
      <td>`qrb_ros_simulation`</td>
      <td>用于机器人运动的速度命令。</td>
    </tr>

    <tr>
      <td>`/goal_pose`</td>
      <td>`geometry_msgs::msg::PoseStamped`</td>
      <td>`task_manager_node`</td>
      <td>导航的目标位姿。</td>
    </tr>

    <tr>
      <td>`/camera/color/image_raw`</td>
      <td>`sensor_msgs::msg::Image`</td>
      <td>`qrb_ros_simulation`</td>
      <td>来自仿真相机的 RGB 图像。</td>
    </tr>

    <tr>
      <td>`/qrb_inference_input_tensor`</td>
      <td>`qrb_ros_tensor_list_msgs::msg::TensorList`</td>
      <td>`yolo_preprocess_node`</td>
      <td>用于推理的预处理输入张量。</td>
    </tr>

    <tr>
      <td>`/yolo_detect_tensor_output`</td>
      <td>`qrb_ros_tensor_list_msgs::msg::TensorList`</td>
      <td>`nn_inference_node`</td>
      <td>用于检测的推理输出张量。</td>
    </tr>

    <tr>
      <td>`/yolo_detect_result`</td>
      <td>`vision_msgs::msg::Detection2DArray`</td>
      <td>`yolo_detection_postprocess_node`</td>
      <td>检测到的对象以 2D 边界框结果表示。</td>
    </tr>

    <tr>
      <td>`/yolo_detect_overlay`</td>
      <td>`sensor_msgs::msg::Image`</td>
      <td>`yolo_detection_overlay_node`</td>
      <td>带有边界框的检测叠加图像。</td>
    </tr>
  </tbody>
</table>

## 前提条件

<Accordion title="试一试">
  * 您已根据 [设置运行示例应用程序的环境](./set-up-env-for-sample-app) 完成以下设置(跳过 **设置主机 Docker** 的设置)。
    * 设置设备
    * 设置主机计算机
  * 按照 [使用 QAIHUB 生成 YOLOv8 模型](https://github.com/qualcomm-qrb-ros/qrb_ros_tensor_process/tree/main/cv_tensor_process/yolo_v8_process#1-generate-yolov8-model-using-qaihub:~:text=Generate%20YOLOv8%20model%20using%20QAIHUB) 中的步骤生成模型文件,并下载 [coco-labels](https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/coco8.yaml) YAML 文件。然后,将它们推送到设备上的 `/opt/model/` 目录。
    ```bash theme={null}
    mkdir /opt/model/
    mv coco8.yaml yolov8_det_qcs9075.bin yolov8_det_qcs8275.bin /opt/model/
    ```

  ### 设置仿真环境

  <Steps>
    <Step title="在主机计算机上构建仿真环境">
      根据 [QRB ROS Simulation](https://github.com/qualcomm-qrb-ros/qrb_ros_simulation) 的 **README** 完成以下操作,构建 Qualcomm 机器人仿真环境。确保设备和主机位于同一本地网络中,并可以通过 ROS 通信相互通信。

      1. 在 Ubuntu24.04 主机或 Docker 上设置开发环境。
      2. 从源代码构建。
    </Step>

    <Step title="在主机上运行 QRB Robot Base AMR">
      在仿真办公室世界中运行 `QRB Robot Base AMR`。

      ```bash theme={null}
      # Set the ROS_DOMAIN_ID
      export ROS_DOMAIN_ID=78
      ros2 launch qrb_ros_sim_gazebo gazebo_robot_base_mini.launch.py \
      world_model:=office \
      initial_x:=1.0 \
      initial_y:=6.0 \
      enable_depth_camera:=false
      ```
    </Step>
  </Steps>
</Accordion>

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

在开发套件上,运行以下命令:

<Accordion title="试一试">
  ```python theme={null}
  # setup runtime environment
  mount -o remount rw /usr
  source /opt/ros/jazzy/setup.bash
  export ROS_DOMAIN_ID=78

  # In /opt/ros/jazzy/share/nav2_bringup/params/nav2_params.yaml,
  # change nav2_mppi_controller::MPPIController to nav2_graceful_controller::GracefulController.

  # launch the map_nav_setup.launch.py for auto mapping
  ros2 launch simulation_remote_assistant map_nav_setup.launch.py

  # launch the yolo_detectcion.launch.py
  # qcs9075 RB8 bin htp
  ros2 launch simulation_remote_assistant yolo_detectcion.launch.py model:=/opt/model/yolov8_det_qcs9075.bin backend_option:=libQnnHtp.so label_file:=/opt/model/coco8.yaml
  # qcs8275 RB4 bin htp
  ros2 launch simulation_remote_assistant yolo_detectcion.launch.py model:=/opt/model/yolov8_det_qcs8275.bin backend_option:=libQnnHtp.so label_file:=/opt/model/coco8.yaml


  # launch the task_manager node
  ros2 run simulation_remote_assistant task_manager_node

  # input the fix commands in the task_manager_node terminal like
  Go to office to check person
  ```
</Accordion>

## 构建并运行 `simulation_remote_assistant`

<Accordion title="试一试">
  <Note>
    **注意**

    * `<qir_version>`:QIR SDK 的版本,请参见 [QIR SDK 2.0 发布说明](./release-notes)。
    * `<qir_decompressed_path>`:QIR SDK 解压后的路径。
  </Note>

  <Steps>
    <Step title="在主机计算机上构建和打包">
      1. 构建示例应用程序项目。
         ```bash title="SSH Session" theme={null}
         # set up the QIR SDK environment
         tar -zxf qirp-sdk_<qir_version>.tar.gz
         cd <qir_decompressed_path>/qirp-sdk
         source setup.sh
         # build sample
         cd <qir_decompressed_path>/qirp-sdk/qirp-samples/robotics/sample_remote_assistant
         colcon build
         ```
      2. 打包示例应用程序并推送到设备。
         ```bash title="SSH Session" theme={null}
         # package and push build result of sample
         cd <qir_decompressed_path>/qirp-sdk/qirp-samples/robotics/sample_remote_assistant/install/simulation_remote_assistant
         tar -czf simulation_remote_assistant.tar.gz lib share
         scp simulation_remote_assistant.tar.gz root@[ip-addr]:/opt/
         ```
    </Step>

    <Step title="在开发套件上安装并运行">
      1. 安装示例应用程序。
         ```bash title="SSH Session" theme={null}
         # install sample package
         tar --no-overwrite-dir --no-same-owner -zxf /opt/simulation_remote_assistant.tar.gz -C /usr/ros/jazzy/
         ```
      2. 使用 [运行开箱即用的 simulation\_remote\_assistant](#run-out-of-the-box-simulation_remote_assistant) 中的步骤运行示例应用程序。
    </Step>
  </Steps>
</Accordion>
