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 树一致。 - 保存的地图为全灰:建图过程中机器人未移动或激光未覆盖环境,需重新遍历环境后再保存。