> 技术文档 > 基于ROS2机器人建图工具包Gmapping

基于ROS2机器人建图工具包Gmapping

ROS 2 中使用 Gmapping 进行 2D SLAM(即时定位与地图构建) 的完整指南如下:


1. Gmapping 简介

Gmapping 是经典的 基于粒子滤波的 2D SLAM 算法,依赖:

  • 激光雷达(LiDAR)数据
  • 机器人里程计(Odometry)
  • 适用于低计算资源的场景

📌 ROS 2 现状
官方 gmapping 仅支持 ROS 1,但可通过 ROS 1 Bridge替代方案(如 Cartographer) 在 ROS 2 中使用。


2. ROS 2 中的替代方案

(1)使用 Cartographer(推荐)

Cartographer 是 Google 开发的 跨 ROS 1/ROS 2 的 SLAM 算法,支持 2D/3D:

sudo apt install ros-<distro>-cartographer ros-<distro>-cartographer-ros

启动示例:

ros2 launch cartographer_ros demo_backpack_2d.launch.py

(2)通过 ROS 1 Bridge 运行 Gmapping

若必须使用 Gmapping:

  1. 在 ROS 1 中运行 Gmapping
    rosrun gmapping slam_gmapping
  2. 通过 ros1_bridge 转发话题
    ros2 run ros1_bridge dynamic_bridge
  3. 在 ROS 2 中订阅/发布相关话题(如 /scan/map)。

3. 纯 ROS 2 实现方案

方案 1:slam_toolbox(官方推荐)

slam_toolbox 是 ROS 2 原生支持的 SLAM 工具包,兼容 Gmapping 功能:

sudo apt install ros-<distro>-slam-toolbox

启动命令:

ros2 launch slam_toolbox online_async_launch.py

方案 2:使用 Nav2 + SLAM

Nav2 内置 SLAM 功能:

ros2 launch nav2_bringup tb3_simulation_launch.py slam:=True

4. 关键话题与参数

功能 ROS 1 (Gmapping) ROS 2 (slam_toolbox) 激光话题 /scan /scan 里程计话题 /odom /odom 输出地图 /map /map 算法类型 粒子滤波 图优化

5. 代码示例(slam_toolbox)

Launch 文件配置

<launch> <node pkg=\"slam_toolbox\" type=\"async_slam_toolbox_node\" name=\"slam_toolbox\"> <param name=\"base_frame\" value=\"base_link\"/> <param name=\"odom_frame\" value=\"odom\"/> <param name=\"map_frame\" value=\"map\"/> <param name=\"scan_topic\" value=\"/scan\"/> </node></launch>

手动保存地图

ros2 run nav2_map_server map_saver_cli -f ~/map

6. 常见问题

Q1:ROS 2 没有原生 Gmapping?

  • 原因:Gmapping 未正式移植到 ROS 2。
  • 解决方案:使用 slam_toolboxcartographer

Q2:地图不更新?

  • 检查激光数据是否正常:
    ros2 topic echo /scan --no-arr
  • 确保里程计话题 /odom 已发布。

Q3:建图漂移严重?

  • 优化里程计(如使用 robot_localization 包融合 IMU + 轮速计)。

7. 总结

方法 适用场景 安装命令 slam_toolbox ROS 2 原生 sudo apt install ros--slam-toolbox Cartographer 大场景高精度 sudo apt install ros--cartographer ROS 1 Bridge 兼容旧代码 需配置 ros1_bridge

推荐优先使用 slam_toolboxCartographer,如需进一步帮助可提供具体机器人配置! 🚀