# 10.3 costmap
costmap是Navigation Stack里的代價地圖,它其實也是move_base插件,本質上是C++的動態鏈接庫,用過catkin_make之后生成.so文件,然后move_base在啟動時會通過動態加載的方式調用其中的函數。
## 10.3.1 代價地圖
之前我們在介紹SLAM時講過ROS里的地圖的概念,地圖就是`/map`這個topic,它也是一張圖片,一個像素代表了實際的一塊面積,用灰度值來表示障礙物存在的可能性。然而在實際的導航任務中,光有一張地圖是不夠的,機器人需要能動態的把障礙物加入,或者清楚已經不存在的障礙物,有些時候還要在地圖上標出危險區域,為路徑規劃提供更有用的信息。
因為導航的需要,所以出現了代價地圖。你可以將代價地圖理解為,在`/map`之上新加的另外幾層地圖,不僅包含了原始地圖信息,還加入了其他輔助信息。
代價地圖有一下特點:
1.首先,代價地圖有兩張,一張是`local_costmap`,一張是`global_costmap`,分別用于局部路徑規劃器和全局路徑規劃器,而這兩個costmap都默認并且只能選擇`costmap_2d`作為插件。
2. 無論是`local_costmap`還是`global_costmap`,都可以配置他們的Layer,可以選擇多個層次。costmap的Layer包括以下幾種:
* Static Map Layer:靜態地圖層,通常都是SLAM建立完成的靜態地圖。
* Obstacle Map Layer:障礙地圖層,用于動態的記錄傳感器感知到的障礙物信息。
* Inflation Layer:膨脹層,在以上兩層地圖上進行膨脹(向外擴張),以避免機器人的外殼會撞上障礙物。
* Other Layers:你還可以通過插件的形式自己實現costmap,目前已有`Social Costmap Layer`、`Range Sensor Layer`等開源插件。
可以同時選擇多個Layer并存。
## 10.3.2 地圖插件的選擇
與9.2節中move_base插件的配置類似,costmap配置也同樣用yaml
來保存,其本質是維護在參數服務器上。由于costmap通常分為local和global的coastmap,我們習慣把兩個代價地圖分開。以`ROS-Academy-for-Beginners`為例,配置寫在了param文件夾下的`global_costmap_params.yaml`和`local_costmap_params.yaml`里。
global_costmap_params.yaml:
```xml
global_costmap:
global_frame: /map
robot_base_frame: /base_footprint
update_frequency: 2.0
publish_frequency: 0.5
static_map: true
rolling_window: false
transform_tolerance: 0.5
plugins:
- {name: static_layer, type: "costmap_2d::StaticLayer"}
- {name: voxel_layer, type: "costmap_2d::VoxelLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
```
local_costmap_params.yaml:
```xml
local_costmap:
global_frame: /map
robot_base_frame: /base_footprint
update_frequency: 5.0
publish_frequency: 2.0
static_map: false
rolling_window: true
width: 4.0
height: 4.0
resolution: 0.05
origin_x: 5.0
origin_y: 0
transform_tolerance: 0.5
plugins:
- {name: voxel_layer, type: "costmap_2d::VoxelLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}
```
在`plugins`一項中可以設置Layer的種類,可以多層疊加。在本例中,考慮到局部地圖并不需要靜態地圖,而只考慮傳感器感知到的障礙物,因此可以刪去StaticLayer。
- 前言
- 第一章 ROS簡介
- 機器人時代的到來
- ROS發展歷程
- 什么是ROS
- 安裝ROS
- 安裝ROS-Academy-for-Beginners教學包
- 二進制與源碼包
- 安裝RoboWare Studio
- 單元測試一
- 第二章 ROS文件系統
- Catkin編譯系統
- Catkin工作空間
- Package軟件包
- CMakeLists.txt
- package.xml
- Metapacakge軟件元包
- 其他常見文件類型
- 單元測試二
- 第三章 ROS通信架構(一)
- Node & Master
- Launch文件
- Topic
- Msg
- 常見msg類型
- 單元測試三
- 第四章 ROS通信架構(二)
- Service
- Srv
- Parameter server
- Action
- 常見srv類型
- 常見action類型
- 單元測試四
- 第五章 常用工具
- Gazebo
- RViz
- Rqt
- Rosbag
- Rosbridge
- moveit!
- 單元測試五
- 第六章 roscpp
- Client Library與roscpp
- 節點初始、關閉與NodeHandle
- Topic in roscpp
- Service in roscpp
- Param in roscpp
- 時鐘
- 日志與異常
- 第七章 rospy
- Rospy與主要接口
- Topic in rospy
- Service in rospy
- Param與Time
- 第八章 TF與URDF
- 認識TF
- TF消息
- tf in c++
- tf in python
- 統一機器人描述格式
- 附錄:TF數學基礎
- 三維空間剛體運動---旋轉矩陣
- 三維空間剛體運動---歐拉角
- 三維空間剛體運動---四元數
- 第九章 SLAM
- 地圖
- Gmapping
- Karto
- Hector
- 第十章 Navigation
- Navigation Stack
- move_base
- costmap
- Map_server & Amcl
- 附錄:Navigation工具包說明
- amcl
- local_base_planner
- carrot_planner
- clear_costmap_recovery
- costmap_2d
- dwa_local_planner
- fake_localization
- global_planner
- map_server
- move_base_msg
- move_base
- move_slow_and_clear
- navfn
- nav_core
- robot_pose_ekf
- rotate_recovery