4. 任务状态表示与检查点机制

无人系统在执行长航时侦察、区域搜索或编队运输任务时,一旦发生通信中断、能源告警、传感器故障或人为接管,任务并不会“从零开始”。真正决定恢复质量的,是系统在中断前是否把“任务进行到哪、环境是什么样、下一步该做什么”记录成了可重建的状态。本节围绕状态表示、检查点生成、持久化存储与恢复点选择四个环节展开,重点说明如何用可落地的数据结构与策略,让任务在中断后以最小代价继续。

一、任务状态表示:把“任务进行到哪”变成可存储的数据

任务状态不是单一变量,而是一组具有不同更新频率和恢复重要性的字段集合。工程上通常将其划分为四层:

  • 任务层:任务编号、任务类型、当前阶段(如“搜索—识别—跟踪—返航”)、已完成子目标列表、剩余子目标队列。
  • 空间层:当前位置(经纬高或局部坐标)、航向、速度、当前航段索引、已覆盖栅格集合或已访问航点序号。
  • 感知层:已确认目标列表(含目标ID、类别、置信度、最近观测时间)、地图增量(新障碍、新可通行区域)、传感器标定参数版本。
  • 资源层:剩余电量或燃料、通信链路质量、载荷工作状态、已消耗任务时间。

这四层中,任务层与空间层是恢复的“骨架”,感知层决定恢复后是否重复搜索,资源层决定是否还能继续。状态表示的关键是可序列化与可判定一致性:每个字段都应有明确的类型、单位和版本号,避免恢复时因结构变化导致解析失败。例如,用 JSON 表示一个搜索任务的状态片段:

{
  "task_id": "SAR-2024-017",
  "phase": "search",
  "sub_goals": ["A3", "A4", "A5"],
  "pose": {"lat": 31.2304, "lon": 121.4737, "alt": 120.0, "yaw": 45.0},
  "covered_cells": ["r12c07", "r12c08", "r13c07"],
  "targets": [{"id": "T-03", "cls": "vehicle", "conf": 0.87, "t": 1715000000}],
  "battery_pct": 63.5,
  "state_version": 7
}

其中 state_version 用于标识状态结构的版本,恢复时若版本不匹配,应触发迁移或拒绝恢复,而不是强行加载。

二、状态快照与增量检查点

状态快照是在某一时刻对全部状态字段做一次完整写入,优点是恢复逻辑简单、一致性强,缺点是数据量大、写入频繁时占用带宽与存储。对于状态字段多、更新频率高的系统,更常用的是增量检查点:只记录自上一个检查点以来发生变化的字段或事件。

增量检查点通常由“基快照 + 变更日志”组成。基快照周期性生成(例如每 60 秒或每完成一个子目标),变更日志则按事件追加,例如“进入 A4 区域”“发现目标 T-04”“电量降至 50%”。恢复时先加载最近一次基快照,再按顺序重放变更日志,即可重建中断前状态。判断是否值得写增量,可依据字段的变更频率与恢复必要性:位置、电量变化快且必须恢复,适合高频增量;任务编号、任务类型几乎不变,只需在基快照中记录一次。

下面这张图展示了从状态采集、快照/增量生成、持久化到恢复点选择的完整数据流,以及各环节的关键判断条件。

任务状态检查点与恢复点选择数据流 状态采集 任务层 / 空间层 感知层 / 资源层 带 state_version 与时间戳 变更频率 高 / 低? 基快照(全量) 周期 60s 或子目标完成 增量变更日志 事件追加,按序重放 持久化存储 机载 Flash / 边缘节点 校验和 + 双副本 掉电安全写入 中断事件 通信丢失 / 低电量 传感器故障 / 接管 恢复点选择策略 ① 最近一致检查点 ② 子目标边界检查点 ③ 资源可支撑检查点 状态重建与任务续行 加载基快照 → 重放增量日志 校验 state_version 与校验和 从恢复点继续剩余子目标 校验失败或版本不匹配 → 回退至更早检查点 关键约束:检查点写入必须原子化;恢复点应满足“状态一致 + 资源可支撑 + 不重复已完成子目标”。 典型参数示例:基快照周期 60 s,增量日志上限 200 条,存储双副本,恢复点回退不超过 2 个检查点。

三、持久化存储:让检查点在掉电与故障后仍可读

检查点写入存储介质时,最怕的是“写了一半掉电”。因此持久化必须满足原子性与可校验性。常见做法是双副本加校验和:先写副本 A,写入完成后计算 CRC32 并记录;再写副本 B。恢复时优先读取校验通过的副本,若两者都失败,则回退到更早的检查点。

存储位置也需要分层考虑。机载 Flash 适合保存最近若干检查点,保证断链后本地可恢复;边缘节点或地面站适合保存更长时间的历史检查点,用于任务复盘或跨平台迁移。对于带宽受限的链路,增量日志可以压缩后上传,基快照则按需上传。一个可参考的存储策略是:机载保留最近 5 个基快照与 200 条增量日志,边缘节点保留最近 24 小时的全部检查点。

四、恢复点选择策略:不是“最近”就一定最好

恢复点选择的目标是:在状态一致性、任务连续性和资源可行性之间取得平衡。常用策略有三类:

  • 最近一致检查点:选择时间上最近且校验通过的检查点,恢复代价最小,但可能落在某个子任务中间,导致部分动作重复。
  • 子目标边界检查点:优先选择刚完成一个子目标时的检查点,恢复后从下一个子目标开始,避免重复搜索或重复搬运。
  • 资源可支撑检查点:在候选检查点中,选择剩余电量或任务时间足以完成后续子目标的那个点;若都不满足,则选择返航点或安全悬停点。

实际系统中通常将三者组合成一条判断链:先筛出校验通过的检查点集合,再按“子目标边界优先”排序,最后用资源约束过滤。例如,某搜索任务在 T=180 s 时通信中断,最近检查点为 T=175 s(位于 A4 区域搜索中途),而 T=150 s 的检查点恰好完成 A3 子目标。若电量仅够再飞 90 s,则应选择 T=150 s 的检查点,直接进入 A4 区域,而不是从 T=175 s 继续,以免在 A4 内重复覆盖并耗尽电量。

实践提示:恢复点选择应记录决策依据,例如“选择 checkpoint_id=CP-150,原因:子目标边界 + 电量可支撑 A4/A5”。这样在任务复盘时才能判断恢复策略是否合理,并为后续参数调优提供依据。
常见误区:只保存位置而不保存任务阶段与已覆盖区域,恢复后系统会重新搜索已完成的区域;或者只写单副本且无校验,掉电后检查点损坏却无法察觉,导致恢复出错误状态。状态版本号缺失也会让新旧结构混用,引发解析异常。

综上,任务状态表示决定了“存什么”,快照与增量决定了“怎么存”,持久化决定了“存得住”,恢复点选择决定了“从哪继续”。四者共同构成任务中断恢复的检查点机制。工程实现时,建议先用最小字段集跑通“采集—写入—恢复”闭环,再逐步增加感知层与资源层的细粒度状态,避免一开始就追求全量快照而拖慢系统实时性。