规划器找到路径之后,系统仍要决定何时执行、何时等待观测、何时取消,以及失败后能否重试。任务层负责把这些条件写清楚,让“成功”对应可观察的结果,而不只是某个函数正常返回。

先写状态和完成条件

以抓取后运输为例,可以定义观察、规划、接近、夹持确认、运输、释放确认、完成和故障等状态。夹爪闭合命令被接受,只能说明命令通路正常;物体是否真的被拿起,需要夹爪状态、视觉、力或任务传感器确认。

当前阶段继续执行的证据失败或超时后
观察位姿在有效期内,坐标和置信度合格重新观测或返回无法定位
规划路径可行,场景版本仍有效调整目标或返回不可达
接近跟踪误差在范围内,目标未被取消请求停止并确认执行状态
夹持夹持/抬升证据满足任务条件按限定次数重新观察与抓取
释放物体与夹爪状态符合放置条件停止后续任务并报告原因

超时阈值要来自控制、通信与任务需求。反复重试同一个不可达姿态,只会消耗时间;恢复动作应改变导致失败的条件,例如重新建图、重新观测或换一个抓取候选。

状态机与行为树

状态机适合明确、数量有限的阶段与转移,但转移增多后可能难以维护。行为树把判断、动作及组合节点组织起来,常见节点返回成功、失败或运行中。顺序执行和候选回退有不同语义,周期检查的条件还可能中断正在运行的动作。

行为树不会自动提供取消或安全停止。一个运行中的导航节点被中断时,必须把停止/取消语义传给动作客户端,并处理取消确认与最终状态。共享数据也要有明确写入者、版本和有效期,避免不同节点读取了来自不同时间的目标。Nav2使用行为树协调其规划、控制和恢复模块,见Nav2官方文档。

迟到的成功结果

假设任务12启动导航,10秒后超时,系统发起取消并开始任务13。此时任务12的成功回调才到达。如果只把全局变量done设为真,就可能误把任务13判为完成。

应关联目标ID与任务代次。回调先检查它属于哪个目标;旧目标可以保留日志,但不能改变当前任务状态。取消后还要区分“服务器收到取消”“执行已结束”“机器人已满足停止条件”。在确认之前启动新的运动,要有设备协议和控制器支持的抢占规则。

同样地,地图版本或目标位姿变化后,旧路径不应无限期有效。执行日志应串起任务ID、目标ID、规划输入版本、动作状态、错误码、时间和重试次数。

可执行的验收设计

在导航项目中,先验证已知新增障碍能触发新路径;接入真实Nav2环境后,再注入规划超时、定位无效与action取消。机械臂项目则应分别注入抓取未确认、场景变化与执行中断。

测试时记录每次状态转移的理由,并断言:旧回调不会完成新任务;失败重试有上限;取消后不会继续发布新运动目标;未确认抓取不会进入运输。本页列的是任务层验收方法,没有声称执行过ROS 2故障注入或真机停止测试。

面试自查:为什么“捕获异常后继续下一步”会破坏任务语义?重试与回滚分别适合哪些动作?状态机中的幂等操作和有物理副作用的操作该如何区分?