10.2 move_base

10.2.1 move_base与插件

move_base算得上是Navigation中的核心节点,之所以称之为核心,是因为它在导航的任务中处于支配地位,其他的一些package都是它的插件。 来看这张图 slam_gmapping move_base要运行起来,需要选择好插件,包括三种插件:base_local_plannerbase_global_plannerrecovery_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类型,允许用户清楚代价地图上的障碍物。

results matching ""

    No results matching ""