什么时候会触发recovery?
enum RecoveryTrigger
{
PLANNING_R, //无法算出plan
CONTROLLING_R, //local planner无法利用localcostmap算出一个localplan,从而无法得到速度命令
OSCILLATION_R,//机器人在不断抖动
};
1. planthread里,如果发现无法算出最新的plan,就会把movebase的状态设置为CLEARING。
2. 在MoveBase::executeCycle的循环中,在CONTROLLING状态时,即还未到达目的地并且已经获得Plan的状态下。如果长时间没有成功拿到localplanner算出的速度命令,比如localplanner无法算出速度(可能是localcostmap里有障碍物),就会设置movebase状态为CLEARING.
3. 在震动时,如果没有恢复,也会设置状态成CLEARING.
recovery时会干什么?
会执行recoverybehavior.
那么要看都建立了多少behaviors:
MoveBase::loadDefaultRecoveryBehaviors函数会加载一些default的behavior.
基本上两种类型:
ClearCostmapRecovery和RotateRecovery。
ClearCostmapRecovery会清理从机器人所在位置开始,默认直径reset_distance_=3米的矩形范围之外的costmap中数据,具体清理costmap中的哪个layer中的数据呢,默认清理obstaclelayer的数据。看ClearCostmapRecovery::runBehavior()。清理时,将地图中内容设置为未知。会把global和localcostmap中指定的layer都清理掉。
RoateRecovery比较简单,就是让机器人旋转180度。这样就可以更新周围的障碍物数据。