ROS实践(四)机器人建图(gmapping)
目录
一、SLAM技术
二、常用工具和传感器
三、相关功能包
1. gmapping建图功能包
2. map_server
四、SLAM 建图实验
1. 配置gmapping(launch文件)
2. 启动机器人仿真(含机器人以及传感器)
3. 运行gmapping节点
4. 启动rviz可视化工具
5. 保存地图文件
一、SLAM技术
地图构建(Mapping)是机器人在运动过程中逐步建立和更新其所处环境的地图。
(Simultaneous Localization and Mapping)即同时定位与地图构建,是一种概念,旨在让机器人从未知环境的未知地点出发,在运动过程中通过重复观测到的环境特征定位自身位置和姿态,再根据自身位置构建周围环境的增量式地图,从而达到同时定位和地图构建的目的。
SLAM技术使用相机、激光雷达、惯性测量单元等传感器来收集环境信息,然后用算法将这些信息融合起来,以确定设备在未知环境中的位置,并构建一张环境地图。
二、常用工具和传感器
激光雷达(LiDAR):用于生成环境的高精度地图。
RGBD相机:能够提供深度信息的相机,用于地图构建和障碍物检测。
超声波传感器:常用于短距离的障碍物检测。
IMU(惯性测量单元):用于机器人姿态估计。
轮式里程计(Odometry):通过机器人轮子的转动估算机器人的位置和姿态。
三、相关功能包
1. gmapping建图功能包
gmapping
是一种基于粒子滤波算法的 SLAM工具,它可以帮助机器人在未知环境中创建地图的同时定位自己。具体来说,
gmapping
是 ROS 中实现激光SLAM的一个软件包,它结合了激光扫描器数据和机器人运动信息,实时生成并更新地图。常用在需要通过激光雷达进行建图的机器人系统中,尤其适用于移动机器人、无人车等场景。
gmapping
包含了完成 SLAM所需的所有核心算法,它会自动利用激光扫描数据和机器人的运动信息来进行地图构建和位置估算。只要你正确配置了相关参数和话题,就可以通过启动gmapping
节点来实现SLAM功能,而不必从头实现复杂的 SLAM 算法。(1)下载
gmapping
并不是 ROS 系统自带的核心组件,而是一个额外的 ROS 软件包。通常在使用 ROS 时,gmapping
需要单独安装并配置。sudo apt-get install ros-<ros_version>-gmapping
其中,<ros_version> 需要替换为你使用的 ROS 版本名称(如 melodic、noetic 等)。
(2)如何使用
为了使用gmapping功能包,需要配置相应的参数,如激光雷达的topic、里程计信息、地图分辨率等。这些参数通常通过launch文件或命令行参数进行设置。在运行gmapping节点时,它会订阅指定的传感器数据和里程计信息,并输出构建的地图数据。
2. map_server
- 定义:map_server是ROS中的一个功能包,用于加载和保存地图。
- 功能:在启动时,map_server可以加载一个地图(如.pgm格式的地图),并通过ROS话题和服务提供地图数据。
- 命令:使用
rosrun map_server map_server map_file.yaml
命令可以启动map_server节点,其中map_file.yaml
是描述地图的YAML文件。而rosrun map_server map_saver -f map
命令用于保存当前地图数据到文件中。
四、SLAM 建图实验
1. 配置gmapping(launch文件)
功能:下面这段代码的主要功能是启动
gmapping
节点,使用激光雷达和机器人自身的运动数据来进行 SLAM(同步定位与地图构建)。具体来说,它通过激光扫描获取环境信息,并将这些信息转化为地图,同时估算机器人在该地图中的位置。通过 SLAM,机器人可以在没有事先地图的情况下自动探索并创建自己的环境地图。要完成的工作:我们只需要配置好机器人坐标系和激光数据的相关参数。启动
gmapping
节点。让机器人在环境中移动,gmapping
会实时构建地图并定位机器人,它会帮你自动完成 SLAM 的工作。目录: 在功能包的launch目录下编写gmapping_slam.launch文件,如下所示:
<launch><arg name="set_base_frame" default="base_footprint"/><arg name="set_odom_frame" default="odom"/><arg name="set_map_frame" default="map"/><arg name="scan_topic" default="/scan" /><arg name="simulation" default= "false"/> <param name="/use_sim_time" value="$(arg simulation)" /> <!-- Gmapping 启动 gmapping 节点进行SLAM建图 --> <node pkg="gmapping" type="slam_gmapping" name="gmapping" output="screen"><!-- 设置基本坐标框架 --><param name="base_frame" value="$(arg set_base_frame)"/><!-- 设置里程计坐标框架 --><param name="odom_frame" value="$(arg set_odom_frame)"/><!-- 设置地图坐标框架 --><param name="map_frame" value="$(arg set_map_frame)"/><!-- 设置地图更新的时间间隔(单位:秒) --><param name="map_update_interval" value="2.0"/><!-- 设置最大激光扫描距离 --><param name="maxUrange" 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="minimumScore" value="50"/><!-- 设置机器人运动噪声的标准差 --><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="1.0"/><param name="angularUpdate" value="0.2"/><!-- 设置时间更新的阈值 --><param name="temporalUpdate" value="0.5"/><!-- 设置重采样的阈值 --><param name="resampleThreshold" value="0.5"/><!-- 设置粒子滤波的粒子数 --><param name="particles" value="100"/><!-- 设置地图边界 --><param name="xmin" value="-10.0"/><param name="ymin" value="-10.0"/><param name="xmax" value="10.0"/><param name="ymax" value="10.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"/><!-- 将扫描话题重映射为传入的扫描话题名称 --><remap from="scan" to="$(arg scan_topic)"/></node> </launch>
代码中做了以下几件事:
①设置坐标系:定义了机器人、里程计(机器人位置数据)、和地图之间的坐标关系。
②配置 SLAM 参数:包括地图更新频率、激光扫描最大范围、噪声标准差、地图分辨率等。这些参数影响到地图的精度、更新速度以及机器人对环境的感知。
③设置激光传感器的行为:通过设置激光扫描的步长、增益、采样范围等来调整扫描的精度。
④重映射扫描话题:将接收到的激光数据从指定的
scan_topic
输入到slam_gmapping
,用于创建地图。
2. 启动机器人仿真(含机器人以及传感器)
ROS实践(三)xacro文件基础(urdf扩展)第4章节内容。
https://blog.csdn.net/qq_48361010/article/details/146174461?spm=1001.2014.3001.5501详情查看上文。
3. 运行gmapping节点
使用代码:roslaunch my_package gmapping_slam.launch simulation:=true ,这里会发布一个/map的话题,用于后面rviz来订阅这个话题显示地图。
4. 启动rviz可视化工具
使用命令:rviz启动。启动完成后需要添加以下组件。
5. 保存地图文件
启动rviz仿真后,通过:rosrun teleop_twist_keyboard teleop_twist_keyboard.py遥控节点来使得机器人运动去扫描建图。
完成建图以后使用命令:roscd my_package/map/ && rosrun map_server map_saver -f my_map,来保存当前地图为my_map,并保存到map文件夹中。保存后退出所有进程即可。 这样激光雷达建图就完成了,保存了地图的数据和照片。