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

# 使用 cartographer_ros 启用 2D 激光雷达 SLAM

2D 激光雷达 SLAM 示例应用程序基于 `Cartographer`，能够基于 2D 激光雷达传感器完成室内地图构建和定位。它适用于机器人的室内导航。

<img
  src="https://mintcdn.com/qualcomm-prod/IP0o0G5fE3MFmCJ8/SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/result_2d_slam.png?fit=max&auto=format&n=IP0o0G5fE3MFmCJ8&q=85&s=9ed54294730f6c0846be1883c703aeec"
  style={{
width: "50%",
display: "block",
margin: "0 auto" }}
  width="883"
  height="1040"
  data-path="SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/result_2d_slam.png"
/>

<p style={{ textAlign: 'center', fontWeight: 'bold' }}>
  图：2D 激光雷达 SLAM 的示例结果
</p>

## `2D lidar SLAM` 的管道流程

<img
  src="https://mintcdn.com/qualcomm-prod/Wc1juBQkT-boIg_Z/SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/2d-lidar-slam-ga1.6.svg?fit=max&auto=format&n=Wc1juBQkT-boIg_Z&q=85&s=ec3606245d54b4cedbd8a11278ec33df"
  style={{
width: "100%",
display: "block",
margin: "0 auto" }}
  width="570"
  height="330"
  data-path="SDKs/QIR-SDK-2.0/media/80-65220-2-qirp-sdk-qsg/2d-lidar-slam-ga1.6.svg"
/>

<p style={{ textAlign: 'center', fontWeight: 'bold' }}>
  图：2D 激光雷达 SLAM 的管道流程
</p>

## 2D 激光雷达 SLAM 管道中使用的 ROS 节点

| **ROS 节点**                         | **描述**                                                                         |
| :--------------------------------- | :----------------------------------------------------------------------------- |
| `cartographer_node`                | 接收 `/scan` 和 `/odom` 话题，执行建图、定位，并保存地图或查询重定位状态。该节点基于 ROS 服务 `qrb_slam_command`。 |
| `cartographer_occupancy_grid_node` | 接收 `cartographer_node` 发送的地图相关话题，并发布 ROS 标准地图（`/static_map`）。                  |

## 2D 激光雷达 SLAM 中使用的 ROS 话题/服务

<p style={{ textAlign: 'center', fontWeight: 'bold' }}>
  表：2D 激光雷达 SLAM 中使用的 ROS 话题
</p>

<table>
  <thead>
    <tr>
      <th style={{ width: '30%' }}>ROS 话题</th>
      <th style={{ width: '40%' }}>类型</th>
      <th style={{ width: '30%' }}>发布者</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`/tracked_pose`</td>
      <td>`geometry_msgs.msg.PoseStamped`</td>
      <td>`cartographer_node`</td>
    </tr>

    <tr>
      <td>`/tf`</td>
      <td>`tf2_msgs.msg.TFMessage`</td>
      <td>`cartographer_node`</td>
    </tr>

    <tr>
      <td>`/submap_list`</td>
      <td>`cartographer_ros_msgs.msg.SubmapList`</td>
      <td>`cartographer_node`</td>
    </tr>

    <tr>
      <td>`/scan_matched_points2`</td>
      <td>`sensor_msgs.msg.PointCloud2`</td>
      <td>`cartographer_node`</td>
    </tr>

    <tr>
      <td>`/map`</td>
      <td>`nav_msgs.msg.OccupancyGrid`</td>
      <td>`cartographer_occupancy_grid_node`</td>
    </tr>
  </tbody>
</table>

<p style={{ textAlign: 'center', fontWeight: 'bold' }}>
  表：2D 激光雷达 SLAM 中使用的 ROS 服务
</p>

<table>
  <thead>
    <tr>
      <th style={{ width: '30%' }}>ROS 服务</th>
      <th style={{ width: '40%' }}>类型</th>
      <th style={{ width: '30%' }}>提供者</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`/qrb_slam_command`</td>
      <td>`qrb_ros_slam_msgs.srv.SlamCommand`</td>
      <td>`cartographer_node`</td>
    </tr>
  </tbody>
</table>

## 前提条件

* 您已按照[为运行示例应用程序设置环境](./set-up-env-for-sample-app)完成 **Set up the device**。
* 连接 RPLIDAR A3M1 的电源和 USB 端口。

## 运行开箱即用的 `2D lidar SLAM`

<Accordion title="试一试">
  <Steps>
    <Step title="设置机器人底盘">
      <Note>
        **注意** 以下配置仅适用于 Qualcomm 的机器人底盘。如果您使用的是自定义或第三方机器人底盘，请跳过此配置步骤，并应用适合您自己机器人底盘的配置。
      </Note>

      1. 打开一个连接到设备的新终端。
         ```bash theme={null}
         source /usr/share/qirp-setup.sh
         export ROS_DOMAIN_ID=124
         ```
      2. 选择机器人底盘型号。
         * 0604 AMR：`robot_base`（默认）
         * Mini AMR：`robot_base_mini`
         ```bash theme={null}
         export ROBOT_BASE_MODEL=robot_base_mini
         ```
      3. （可选）如果您没有将超声波传感器连接到 MCB，请禁用超声波紧急停止。
         ```bash theme={null}
         vi /usr/ros/jazzy/share/qrb_ros_robot_base/config/[robot base model file]
         # modify ultra_enable: false
         ```
      4. 启动机器人底盘 AMR。
         ```bash theme={null}
         ros2 launch qrb_ros_robot_base robot_base.launch.py
         ```
    </Step>

    <Step title="设置 2D 激光雷达">
      在新终端中，运行以下命令。

      ```bash theme={null}
      source /usr/share/qirp-setup.sh
      export ROS_DOMAIN_ID=124
      ros2 launch rplidar_ros rplidar_a3_launch.py
      ```
    </Step>

    <Step title="运行 2D 激光雷达 SLAM">
      在新终端中，运行以下命令。

      ```bash theme={null}
      source /usr/share/qirp-setup.sh
      export ROS_DOMAIN_ID=124
      ros2 launch cartographer_ros qrb_2d_lidar_slam.launch.py
      ```
    </Step>

    <Step title="运行 qrb_slam_service_request 脚本">
      在新终端中，运行以下命令。

      ```bash theme={null}
      source /usr/share/qirp-setup.sh
      export ROS_DOMAIN_ID=124
      chmod 777 /usr/ros/jazzy/share/cartographer_ros/scripts/qrb_slam_service_request.sh
      bash /usr/ros/jazzy/share/cartographer_ros/scripts/qrb_slam_service_request.sh
      ```
    </Step>

    <Step title="开始建图">
      在上一步打开的终端中，使用键盘发送控制指令，例如启动建图过程。
    </Step>
  </Steps>
</Accordion>
