# 10.2 move_base
## 10.2.1 move_base与插件
move_base算得上是Navigation中的核心节点,之所以称之为核心,是因为它在导航的任务中处于支配地位,其他的一些package都是它的**插件**。
来看这张图
![slam_gmapping](https://img.kancloud.cn/b9/a7/b9a74c7ae72f898a1f682c40214f7274_1495x774.jpg)
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