> ## 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_sample_pick_and_place 启用抓取与放置

> RML-63 机械臂抓取与放置示例应用实现了一个基于 C++ 的 ROS2 节点。它使用 MoveIt2 进行运动规划，使用 Gazebo 进行物理仿真，展示自主抓取与放置操作。

下面是一个示例结果，展示了机器人底座在模拟器中的抓取与放置操作。

<Frame>
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/SDKs/QIR-SDK-Ubuntu/images/image25.gif" alt="Gazebo simulation of a robotic arm with a gripper picking an object from a table in a warehouse world, with controller logs." />
</Frame>

## `simulation_sample_pick_and_place` 软件结构

下图展示了 `simulation_sample_pick_and_place` 的软件结构：

<Frame caption="simulation_sample_pick_and_place 软件结构。">
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/SDKs/QIR-SDK-Ubuntu/images/image27.svg" alt="Software structure with the pick and place node, arm MoveIt config, and launch scripts on the device, and Gazebo in the host Docker." />
</Frame>

## `simulation_sample_pick_and_place` 软件结构中使用的 ROS 节点

下表描述了 `simulation_sample_pick_and_place` 软件结构中使用的 ROS 节点。

| ROS 节点                       | 说明                                                                                                     |
| ---------------------------- | ------------------------------------------------------------------------------------------------------ |
| `qrb_ros_simulation`         | 设置 Qualcomm 机器人仿真环境。参见 [qrb\_ros\_simulation](https://github.com/qualcomm-qrb-ros/qrb_ros_simulation)。 |
| `qrb_ros_arm_pick_and_place` | 定义抓取和放置位置，支持 ROS2 `launch.py` 配置参数                                                                     |

## `simulation_sample_pick_and_place` 软件结构中使用的 ROS 话题

下表描述了 `simulation_sample_pick_and_place` 软件结构中使用的 ROS 话题。

| ROS 话题                                  | 类型                                      | 说明                              |
| --------------------------------------- | --------------------------------------- | ------------------------------- |
| `/joint_states`                         | `<sensor_msgs.msg.JointState>`          | 所有机器人关节的实时关节位置、速度和力矩数据。         |
| `/hand_controller/controller_state`     | `<control_msgs.msg.ControllerState>`    | 夹爪控制器的当前状态和状态信息。                |
| `/hand_controller/joint_trajectory`     | `<trajectory_msgs.msg.JointTrajectory>` | 发送给夹爪关节以执行运动的轨迹命令。              |
| `/rm_group_controller/controller_state` | `<control_msgs.msg.ControllerState>`    | 机械臂控制器的当前状态和状态信息。               |
| `/rm_group_controller/joint_trajectory` | `<trajectory_msgs.msg.JointTrajectory>` | 发送给机械臂关节以执行运动的轨迹命令。             |
| `/robot_description`                    | `<std_msgs.msg.String>`                 | 用于机器人建模和可视化的 XML 格式 URDF 机器人描述。 |
| `/robot_description_semantic`           | `<std_msgs.msg.String>`                 | 用于 MoveIt 规划和配置的 SRDF 语义机器人描述。  |

## 前提条件

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

## 从源码构建 `simulation_sample_pick_and_place`

当你需要修改示例代码时，可以从源码构建 `simulation_sample_pick_and_place`。设备端步骤包括安装依赖、克隆源码仓库和构建包。

### 设备步骤

<Steps>
  <Step title="安装依赖">
    a. 安装 `qcom-adreno-dev` 以解决 Moveit2 所需的图形库冲突。

    ```bash theme={null}
    sudo apt install -y qcom-adreno-dev
    ```

    b. 安装 QIR SDK 以恢复包。

    ```bash theme={null}
    sudo apt install -y qirp-sdk
    source /usr/share/qirp-setup.sh
    ```

    c. 为 ROS 2 Jazzy 安装 MoveIt。

    ```bash theme={null}
    sudo apt install -y ros-dev-tools
    sudo apt install -y ros-jazzy-moveit
    ```
  </Step>

  <Step title="从 qrb_ros_samples 仓库下载源码">
    ```bash theme={null}
    mkdir -p ~/qrb_ros_ws/src && cd ~/qrb_ros_ws/src
    git clone -b jazzy-rel https://github.com/qualcomm-qrb-ros/qrb_ros_samples.git
    ```
  </Step>

  <Step title="从源码构建示例">
    ```bash theme={null}
    cd ~/qrb_ros_ws/src/qrb_ros_samples/robotics/simulation_sample_pick_and_place
    rosdep install -i --from-path ./ --rosdistro jazzy -y
    colcon build
    ```
  </Step>
</Steps>

## 在主机 Docker 上启动 Gazebo

<Steps>
  <Step title="在主机上启动 QRB 机械臂">
    根据 [QRB ROS Simulation](https://github.com/qualcomm-qrb-ros/qrb_ros_simulation) 的 **Build from source** 部分在主机上启动 QRB 机械臂。使用相同的本地网络和 `ROS_DOMAIN_ID` 以确保设备能够通过 ROS 通信。
  </Step>

  <Step title="启动 Gazebo">
    使用以下命令启动 Gazebo：

    ```bash theme={null}
    source install/setup.bash
    export ROS_DOMAIN_ID=55
    ros2 launch qrb_ros_sim_gazebo gazebo_rml_63_gripper.launch.py world_model:=warehouse initial_x:=2.2 initial_y:=-2 initial_z:=1.025 initial_yaw:=3.14159 initial_pitch:=0.0 initial_roll:=0.0 use_sim_time:=true
    ```
  </Step>

  <Step title="启动控制器">
    在世界环境渲染完成后，在 Gazebo 中选择 **Play** 按钮，打开另一个终端，使用以下命令启动控制器：

    ```bash theme={null}
    source install/setup.bash
    export ROS_DOMAIN_ID=55
    ros2 launch qrb_ros_sim_gazebo gazebo_rml_63_gripper_load_controller.launch.py
    ```
  </Step>
</Steps>

## 开箱即用运行 `simulation_sample_pick_and_place`

要在仿真中运行抓取与放置示例应用，请使用以下命令：

此启动文件会为机器人加载 MoveIt2 配置，然后使用机械臂执行预定义的抓取与放置运动。

```bash theme={null}
source install/setup.bash
export ROS_DOMAIN_ID=55
ros2 launch simulation_sample_pick_and_place simulation_sample_pick_and_place.launch.py
```
