在 ROS 中使用 slam_gmapping 进行 SLAM 建图,需要按照以下步骤操作:
1. 安装相关包
首先确保已安装 ROS 和 gmapping 包:
sudo apt-get install ros-$ROS_DISTRO-gmapping
将$ROS_DISTRO
替换为你的 ROS 版本(如melodic
或noetic
)。
2. 准备机器人配置文件
创建或编辑机器人的 URDF/XACRO 文件,确保已正确配置:
- 激光雷达传感器:需发布
/scan
话题(类型为sensor_msgs/LaserScan
) - 里程计:需发布
/odom
话题(类型为nav_msgs/Odometry
)或/tf
变换 - 机器人基座坐标系:通常为
base_link
或base_footprint
3. 编写启动文件
创建一个 launch 文件(如gmapping.launch
),配置并启动 slam_gmapping:
<launch>
<!-- 启动gmapping节点 -->
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">
<!-- 配置参数 -->
<param name="odom_frame" value="odom"/>
<param name="base_frame" value="base_link"/>
<param name="map_frame" value="map"/>
<!-- 激光雷达参数 -->
<param name="scan_topic" value="scan"/>
<param name="minimumScore" value="500"/>
<param name="linearUpdate" value="0.2"/>
<param name="angularUpdate" value="0.2"/>
<param name="temporalUpdate" value="-1.0"/>
<!-- 地图参数 -->
<param name="map_update_interval" value="5.0"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/>
<param name="srr" value="0.1"/>
<param name="srt" value="0.2"/>
<param name="str" value="0.1"/>
<param name="stt" value="0.2"/>
<param name="linearUpdate" value="0.5"/>
<param name="angularUpdate" value="0.436"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="30"/>
<param name="xmin" value="-50.0"/>
<param name="ymin" value="-50.0"/>
<param name="xmax" value="50.0"/>
<param name="ymax" value="50.0"/>
<param name="delta" value="0.05"/>
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
</node>
<!-- 启动rviz可视化 -->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find YOUR_PACKAGE)/rviz/gmapping.rviz"/>
</launch>
4. 创建 Rviz 配置文件
在rviz/gmapping.rviz
中添加以下显示项:
- Map:订阅
/map
话题 - LaserScan:订阅
/scan
话题 - TF:显示坐标系关系
5. 运行 SLAM 建图
启动机器人驱动(发布激光和里程计数据):
roslaunch YOUR_PACKAGE robot.launch
启动 gmapping 建图:
roslaunch YOUR_PACKAGE gmapping.launch
6. 控制机器人移动
使用键盘或手柄控制机器人在环境中移动,gmapping 会实时建图:
roslaunch YOUR_PACKAGE teleop.launch
7. 保存地图
建图完成后,使用以下命令保存地图:
rosrun map_server map_saver -f ~/map
地图将保存为map.pgm
(图像)和map.yaml
(配置文件)。
参数调优建议
-
激光雷达参数:
minimumScore
:匹配分数阈值,提高可减少误匹配linearUpdate
/angularUpdate
:更新频率,减小可提高地图精度
-
粒子滤波参数:
particles
:粒子数量,环境复杂时需增加resampleThreshold
:重采样阈值,减小可减少粒子耗散
-
地图分辨率:
delta
:地图分辨率,默认 0.05m,精细地图可设为 0.02m
常见问题及解决
-
地图漂移严重:
- 检查里程计精度,尝试使用 IMU 辅助
- 增加
particles
数量 - 减小
linearUpdate
/angularUpdate
值
-
建图速度慢:
- 降低激光扫描频率
- 减少
particles
数量 - 增大
linearUpdate
/angularUpdate
值
-
激光数据显示异常:
- 检查 TF 树,确保
base_link
到laser
的变换正确 - 检查激光话题名称和类型
- 检查 TF 树,确保
通过以上步骤,你可以在 ROS 中成功使用 slam_gmapping 进行 SLAM 建图。建图效果取决于机器人平台、传感器质量和环境复杂度,可能需要根据实际情况调整参数。