move_base概述
move_base 包提供了一个动作的实现(参见actionlib包),给定世界上的目标,它将尝试使用移动基地来实现它。move_base 节点将全局和本地规划器链接在一起以完成其全局导航任务。它支持任何遵循在nav_core包中指定的 nav_core::BaseGlobalPlanner 接口的全局规划器和任何遵循在nav_core包中指定的 nav_core::BaseLocalPlanner 接口的本地规划器。move_base 节点还维护两个成本地图,一个用于全局规划器,另一个用于本地规划器(参见costmap_2d包),用于完成导航任务。
关于actionlib
在任何基于 ROS 的大型系统中,都会有这样的情况:有人想向节点发送请求以执行某些任务,同时也会收到对请求的回复。这目前可以通过 ROS服务来实现。如果服务需要很长时间来执行,用户可能希望能够在执行期间取消请求或获得有关请求进展情况的定期反馈。该actionlib包提供的工具来创建执行长期运行的目标是可以被抢占的服务器。它还提供了一个客户端接口,以便向服务器发送请求。
关于目标的的设定
除了使用在rviz界面中设定的方法外。Move_base源码中有为rviz等提供调用借口,将geometry_msgs::PoseStamped形式的goal转换成move_base_msgs::MoveBaseActionGoal,再发布到对应类型的goal话题中所以可以通过命令行发送对应的导航目标点。
如果起始点为空,设置global_pose为起始点
利用局部路径规划器直接输出轮子速度,控制机器人按照路径走到目标点
地图数据超时,即观测传感器数据不够新,停止机器人,返回false
move_base 状态机
move_base 状态机是处理导航的控制逻辑;movebase状态机分为planning,controlling,clearing 和default。planning是指接受新目标与进行全局规划的整个过程,cotrolling是指调用局部规划器计算机器人速度的过程,clearing是指利用用户定义的行为进行recovery的过程。
一般默认状态或者接收到一个有效goal时是PLANNING,在规划出全局路径后state_会由PLANNING->CONTROLLING如果规划失败则由PLANNING->CLEARING。
//recovery是指恢复的规划器,其跟全局规划器和局部规划器是同一个等级的。
//不同的是,它是在机器人在局部代价地图或者全局代价地图中找不到路时才会被调用,比如rotate_recovery让机器人原地360°旋转,clear_costmap_recovery将代价地图恢复到静态地图的样子。
Move_base的使用
启动move_base用的是launch文件,主要内容包括解析map文件,move_base和amcl定位三个部分,构成一个完整的框架,
global_planner这个包,它默认使用的是dijkstra,也可以使用A*全局路径规划,局部路径规划包括dwa和teb
dwa参数简单,阿克曼底盘使用teb算法,teb算法更先进些;但是dwa对于除了阿克曼以外的其他底盘,都完全满足要求了;