> ## 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.

# 使用 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>

<img
  src="https://mintcdn.com/qualcomm-prod/BUW_rqJcTn92gBMR/SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/simulation_remote_assistant_detection.gif?s=82c257e3ea16d56534d273e76e2c4357"
  style={{
width: "70%",
display: "block",
margin: "0 auto" }}
  width="2400"
  height="1080"
  data-path="SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/simulation_remote_assistant_detection.gif"
/>

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

## 仿真远程助手的管线流程

<img
  src="https://mintcdn.com/qualcomm-prod/IP0o0G5fE3MFmCJ8/SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/ga1.6-remote-assistant-sim.svg?fit=max&auto=format&n=IP0o0G5fE3MFmCJ8&q=85&s=d94eaf3ed95f96e63ec54981d56effcb"
  style={{
width: "70%",
display: "block",
margin: "0 auto" }}
  width="2002"
  height="2132"
  data-path="SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/ga1.6-remote-assistant-sim.svg"
/>

<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>

## 仿真远程助手管线中使用的 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>

## 前提条件

* 您已完成[为运行示例应用设置环境](./set-up-env-for-sample-app)中的以下设置（跳过 **Set up host 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/` 目录。
  ```powershell theme={null}
  mkdir /opt/model/
  mv coco8.yaml yolov8_det_qcs9075.bin yolov8_det_qcs8275.bin /opt/model/
  ```

## 设置仿真环境

1. 在主机上，根据 [QRB ROS Simulation](https://github.com/qualcomm-qrb-ros/qrb_ros_simulation) 的 **README** 完成以下操作，构建 Qualcomm 机器人仿真环境。确保设备和主机位于同一局域网内，并且可以通过 ROS 通信相互通信。
   1. 在 Ubuntu24.04 主机或 Docker 上设置开发环境。
   2. 从源码构建。
2. 在主机上，在仿真办公室世界中运行 `QRB Robot Base AMR`。
   ```cpp 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
   ```

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

在开发套件上，运行以下命令：

```python theme={null}
# setup runtime environment
(ssh) mount -o remount rw /usr
(ssh) source /opt/ros/jazzy/setup.bash
(ssh) 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
(ssh) ros2 launch simulation_remote_assistant map_nav_setup.launch.py

# launch the yolo_detectcion.launch.py
# qcs9075 RB8 bin htp
(ssh) 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
(ssh) 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
(ssh) ros2 run simulation_remote_assistant task_manager_node

# input the fix commands in the task_manager_node terminal like
(ssh) Go to office to check person
```

## 构建并运行 `simulation_remote_assistant`

1. 在主机的终端中，运行以下命令：

   <Note>
     **注意**

     * `<qir_version>`：QIR SDK 的版本，请参阅 [QIR SDK 2.0 发行说明](../../Key-Documents/QIR-SDK-Release-Notes/robotics-sdk-qli2.0-062026)。
     * `<qir_decompressed_path>`：QIR SDK 解压后的路径。
   </Note>

   1. 构建示例应用项目。
      ```powershell theme={null}
      # set up the QIR SDK environment
      (ssh) tar -zxf qirp-sdk_<qir_version>.tar.gz
      (ssh) cd <qir_decompressed_path>/qirp-sdk
      (ssh) source setup.sh
      # build sample
      (ssh) cd <qir_decompressed_path>/qirp-sdk/qirp-samples/robotics/sample_remote_assistant
      (ssh) colcon build
      ```
   2. 打包示例应用并推送到设备。
      ```powershell theme={null}
      # package and push build result of sample
      (ssh) cd <qir_decompressed_path>/qirp-sdk/qirp-samples/robotics/sample_remote_assistant/install/simulation_remote_assistant
      (ssh) tar -czf simulation_remote_assistant.tar.gz lib share
      (ssh) scp simulation_remote_assistant.tar.gz root@[ip-addr]:/opt/
      ```
2. 在开发套件上，运行以下命令：
   1. 安装示例应用。
      ```python theme={null}
      # install sample package
      (ssh) 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) 中的步骤运行示例应用。
