movebase导航和地图数据的使用 - 8 导航中recovery的逻辑

什么时候会触发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函数会加载一些defaultbehavior.

基本上两种类型:

ClearCostmapRecoveryRotateRecovery

ClearCostmapRecovery会清理从机器人所在位置开始,默认直径reset_distance_=3米的矩形范围之外costmap中数据,具体清理costmap中的哪个layer中的数据呢,默认清理obstaclelayer的数据。看ClearCostmapRecovery::runBehavior()。清理时,将地图中内容设置为未知。会把globallocalcostmap中指定的layer都清理掉。



RoateRecovery比较简单,就是让机器人旋转180度。这样就可以更新周围的障碍物数据。



你可能感兴趣的:(机器人,ROS)