大家好,又见面了,我是你们的朋友全栈君。
一、机器人地图
机器人地图一般分为三种类型:栅格地图,拓扑地图,特征地图
1、栅格地图
栅格地图
栅格地图,在物流信息技术中有所涉猎,其就是构建一个个“小方块”,利用颜色信息来区分的地图的位置信息。在机器人建图中,栅格地图容易构建,表示且保存位置的唯一,对于短路径的规划方便;但栅格地图的路径规划效率不高,空间浪费(栅格的分辨率不依赖于环境的复杂度)并且也需要精确的机器人位置估计,其对于物体识别的人机交互问题效果不好。
2、拓扑地图
是指地图学中一种统计地图,一种保持点与线相对位置关系正确而不一定保持图形形状与面积、距离、方向正确的抽象地图。
拓扑地图
对于使用gmapping建图,所构建的是二维栅格地图。
二、gmapping与SLAM
对于建图,SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and Localization), 我们从名字就可以得知,其包含机器人的定位与地图的构建两部分,或者说并发建图与定位。对于这个问题的模型,就是如果将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边移动一边逐步描绘出此环境完全的地图(完全的地图是指不受障碍行进到房间可进入的每个角落,也就是熟知地图的障碍点)。定位与建图相辅相成、互相影响。
首先,构建地图要知道机器人的精确位姿,精确定位又需要给定的地图做参考。先讲已知精确位姿(坐标和朝向)的地图创建,机器人位置已知,通过激光雷达扫描到环境特征,即障碍物距离。可通过机器人坐标和朝向以及障碍物距离计算出障碍物的坐标,采用bresenham直线段扫面算法,障碍物所处的栅格标注为occupy,机器人所处的栅格与障碍物所处的栅格之间画直线,直线所到之处都为free。当然每个栅格并不是简单的非0即1,栅格的占据可用概率表示,若某一个栅格在激光束a扫描下标识为occupy,在激光束b扫描下也标识为occupy,那该栅格的占据概率就变大,反之,则变小。这样,机器人所处的环境就可以通过二维栅格地图来表征。
三、实现gmapping功能包的条件
1、一台安装了ROS并运行虚拟机的笔记本(或者其它的平台)。
对于ROS环境,所需要的ROS功能包有激光雷达的ROS功能包,gmapping功能包,机器人的驱动包,3个功能包都运行起来后需要编译节点连接,从而构建地图。当然,如果运行顺利,还可以插入一个按键,利用ROS包用来控制机器人的移动。
2、一台激光雷达
(未研究)在国内,现阶段激光雷达的效果也不错,能达到运行要求。
对于建图,机器人应该能检测深度信息与里程计信息。
3、以上都是之前学习的内容。但是除此以外,还必要一台机器人或者机器车,如irobot create或者turtlesim,此平台是必须的。
在这之前,除了在仿真环境里运行建图功能以外,一直没考虑到的问题是,是否只有小车才能承载激光雷达建图,用其他的工具是否可以。答案是不可以,因为运行gampping包需要里程计信息,也就是这个包需要知道你的机器人相对于你的开始位置运动了多少,转了多少角度等信息才可用进行地图的构建,里程计的信息是必须的,一般机器人的ROS驱动程序里都会包含,一般的里程计信息由车轮的转速编码器得到。
四、ROS中的gmapping功能包
slam-gmapping节点接收传感器/激光扫描信息并构建地图。可以通过ROS主题或服务检索地图。
1、订阅
gmapping订阅的其实非常简单,只有两种
tf (tf/tfMessage)
(需要进行激光,基准和测距的相关框架转换)
scan (sensor_msgs/LaserScan)
(激光扫描从中创建地图)
2、发布
(1) map_metadata(nav_msgs / MapMetaData)
从此主题获取地图数据,将其锁定并定期更新。
(2) map(nav_msgs / OccupancyGrid)
从此主题获取地图数据,将其锁定并定期更新
(3) 〜entropy (std_msgs / Float64)
机器人姿态分布的熵的估计值(较高的值表示较大的不确定性)。
3、 服务
dynamic_map(nav_msgs / GetMap)
调用此服务以获取地图数据。
五、gmapping参数
gmapping功能包采用粒子滤波算法。(待研究)
其中关键的参数为:
1. particles (int, default: 30) 这个参数决定gmapping算法中的粒子数,因为gmapping使用的是粒子滤波算法,粒子在不断地迭代更新,所以选取一个合适的粒子数可以让算法在保证比较准确的同时有较高的速度。
2. minimumScore (float, default: 0.0) 最小匹配得分,这个参数很重要,它决定了对激光的一个置信度,越高说明对激光匹配算法的要求越高,激光的匹配也越容易失败而转去使用里程计数据,而设的太低又会使地图中出现大量噪声,所以需要好好调整。
六、launch文件
启动节点:node pkg=”gmapping” type=”slam_gmapping” name=”slam_gmapping” output=”screen”
移动初始值(距离):param name=”lstep” value=”0.05”/
移动初始值(角度):param name=”astep” value=”0.05″/
param name=”lskip” value=”0″/(!–为0,表示所有的激光都处理,尽可能为零,如果计算压力过大,可以改成1–)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149349.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...