1. 使用gmapping构建室内二维栅格地图

任务目标

在 Gazebo 仿真环境中启动一个包含激光雷达的移动机器人,通过键盘遥控机器人遍历室内环境,使用 gmapping 算法实时构建二维栅格地图,最终将地图保存为图片与 YAML 文件,供后续导航使用。

环境与依赖

  • Ubuntu 20.04 + ROS Noetic(或 Ubuntu 18.04 + ROS Melodic)
  • 已安装 ros-<distro>-gmapping、ros-<distro>-teleop-twist-keyboard、ros-<distro>-map-server
  • Gazebo 仿真环境:使用 turtlebot3_gazebo 的 turtlebot3_world.launch(包含室内障碍物与激光雷达)

实现步骤

整体流程分为四个终端:启动仿真环境、启动 gmapping 建图、启动键盘遥控、保存地图。gmapping 节点订阅激光扫描与里程计话题,输出栅格地图话题 /map,通过 map_server 的 map_saver 保存当前地图。

关键完整代码

# 终端1:启动 Gazebo 仿真环境(含差速驱动机器人与激光雷达)
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_gazebo turtlebot3_world.launch

# 终端2:启动 gmapping 建图节点
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping

# 终端3:键盘遥控机器人移动,遍历环境
export TURTLEBOT3_MODEL=burger
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
# 操作:使用 WASD 控制机器人前进/后退/左转/右转,缓慢遍历整个室内环境,
# 观察 RViz 中 /map 话题的栅格地图逐步完善,确保所有墙壁与障碍物轮廓清晰无重影

# 终端4:保存当前构建的地图(在 catkin 工作空间目录下执行)
rosrun map_server map_saver -f ~/map_result
# 执行后生成 map_result.pgm(栅格图片)与 map_result.yaml(地图元数据)

验证方法与通过条件

  • 在 RViz 中确认 /map 话题正常显示,地图随机器人移动逐步扩展,墙壁与障碍物边缘清晰、无大面积黑色噪点或重影。
  • 执行 map_saver 后,检查 ~/map_result.pgm 与 ~/map_result.yaml 是否生成。
  • 打开 map_result.yaml,确认 resolution(通常为 0.05)、origin 坐标与地图尺寸合理,且 image 字段指向存在的 .pgm 文件。
  • 用图像查看器打开 .pgm 文件,白色区域为可通行区域,黑色为障碍物,灰色为未知区域,地图整体与仿真环境布局一致。

常见问题

  • 地图出现大量重影:遥控速度过快或转向过急导致激光匹配漂移,应降低速度、缓慢平移与旋转。
  • 地图不更新:确认 /scan 与 /odom 话题有数据输出(rostopic echo /scan 检查),且 base_frame 参数与机器人实际 TF 树一致。
  • 保存的地图为全灰:建图过程中机器人未移动或激光未覆盖环境,需重新遍历环境后再保存。
gmapping 建图数据流 /scan 激光雷达数据 /odom 里程计数据 gmapping slam_gmapping 节点 /map 栅格地图话题 map_saver 保存 .pgm + .yaml 订阅 /scan 与 /odom,输出栅格地图 /map,map_saver 将当前地图落盘