ros costmap框架分析

一、costmap類型

global_costmap:全局代價地圖,用於全局路徑規劃。

locat_costmap:局部代價地圖,用於避障。

二、什麼是costmap

 簡單來講,costmap就是一張代價地圖,地圖數據是一個unsigned chat數組,每一個點的值表示該點對應的實際座標的通行性,具體可參見http://wiki.ros.org/costmap_2d/。 costmap座標系的座標是整數,世界座標系的座標是雙浮點數,它們之間通過分辨率以及costmap左下角座標進行轉換。costmap對應的類爲costmap_2d::Costmap2D。

三、什麼是costmap layer

ros利用插件機制實現了分層的costmap,每一層保存一張由該層對應的數據源生成的costmap,由各自的數據源實時更新,最後,各層的數據上下疊加在一起,就生成了最終的costmap。每一層的costmap爲Costmap2D類型,最後疊加在一起的爲LayeredCostmap類型,LayeredCostmap類裏包含一個Costmap2D類型的成員變量。

四、costmap相關類圖

五、costmap更新流程

1、實例化Costmap2DROS對象,在構造函數裏主要做以下三件事:

  • 創建LayeredCostmap類型的對象layered_costmap_,並初始化costmap起點座標和大小

  • 初始化costmap各層插件並加入到layered_costmap_裏

  • 啓動更新costmap的線程mapUpdateLoop

2、在Costmap2DROS::updateMap函數裏先獲取機器人位姿,然後調用layered_costmap_的updateMap函數更新各層的costmap

3、在LayeredCostmap::updateMap裏,做以下三件事

  • 如果設置了rolling_window_爲true,更新costmap的初始點座標
  • 依次調用各層插件的updateBounds函數,該函數會根據數據源數據先清空掉視野內已不存在的障礙物,然後再添加視野內新增的障礙物
  • 依次調用各層插件的updateCosts函數,把每一層的costmap疊加成最終的costmap。

4、更新完成後,通過publisher_把costmap發送出去

六、添加新的傳感器數據生成costmap

可以仿照其他層重寫一個插件,主要修改updateBounds裏的代碼邏輯,實現障礙物的添加與清除,並在costmap_common.yaml、costmap_local.yaml、costmap_global.yaml配置文件裏修改相應的配置,使新加的插件層生效,具體怎麼添加,網上有教程,這裏不再贅述。

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