# 10.2 move_base
## 10.2.1 move_base與插件
move_base算得上是Navigation中的核心節點,之所以稱之為核心,是因為它在導航的任務中處于支配地位,其他的一些package都是它的**插件**。
來看這張圖

move_base要運行起來,需要選擇好插件,包括三種插件:`base_local_planner`、`base_global_planner`和`recovery_behavior`,這三種插件都得指定,否則系統會指定默認值。
Navigation為我們提供了不少候選的插件,可以在配置move_base時選擇。
### base_local_planner插件:
* base_local_planner: 實現了Trajectory Rollout和DWA兩種局部規劃算法
* dwa_local_planner: 實現了DWA局部規劃算法,可以看作是base_local_planner的改進版本
### base_global_planner插件:
* parrot_planner: 實現了較簡單的全局規劃算法
* navfn: 實現了Dijkstra和A*全局規劃算法
* global_planner: 重新實現了Dijkstra和A*全局規劃算法,可以看作navfn的改進版
### recovery_behavior插件:
* clear_costmap_recovery: 實現了清除代價地圖的恢復行為
* rotate_recovery: 實現了旋轉的恢復行為
* move_slow_and_clear: 實現了緩慢移動的恢復行為
除了以上三個需要指定的插件外,還有一個costmap插件,該插件默認已經選擇好,無法更改。
以上所有的插件都是繼承于`nav_core`里的接口,`nav_core`屬于一個接口package,它只定義了三種插件的規范,也可以說定義了三種接口類,然后分別由以上的插件來繼承和實現這些接口。因此如果你要研究路徑規劃算法,不妨研究一下`nav_core`定義的路徑規劃工作流程,然后仿照`dwa_local_planner`或其他插件來實現。
除了以上三個需要指定的插件外,還有一個**costmap**插件,該插件默認已經選擇好,默認即為**costmap_2d**,不可更改,但costmap_2d提供了不同的Layer可以供我們設置,在9.3節我們會進行介紹。
在這里**插件**的概念并不是我們抽象的描述,而是在ROS里catkin編譯系統能夠認出的,并且與其他節點能夠耦合的**C++庫**,插件是可以動態加載的類,也就是說插件不需要提前鏈接到ROS的程序上,只需在運行時加載插件就可以調用其中的功能。
具體關于插件的介紹,有興趣請看http://wiki.ros.org/pluginlib,本書不做過多介紹。
## 10.2.2 插件選擇(參數)
既然我們知道了move_base具體的一些插件,那如何來選擇呢?其實非常簡單。在move_base的參數設置里可以選擇插件。
move_base的參數包括以下內容:
| 參數 | 默認值 | 功能 |
| :---: | :---: | :---: |
| ~base_global_planner | navfn/NavfnROS | 設置全局規劃器 |
| ~base_local_planner | base_local_planner/TrajectoryPlannerROS| 設置局部規劃器 |
| ~recovery_behaviors | [{name: conservative_reset, type: clear_costmap_recovery/ClearCostmapRecovery}, {name: rotate_recovery, type: rotate_recovery/RotateRecovery}, {name: aggressive_reset, type: clear_costmap_recovery/ClearCostmapRecovery}] | 設置恢復行為|
|... | ... | ... |
除了這三個選擇插件的參數,還有控制頻率、誤差等等參數。
具體請看http://wiki.ros.org/move_base介紹。
在ROS-Academy-for-Beginners的代碼中的`navigation_sim_demo`例子中,由于要配置的參數太多,通常會將配置寫在一個yaml文件中,我們用`param/move_base_params.yaml`來保存以上參數。而關于一些具體插件,比如`dwa_local_planner`則也會創建一個文件`param/dwa_local_planner.yaml`來保存它的設置。
## 10.2.3 Topic與Service
move_base輸入輸出的Topic在9.1節已經做了介紹,這里不再贅述。
move_base包含的Service包括:
* make_plan: nav_msgs/GetPlan類型,請求為一個目標點,響應為規劃的軌跡,但不執行該軌跡。
* clear_unknown_space: std_srvs/Empty類型,允許用戶清除未知區域地圖。
* clear_costmaps: std_srvs/Empty類型,允許用戶清楚代價地圖上的障礙物。
- 前言
- 第一章 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