[ROS] Gmapping建圖算法使用方式,gmmping話題、tf、柵格、參數分析

目錄

 

Gmapping

1.安裝與使用方式

3.Gmaping話題分析

4.Gmaping TF變換分析

5.Gmapping柵格分析

 6.Gmapping參數分析


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章