為解決斜坡下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/