2. 任务状态机建模基础

在无人系统中,任务状态机是描述“系统当前处于什么工作阶段、什么条件会触发阶段切换、切换时执行什么行为”的核心建模工具。它把连续、复杂的任务过程离散化为有限个稳定状态,再通过事件驱动状态之间的迁移,使无人系统的行为逻辑可读、可验证、可实现。本节围绕状态、事件、迁移、动作、守卫条件五个核心概念展开,并说明有限状态机(FSM)在无人系统中的典型表达方式。

一、五个核心概念

状态(State)表示系统在某一时刻所处的稳定工作模式或阶段。例如一架巡检无人机可定义 IDLE(待命)、TAKEOFF(起飞)、CRUISE(巡航)、INSPECT(悬停检测)、RETURN(返航)、LAND(降落)、EMERGENCY(应急)等状态。状态必须互斥:同一时刻系统只能处于一个状态,这是状态机可分析性的前提。状态内部通常还携带变量,如剩余电量、当前航点编号、任务进度,这些变量称为状态变量或上下文。

事件(Event)是触发状态迁移的外部或内部信号。外部事件如遥控指令、地面站任务下发、避障传感器报警;内部事件如定时器超时、电量低于阈值、到达目标点。事件是瞬时的,它本身不改变状态,只有被状态机响应后才可能引发迁移。事件可分为可预期事件(如“到达航点”)和异常事件(如“链路中断”),后者往往对应应急迁移。

迁移(Transition)是状态之间的有向连接,表示“在源状态下,当某事件发生且守卫条件满足时,系统进入目标状态”。迁移是状态机的骨架,它定义了系统所有允许的行为路径。一个状态可以有多条出边,对应不同事件或不同守卫条件,形成分支决策。

动作(Action)是迁移发生时或状态驻留期间执行的具体行为。按执行时机可分为三类:迁移动作(在迁移边上执行,如“启动电机”)、进入动作(进入状态时执行,如“打开相机”)、退出动作(离开状态时执行,如“关闭相机”)。动作应尽量短小、可执行、可观测,避免在动作中嵌入复杂决策逻辑,决策应交给守卫条件。

守卫条件(Guard)是迁移上的布尔表达式,只有为真时迁移才被允许。它把“事件发生”与“是否真的切换”区分开。例如从 CRUISE 到 RETURN 的迁移,事件是“任务完成”,守卫条件可写为 battery > 30%;若电量不足,则即使任务完成也应先进入 EMERGENCY 或直接返航。守卫条件使状态机具备条件分支能力,而不必为每种组合单独建状态。

二、有限状态机在无人系统中的表达方式

无人系统中最常用的表达形式是带动作与守卫的有限状态机,可用五元组描述:FSM = (S, E, T, A, G),其中 S 为状态集合,E 为事件集合,T 为迁移集合,A 为动作集合,G 为守卫条件集合。工程实现中,常用状态迁移表或状态图两种等价形式表达。

状态迁移表适合精确实现与代码生成,每一行描述一条迁移:当前状态、触发事件、守卫条件、目标状态、执行动作。例如巡检无人机的部分迁移表可设计如下(示例参数,用于说明结构):

当前状态事件守卫条件目标状态动作
IDLE任务下发电量 > 80% 且 GPS 定位有效TAKEOFF解锁电机、记录起飞点
TAKEOFF高度到达 5 m姿态角 < 10°CRUISE收起起落架、切换航线模式
CRUISE到达航点航点类型 = 检测点INSPECT减速悬停、开启相机
INSPECT检测完成剩余航点 > 0CRUISE关闭相机、飞向下一点
CRUISE任务完成电量 > 30%RETURN规划返航路径
任意状态电量 < 15%—EMERGENCY悬停、上报、就近降落

状态图则更直观地展示迁移拓扑与分支关系。下图给出一个巡检无人机任务状态机的核心迁移结构,包含正常任务链与低电量应急分支,迁移边上标注“事件 [守卫] / 动作”的典型写法。

巡检无人机任务状态机核心迁移图 迁移标注格式:事件 [守卫条件] / 动作 IDLE TAKEOFF CRUISE INSPECT RETURN LAND EMERGENCY 任务下发 [电量>80%] 高度=5m [姿态<10°] 到达航点 [检测点] 检测完成 [剩余航点>0] 任务完成 [电量>30%] 到达降落点 电量<15% 应急降落完成 图例 正常任务迁移 异常/应急迁移 状态互斥:同一时刻仅一个状态激活;守卫条件为真时迁移才发生;动作在迁移或进入/退出时执行。

三、建模时的关键约定与常见陷阱

第一,状态命名要体现工作模式而非动作。例如“起飞”是动作,TAKEOFF 才是状态;状态内部可以持续执行爬升动作,直到高度事件触发迁移。第二,守卫条件应尽量无副作用,只做判断不做赋值,否则状态机难以测试和复用。第三,避免状态爆炸:当多个条件组合导致状态数量急剧增加时,应把可正交的条件抽为守卫或上下文变量,而不是为每种组合建一个状态。第四,异常迁移要显式建模,如链路中断、传感器失效、低电量,不能依赖默认行为,否则无人系统在异常场景下行为不可预测。

建模小技巧:先列出所有状态,再为每个状态列出“进入条件、退出事件、驻留动作”,最后补齐迁移边与守卫条件。这样能快速发现孤立状态、无出口状态和不可达状态。

四、从模型到实现

在工程实现中,状态机通常以“当前状态 + 事件队列”的循环方式运行:系统周期性读取传感器与通信事件,查表匹配当前状态下的迁移,若守卫条件为真则执行退出动作、更新状态、执行进入动作与迁移动作。下面给出一个简化的伪代码结构,用于说明状态迁移表的执行逻辑(示例,非实测代码):

state = IDLE
while True:
    event = read_event()          # 读取遥控、传感器、定时器事件
    for t in transitions[state]:  # 查当前状态的迁移表
        if t.event == event and eval(t.guard):
            run(t.exit_action)    # 退出动作
            state = t.target      # 状态更新
            run(t.enter_action)   # 进入动作
            run(t.action)         # 迁移动作
            break
    run(state_do[state])          # 状态驻留行为

这段逻辑体现了状态机的核心运行机制:事件驱动、守卫过滤、动作有序执行。实际无人系统中,还需考虑事件优先级(应急事件应抢占普通事件)、迁移的原子性(避免动作执行到一半被中断)以及状态恢复(上电后回到安全状态)。掌握状态、事件、迁移、动作、守卫条件这五个概念及其表达方式,是后续设计任务调度、行为树与多机协同状态机的基础。