基于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:
- 在 ROS 1 中运行 Gmapping:
rosrun gmapping slam_gmapping
- 通过
ros1_bridge
转发话题:ros2 run ros1_bridge dynamic_bridge
- 在 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. 关键话题与参数
/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_toolbox
或cartographer
。
Q2:地图不更新?
- 检查激光数据是否正常:
ros2 topic echo /scan --no-arr
- 确保里程计话题
/odom
已发布。
Q3:建图漂移严重?
- 优化里程计(如使用
robot_localization
包融合 IMU + 轮速计)。
7. 总结
sudo apt install ros--slam-toolbox
sudo apt install ros--cartographer
ros1_bridge
推荐优先使用 slam_toolbox 或 Cartographer,如需进一步帮助可提供具体机器人配置! 🚀