costmap_2d這個包提供了一種2D代價地圖的實現方案,該方案利用輸入的傳感器數據,構建數據2D或者3D代價地圖(取決於是否使用基於voxel的實現),並根據占用網格和用戶定義的膨脹半徑計算2D代價地圖的代價。 此外,該包也支持利用map_server初始化代價地圖,支持滾動窗口的代價地圖,支持參數化訂閱和傳感器主題的配置。
1、概述
注:紅色代表代價地圖中的障礙物,藍色代表的是通過機器人內切圓半徑計算的障礙物膨脹,紅色的多邊形代表機器人外殼。為了使機器人不碰到障礙物,機器人的外殼絕對不允許與紅色單元相交,機器人的中心絕對不允許與藍色單元相交。
costmap_2d包提供了一個可配置的結構,以網格占有的形式保存機器人在該處網格的導航信息。該包使用靜態地圖的傳感器數據與信息,通過 costmap_2d::Costmap2DROS 來儲存和升級世界中的障礙物信息。The costmap_2d::Costmap2DROS對象為用戶提供了一個純粹的二維界面,這意味着對障礙物的查詢只能在列中進行,例如,在XY平面上位於同一位置的桌子和鞋,雖然在Z方向上有差異但是它們在costmap_2d::Costmap2DROS對象代價地圖中對應的cell上擁有相同的代價值。 這種設計對平面空間進行路徑規划是有幫助的。
從Hydro發布版本開始, 用來寫數據到代價地圖的底層方法已經完全可配置了。 每種功能放置一層中。 例如,靜態地圖是一層,障礙物是另一層。 缺省情況下,障礙物層維護的是3D信息,3D障礙物數據可以讓層更加靈活的標記和清除障礙物。該包提供的ROS化功能接口主要就是costmap_2d::Costmap2DROS,它使用costmap_2d::LayeredCostmap 來跟蹤每一層。 每一層在Costmap2DROS中以插件方式被實例化,並被添加到LayeredCostmap。 每一層可以獨立編譯,且可使用C++接口實現對代價地圖的隨意修改。costmap_2d::Costmap2D 類中實現了用來存儲和訪問2D代價地圖的的基本數據結構。關於代價地圖如何更新占用珊格的細節將在下面介紹,同時提供了頁面鏈接供查看某一層具體如何工作。
2、障礙物清楚與占有(clearing and mark)
代價地圖自動訂閱傳感器發布的主題並基於數據進行相應自我更新。 對每個傳感器來說,其可以用來執行mark(將障礙物信息插入到代價地圖),也可以用來執行clear(從代價地圖移除障礙物)或者二者都執行。marking操作就是索引到數組內修改cell的代價。然而對於clearing操作,每次觀測報告都需要傳感器源向被觀測對象發射線。 如果存儲的障礙物信息是3D的,需要將每一列的障礙物信息投影成2D后才能放入到代價地圖。
3、空間狀態(占有、自由、未知)
雖然代價地圖中每個cell可用255個不同值中任何一個值(see the inflation section),可是下層數據結構僅需要3個值。 具體來說在這種下層結構中,每個cell僅需要3個值來表示cell的3種狀態:free,occupied,unknown。 當投影到代價地圖時候,每種狀態被賦一個特定的代價值。 如果列有一定量的占用(see mark_threshold parameter) 就被賦代價值costmap_2d::LETHAL_OBSTACLE, 如果列有一定量的unknown cells (see unknown_threshold parameter) 就被賦代價值costmap_2d::NO_INFORMATION, 剩余其它列賦代價值為costmap_2d::FREE_SPACE。
4、地圖更新
代價地圖以參數update_frequency 指定的周期進行地圖更新。每個周期傳感器數據進來后,都要在代價地圖底層占用結構上執行標記和清除障礙操作,並且這種結構會被投影到代價地圖附上相應代價值。 這完成之后,對代價賦值為costmap_2d::LETHAL_OBSTACLE的每個cell執行障礙物的膨脹操作,即從每個占用cell向外傳播代價值,直到用戶定義的膨脹半徑為止。細節如下6.
5、tf
為了把來自傳感器源的數據插入到代價地圖,costmap_2d::Costmap2DROS要大量使用tf。所有tf轉換由global_frame parameter,the robot_base_frame parameter,以及sensor sources建立聯系和更新。The transform_tolerance parameter定義了tf轉換所能容忍的的最大延時。如果 tf 樹沒有以期望速度被更新,那么導航功能包集將會讓機器人停止。
Inflation is the process of propagating cost values out from occupied cells that decrease with distance. For this purpose, we define 5 specific symbols for costmap values as they relate to a robot.
膨脹是由被占有的柵格(occupied cells )向外傳播其代價值的過程,傳播的值隨距離增加而遞減。為了實現該目的,定義了五個與機器人相關聯的特殊符號。
具體狀態和值對應有下圖:
"Lethal" cost:意思是cell內有障礙物,因此如果機器人中心位於那個cell,很顯然機器人會碰到障礙
"Inscribed" cost:意思是cell到障礙物的距離小於機器人內切圓半徑。 因此如果機器人中心在cell(或者代價>=內切代價),機器人與障礙物肯定有沖突
"Possibly circumscribed" cost:類似於內切,但是使用機器人外接圓作為截止距離。因此,如果機器人中心位於cell上(或者代價>=外接代價),那么它與障礙物是否沖突依賴於機器人方位。使用術語“可能”意思是這不一定是一個真正障礙cell,但是有些用戶喜歡放特定的代價值進去為特定目的。 例如,如果用戶要表示機器人應該嘗試避開建築物某特定區域, 它們可以在代價地圖上為那個與任何障礙毫無關系的區域(該區域本來就不是障礙區)插入代價值。注意,雖然上圖示例中使用了代價值128,但是實際由於代價值受內切圓半徑和外接圓半徑的影響,真正實際值並不一定是128。
"Freespace" cost: 假定為0,意思是沒啥東西會阻礙機器人到那里
"Unknown" cost:意思是cell上沒有信息
All other costs: 被賦值為"Freespace"和"Possibly circumscribed"之間的一個值,取決於到 "Lethal" cell的距離以及用戶定義的衰減函數