move_base包采用action机制接受导航goal,然后移动机器人底座到达指定的goal。 这个过程中move_base node将同时利用局部规划器和全局规划器来完成导航任务,支持任何一种继承了nav_core包中nav_core::BaseGlobalPlanner接口的全局规划器和nav_core包中nav_core::BaseLocalPlanner接口的局部规划器。此外,该node还维护者2个代价地图,一个是用于全局规划器的全局代价地图,另一个是用于局部规划器的局部代价地图。
1 move_base框图
move_base node提供了ROS级接口用以实现对导航功能包集的配置和运行,以及与导航功能包集的交互操作。 图中蓝色部分与特定机器人平台有关,灰色部分是可选的但已经实现了,白色部分是必须的也已经实现。
2 move_base状态机
如果我们运行正确配置了导航功能的move_base node,机器人将会尽最大努力向用户指定的目标靠拢。在环境中没有运动障碍情况下,move_base node最终运行结果要么是接近了规划的目标,要么是给用户返回失效信号。 在向目标移动过程move_base node视是否自己进入stuck的情况决定是否指定修复行动,缺省情况下,将采用如下所述行动来清理出的周围空间:
首选,用户指定区域外的障碍将会从地图中清除; 其次,如果可能的话机器人会执行就地旋转来清理出空间;如果失败,机器人会更激进的将其可以就地旋转的矩形框外面的障碍物全部移除。 紧接着下一个就地旋转操作会被继续执行。如果所有这些操作都失效,机器人会认为目标设定不恰当并通知用户放弃操作。 这些修复行动可以通过recovery_behaviors参数来配置,也可以recovery_behavior_enabled参数disable。
3 move_base action API
move_base node实现了SimpleActionServer, 可以接收使用geometry_msgs/PoseStamped消息的goal。 虽然我们可以使用ROS可以直接与move_base node通信,但是还是推荐使用SimpleActionClient发送goal来与其通信,这样可以track goal的执行状态。
3.1 Action Subscribed Topics
move_base/goal (move_base_msgs/MoveBaseActionGoal)
- move_base的搜索目标
- 取消特定目标的请求
3.2 Action Published Topics
move_base/feedback (move_base_msgs/MoveBaseActionFeedback)
- Feedback含有基座当前位置信息
- 携带目标执行的状态信息
对于move_base action的result为空
4 Subscribed Topics
move_base_simple/goal (geometry_msgs/PoseStamped)
- 对于不需要知道goal执行状态的需求,提供的非action接口
5 Published Topics
cmd_vel (geometry_msgs/Twist)- 要移动底座执行的速度命令流
6 Services
~make_plan (nav_msgs/GetPlan)- 允许用户指定goal且在不用真正执行该goal时候,提前获知move_base给出的规划
- 允许用户直接清除机器人周围的unknown space。非常适合于costmap停了很长时间后,在一个全新地方重新启动时候采用。
- 允许用户告知move_base清除costmap中的障碍。这可能会导致机器人装上物体,因此请谨慎使用。
7 Parameters
~base_global_planner ( string, default: "navfn/NavfnROS" For 1.1+ series)- 指定用于move_base的全局规划器的插件名称,该插件必须继承自nav_core::BaseGlobalPlanner 接口 (1.0 series default: "NavfnROS")
- 指定用于move_base的局部规划器的名称,该插件必须继承自nav_core::BaseLocalPlanner接口(1.0 series default: "TrajectoryPlannerROS")
- 指定用于move_base的修复行动插件列表。当move_base不能找到有效的plan时候,将按照这里指定的顺序执行这些行动。每个行动执行完成后,move_base都会尝试生成有效的plan。如果plan成功了,move_base会继续正常操作。否则,下一个修复行为启动执行。这些修复行动插件必须继承自 nav_core::RecoveryBehavior接口(1.0 series default: [{name: conservative_reset, type: ClearCostmapRecovery}, {name: rotate_recovery, type: RotateRecovery}, {name: aggressive_reset, type: ClearCostmapRecovery}]).
- 注意: 对于缺省参数, aggressive_reset行动将清理出一个范围 4 * ~/local_costmap/circumscribed_radius.
- 以这一速率运行控制环,并发送速度命令给底座,单位Hz
- 在空间清理操作执行前,留给规划器几秒时间来找出一个有效规划
- 在空间清理操作执行前,控制器会花几秒时间等有效控制下发
- 当在地图中清理出空间时候,距离机器人几米远的障碍将会从代价地图清除。注意:该参数仅用于move_base使用了缺省参数的情况
- 是否使能move_base修复机制来清理出空间
- 决定做清理空间操作时候,机器人是否会采用原地旋转。注意: Note: 该参数仅用于move_base使用了缺省参数的情况,这意味着永不不能设置自定义修复行为
- 当move_base进入inactive状态时候,决定是否停用node的costmap
- 执行修复行动之前,允许的震荡时间是几秒。 值0意味着永不超时。New in navigation 1.3.1
- 机器人移动几米远算作没有没有震荡。 移动这么远重置定时器计入参数~oscillation_timeout New in navigation 1.3.1
- 全局规划器loop速率。如果设置这个为0.0, 当收到新目标或者局部规划器报告路劲堵死时候全局规划器才启动。New in navigation 1.6.0
8 Component APIs
move_base node中使用的组件基本上自己都有对应ROS APIs。 基于参数~base_global_planner, ~base_local_planner, and ~recovery_behaviors的不同设置,使用的组件可能不同。 以下是move_base用到的缺省组件的链接地址:
-
costmap_2d - 2D代价地图生成
-
nav_core - nav_core::BaseGlobalPlanner和nav_core::BaseLocalPlanner接口被 move_base使用
-
base_local_planner - 基座局部规划器
-
navfn - navfn目标规划器
-
clear_costmap_recovery - 用于清除代价地图的修复行为
-
rotate_recovery - 旋转修复行为