目錄
Gmapping
Gmapping基於激光雷達進行構圖,採用Rao-Blackwellized粒子濾波算法,需要機器人提供里程計信息。
Rao-Blackwellized推導式:https://people.eecs.berkeley.edu/~pabbeel/cs287-fa12/slides/RBPF.pdf
wiki:https://en.wikipedia.org/wiki/Rao%E2%80%93Blackwell_theorem
git:https://github.com/ros-perception/slam_gmapping
1.安裝與使用方式
安裝gmapping
apt install ros-kinetic-gmapping
安裝map-server,地圖導出工具
apt install ros-kinetic-map-server
功能包準備
gitee地址:https://gitee.com/alen2020/ros_gmapping.git
mbot_description:車體描述文件,urdf
mbot_gazebo:gazebo文件,用於提供虛擬地圖
mbot_navigation:gmmping啓動包
啓動方式
#啓動gazebo,創建虛擬地圖
$ roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
#啓動gmpping構圖
$ roslaunch mbot_navigation gmapping_demo.launch
#啓動車體控制程序
$ roslaunch mbot_teleop mbot_teleop.launch
打開後看到rviz界面,此時可控制小車跑一圈來進行建圖
隨着機器人的移動地圖逐漸成型
保存地圖
構圖完成後,執行命令保存地圖
$ rosrun map_server map_saver -f mymap
保存之後生成兩個文件,一個地圖pgm,一個yaml文件
- image: 地圖名稱
- resolution: 地圖分辨率,最小柵格寬度(單位米)
- origin: 地圖中左下角像素的二維姿態,爲(x,y,yaw),偏航爲逆時針旋轉(偏航= 0表示無旋轉)
- occupied_thresh: 大於此閾值的像素被視爲完全佔用。
- free_thresh: 小於此閾值的像素被認爲是完全空閒的。
- negate: 是否應該反轉 白/黑 空閒/佔用(閾值的解釋不受影響)
可選參數:
mode:可以有三個值之一:trinary,scale或raw。 Trinary是默認值。
參數解釋:
如果像素的COLOR值x在[0,255]範圍內,我們應該如何解釋這個值?首先,我們將整數x轉換爲一個浮點數p,轉換公式具體取決於yaml中negate標誌的定義。
如果negate爲0,則p =(255 - x)/ 255.0。這意味着黑色(0)現在具有最高值(1.0)而白色(255)具有最低值(0.0)。
如果negate爲1,則p = x / 255.0。這是圖像的非標準解釋。
- trinary
-
標準解釋是三元解釋,即解釋所有值,使輸出最終成爲三個值之一。
如果p> occupied_thresh,則輸出值100以指示單元格已被佔用。
如果p <free_thresh,則輸出值0以指示單元格是空閒的。
否則,輸出-1 a.k.a. 255(作爲無符號字符),以指示該單元格未知
- scale
-
這將調整上述解釋,以允許更多的輸出值。
如前所述,如果p> occupied_thresh,則輸出值100,如果p <free_thresh,則輸出值0。
否則,輸出99 *(p - free_thresh)/(occupied_thresh - free_thresh)
這將允許您輸出範圍爲[0,100]的完整漸變值。要輸出-1,只需使用png的alpha通道,其中任何透明度都將被解釋爲未知。
- raw
- 此模式將爲每個像素輸出x,因此輸出值爲[0,255]。
3.Gmaping話題分析
Gmapping訂閱的傳感器話題,如激光類的話題的默認名爲scan,建圖是一定需要用傳感器的數據信息的,若開啓的傳感器所發佈的話題不爲scan,需將發佈話題remap到scan,或修改Gmapping訂閱話題名。gmapping訂閱雷達信息後,會通過計算來生成地圖,以及計算地圖柵格數據,從而判定哪些地方機器人可走與否。
gmapping節點訂閱話題
- tf(話題名),tf/tfMessage(類型,下同),用於激光雷達座標系,基座標系,里程計座標系之間的變換
- scan,sensor_msgs/LaserScan,激光雷達掃描數據
gmapping節點發布話題
- map_metadata,nav_mags/MapMetaData,發佈地圖的Meta數據
- map,nav_msgs/OccupancyGrid,發佈地圖柵格數據
gmapping服務維持
- dynamic_map,nav_msgs/GetMap,獲取地圖數據
4.Gmaping TF變換分析
Gmapping建圖的tf變換順序爲,map到_base_link的變換,base_link到里程座標系的變換,傳感器到base_link的變換
必須的TF變換
- odom → map,地圖座標系與機器人里程計座標系之間的變換,估計機器人在地圖中的位姿
- base_link →odom,基座標系與里程計座標系之間的變換,通常由里程計系統提供
- <scan fame> → base_link,激光雷達座標系與基座標座標系之間的變換,一般由robot_state_publisher或static_transform_publisher發佈
5.Gmapping柵格分析
- 致命障礙:柵格值爲254,障礙物與機器人的中心重合,此時機器人必然與障礙物發生碰撞。
- 內切障礙:柵格值爲253,障礙物處於機器人輪廓的內切圓內,此時機器人也必然與障礙物發生碰撞。
- 外切障礙:柵格值爲252-128,障礙物處於機器人的輪廓的外切圓內,此時機器人與障礙物臨界接觸,不一定發生碰撞。
- 非自由空間:柵格值爲128~0,障礙物附近區域,一旦機器人進入該區域,將有較大概率發生碰撞,屬於危險警戒區,機器人應該儘量避免進入
- 自由區域:柵格值爲0,表示此處沒有障礙物,機器人可自由通過
- 未知區域:柵格值爲255,此處還沒有被傳感器感知到是否有障礙物,隨着建圖的進行,次數的柵格值將動態變化
6.Gmapping參數分析
Gmapping建圖的好壞,地圖質量的高低,定位導航的精確性,CPU性能的佔有率,都直接與建圖參數掛鉤。
各參數含義:https://www.ncnynl.com/archives/201702/1364.html
<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true">
<param name="odom_frame" value="odom"/>
<param name="map_update_interval" value="5.0"/>
<!-- Set maxUrange < actual maximum range of the Laser -->
<param name="maxRange" value="5.0"/>
<param name="maxUrange" value="4.5"/>
<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.01"/>
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<param name="linearUpdate" value="0.5"/>
<param name="angularUpdate" value="0.436"/>
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="80"/>
<param name="xmin" value="-1.0"/>
<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>
參考文章:
1.地圖yaml分析,https://blog.csdn.net/wsc820508/article/details/81556620