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

# 启用 2D 激光雷达 SLAM

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

## 2D 激光雷达 SLAM 的管线流程

下图展示了 2D 激光雷达同步定位与地图构建 (SLAM) 的管线流程：

<Frame caption="2D 激光雷达 SLAM 管线。">
  <img src="https://mintlify.s3.us-west-1.amazonaws.com/qualcomm-prod/zh/SDKs/QIR-SDK-Ubuntu/images/image32.svg" alt="2D lidar scan, robot base odometry, and the QRB ROS SLAM client feeding the Cartographer ROS node and the Cartographer occupancy grid node." />
</Frame>

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

下表描述了 2D 激光雷达 SLAM 管线中使用的 ROS 节点。

| 节点名                                | 功能                                                                                  |
| ---------------------------------- | ----------------------------------------------------------------------------------- |
| `cartographer_node`                | 接收 `/scan` 和 `/odom` topic，执行地图构建、定位，并保存地图或查询重定位状态。该节点基于 ROS 服务 `qrb_slam_command`。 |
| `cartographer_occupancy_grid_node` | 接收由 `cartographer_node` 发送的与地图相关的 topic，并发布 ROS 标准地图 (`/map`)。                      |

## 2D 激光雷达 SLAM 管线中使用的 ROS topic

下表描述了 2D 激光雷达 SLAM 管线中使用的 ROS topic。

| ROS topic               | 类型                                     | 说明                 |
| ----------------------- | -------------------------------------- | ------------------ |
| `/scan`                 | `sensor_msgs.msg.LaserScan`            | 接收激光雷达扫描数据。        |
| `/odom`                 | `nav_msgs.msg.Odometry2`               | 接收里程计数据。           |
| `/tracked_pose`         | `geometry_msgs.msg.PoseStamped`        | 发布当前跟踪到的机器人位姿。     |
| `/scan_matched_points2` | `sensor_msgs.msg.PointCloud2`          | 发布用于调试和可视化的扫描匹配点云。 |
| `/tf`                   | `tf2_msgs.msg.TFMessage`               | 发布用于多帧转换的坐标变换信息。   |
| `/submap_list`          | `cartographer_ros_msgs.msg.SubmapList` | 发布用于地图拼接和可视化的子图列表。 |
| `/map`                  | `nav_msgs.msg.OccupancyGrid`           | 发布占用栅格地图。          |

## 2D 激光雷达 SLAM 管线中使用的 ROS 服务

下表描述了 2D 激光雷达 SLAM 管线中使用的 ROS 服务。

| ROS 服务              | 类型                                  | 说明                                                                                                                                                  |
| ------------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `/qrb_slam_command` | `qrb_ros_slam_msgs.srv.SlamCommand` | 提供 SLAM 控制服务，例如启动、停止和保存地图。请参见 GitHub 上的 [qrb\_ros\_slam\_msgs](https://github.com/qualcomm-qrb-ros/qrb_ros_interfaces/tree/main/qrb_ros_slam_msgs)。 |

## 前提条件

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

## 运行开箱即用的 2D 激光雷达 SLAM

<Steps>
  <Step title="安装 2D 激光雷达 SLAM 软件包">
    ```bash theme={null}
    sudo apt install ros-jazzy-qcom-cartographer ros-jazzy-qrb-ros-slam-msgs ros-jazzy-qcom-cartographer-ros
    ```
  </Step>

  <Step title="设置机器人底盘">
    * 如果您使用的是 Qualcomm 的机器人底盘，请对其进行设置。

    * 如果您使用的是自定义或第三方机器人底盘，请应用适合您自己机器人底盘的配置。确保机器人底盘可以在 topic `/odom` 上发布类型为 `nav_msgs.msg.Odometry2` 的里程计数据。
  </Step>

  <Step title="设置 2D 激光雷达">
    根据 [使用 `rplidar-ros2` 启用基本 RPLIDAR 处理](./enable-basic-rplidar-handling-with-rplidar-ros2) 设置 2D 激光雷达。

    ```bash theme={null}
    source /opt/ros/jazzy/setup.bash export ROS_DOMAIN_ID=124
    ros2 launch rplidar_ros rplidar_a3_launch.py
    ```
  </Step>

  <Step title="运行 2D 激光雷达 SLAM">
    ```bash theme={null}
    source /opt/ros/jazzy/setup.bash
    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}
    #Env set up
    source /opt/ros/jazzy/setup.bash
    export ROS_DOMAIN_ID=124
    sh /opt/ros/jazzy/share/cartographer_ros/scripts/qrb_slam_service_request.sh
    ```
  </Step>
</Steps>
