gmapping 学习
为解决斜坡下gmapping定位的问题,开始关注gmapping。
<launch> <arg name="scan_topic" default="scan" /> //laser的topic名称,与自己的激光的topic相对应 <arg name="base_frame" default="base_footprint"/>//机器人的坐标系 <arg name="odom_frame" default="odom"/>//世界坐标 <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">//启动slam的节点 <param name="base_frame" value="$(arg base_frame)"/> <param name="odom_frame" value="$(arg odom_frame)"/> <param name="map_update_interval" value="0.01"/>//地图更新的一个间隔,两次scanmatch的间隔,地图更新也受scanmach的影响,如果scanmatch没有成功的话,是不会更新地图的 <param name="maxUrange" value="4.0"/>//set maxUrange < maximum range of the real sensor <= maxRange <param name="maxRange" value="5.0"/> <param name="sigma" value="0.05"/> <param name="kernelSize" value="3"/> <param name="lstep" value="0.05"/>optimize机器人移动的初始值(距离) <param name="astep" value="0.05"/>//optimize机器人移动的初始值(角度) <param name="iterations" value="5"/>//icp的迭代次数 <param name="lsigma" value="0.075"/> <param name="ogain" value="3.0"/> <param name="lskip" value="0"/>//为0,表示所有的激光都处理,尽可能为零,如果计算压力过大,可以改成1 <param name="minimumScore" value="30"/>//很重要,判断scanmatch是否成功的阈值,过高的话会使scanmatch失败,从而影响地图更新速率 <param name="srr" value="0.01"/>//以下四个参数是运动模型的噪声参数 <param name="srt" value="0.02"/> <param name="str" value="0.01"/> <param name="stt" value="0.02"/> <param name="linearUpdate" value="0.05"/>//机器人移动linearUpdate距离,进行scanmatch <param name="angularUpdate" value="0.0436"/>机器人选装angularUpdate角度,进行scanmatch <param name="temporalUpdate" value="-1.0"/> <param name="resampleThreshold" value="0.5"/> <param name="particles" value="8"/>//很重要,粒子个数 <!-- <param name="xmin" value="-50.0"/> <param name="ymin" value="-50.0"/> <param name="xmax" value="50.0"/> <param name="ymax" value="50.0"/> make the starting size small for the benefit of the Android client's memory... --> <param name="xmin" value="-1.0"/>//map初始化的大小 <param name="ymin" value="-1.0"/> <param name="xmax" value="1.0"/> <param name="ymax" value="1.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>
需要关注的一个参数:
- particles (int, default: 30) gmapping算法中的粒子数,因为gmapping使用的是粒子滤波算法,粒子在不断地迭代更新,所以选取一个合适的粒子数可以让算法在保证比较准确的同时有较高的速度。
- minimumScore (float, default: 0.0) 最小匹配得分,这个参数很重要,它决定了对激光的一个置信度,越高说明对激光匹配算法的要求越高,激光的匹配也越容易失败而转去使用里程计数据,而设的太低又会使地图中出现大量噪声,所以需要权衡调整。
(待续)
关于上斜坡的问题
上斜坡的时候机器人会误将斜坡认为时静态障碍物,因为在之前先验地图中并未出现,机器人无法匹配地图,认为自己在错的位置,一直重新定位自己在地图上的位置。
见ros anwser http://answers.ros.org/question/199332/problem-mapping-with-turtlebot-at-slope-area/