2. 无人系统任务编排的对象建模

任务编排系统要可靠运行,前提是把现实世界中的无人系统任务“翻译”成计算机能理解、能推理、能校验的形式化对象。本节讨论六类核心建模对象——任务、阶段、资源、约束、事件与状态——以及它们之间的形式化描述方法。理解这些对象的语义边界和相互关系,是后续编排算法、调度求解与执行监控的基础。

六类建模对象的语义定位

可以把一次无人系统作业看作一个受约束的离散事件系统。任务(Task)是顶层目标单元,描述“要达成什么”,例如“对A区完成一次覆盖侦察”。阶段(Phase)是任务在时间与逻辑上的分解,描述“按什么顺序做”,例如起飞、爬升、区域扫描、返航。资源(Resource)是执行阶段所消耗或占用的实体,包括无人机平台、载荷、通信链路、频谱、机场停机位、操作员等。约束(Constraint)是对任务、阶段、资源组合的合法性与可行性限制,如时间窗、电量、载荷能力、空域禁飞、最小间隔。事件(Event)是系统内部或外部发生的、会改变执行走向的离散信号,如“到达航点”“电量低于阈值”“链路中断”“目标识别成功”。状态(State)是系统在某一时刻的完整快照,由各对象当前取值共同决定。

这六类对象不是并列的,而是存在明确的引用关系:任务包含阶段,阶段绑定资源并受约束限制,事件触发状态迁移,状态又反过来决定阶段能否继续推进。形式化描述的关键,就是把这些关系写成可校验的数据结构,而不是散落在自然语言文档里。

任务 Task 目标:A区覆盖侦察 · 优先级 P1 分解为 阶段 P1 起飞 t=0s · 高度 0→50m 阶段 P2 区域扫描 t=60s · 蛇形航线 阶段 P3 返航 t=300s · 高度 50→0m 阶段 P4 降落 t=360s · 着陆 资源 Resource UAV-01 · 四旋翼 · 电量 100% 载荷:可见光相机 · 链路:5.8GHz 操作员:OP-A · 机场:H1 约束 Constraint 时间窗 [0, 600s] · 电量 ≥ 20% 空域:禁飞区 R2 不可进入 最小间隔 30s · 载荷分辨率 ≥ 2cm 事件 Event 到达航点 · 电量低 · 链路中断 目标识别成功 · 避障触发 任务超时 · 人工接管 绑定 受限于 触发迁移 状态 State(系统快照) S = ⟨ 当前阶段, 资源占用, 电量, 位置, 链路质量, 已完成事件集 ⟩ 示例:⟨P2, UAV-01占用, 78%, (120,45,50), 良好, {到达航点}⟩ 状态驱动阶段推进 图例: 任务 阶段 资源 约束 事件 状态 引用/分解 状态汇聚/反馈 说明:任务分解为有序阶段;阶段绑定资源并受约束限制;事件触发阶段迁移;资源、约束、事件共同决定系统状态,状态又驱动阶段推进。

形式化描述:从自然语言到可校验结构

形式化描述的目标是让每个对象都有明确的字段、类型和取值域。以任务为例,可用六元组表示:Task = ⟨ID, Goal, Phases, Priority, Deadline, SuccessCriteria⟩。其中 Goal 是目标描述,Phases 是有序阶段列表,Priority 是优先级,Deadline 是截止时间,SuccessCriteria 是成功判据。阶段可表示为 Phase = ⟨ID, TaskID, Precondition, Action, Duration, ResourceReq, Postcondition⟩,Precondition 和 Postcondition 分别描述进入和退出该阶段必须满足的条件。

资源的形式化需要区分“能力”和“实例”。能力描述资源能做什么,例如 Capability = ⟨type, maxPayload, endurance, sensors⟩;实例描述具体某个资源当前的状态,例如 ResourceInstance = ⟨ID, CapabilityRef, Location, Battery, Availability⟩。约束通常写成谓词或不等式,例如时间窗约束 start(P2) ≥ 60 ∧ end(P2) ≤ 300,电量约束 battery(t) ≥ 0.2 × battery_max,空域约束用几何区域与航迹的相交判断表示。

事件的形式化强调“触发条件”和“响应动作”:Event = ⟨ID, Source, Condition, Timestamp, Payload, Handler⟩。Condition 是一个可求值的布尔表达式,Handler 是事件发生时要执行的状态迁移或阶段切换逻辑。状态则用一组变量描述:State = ⟨currentPhase, resourceAlloc, battery, position, linkQuality, completedEvents⟩。状态迁移可写成 State × Event → State',即当前状态在某个事件作用下转移到新状态。

建模示例:一次区域侦察任务

假设任务为“UAV-01 在 600 秒内完成 A 区覆盖侦察,电量不低于 20%,禁飞区 R2 不可进入”。形式化后:任务 T1 包含四个阶段 P1 起飞、P2 扫描、P3 返航、P4 降落。P2 绑定资源 UAV-01,受约束“时间窗 [60,300]”“电量 ≥ 20%”“航迹与 R2 无交集”。事件包括“到达航点 W3”“电量降至 25%”“链路质量低于阈值”。当电量事件触发时,若当前阶段为 P2,则状态迁移到“提前返航”分支,P3 的 Precondition 被满足,系统进入返航阶段。

这种描述方式的价值在于可校验:给定一组资源、约束和事件序列,可以自动判断任务是否可行、哪个阶段会失败、失败后应切换到哪条分支。它也为后续的调度求解、冲突检测和运行时监控提供了统一的数据基础。

建模时建议先固定字段命名和取值域,再填充具体任务数据。字段命名一旦确定,后续所有阶段、资源和约束都引用同一套定义,避免出现“同一含义多种写法”导致校验失败。

常见建模错误与规避

  • 阶段粒度不一致:有的阶段是“起飞”,有的阶段是“完成侦察”,前者是动作,后者是结果。应统一为可执行的动作单元,结果放到 Postcondition 中描述。
  • 约束散落在文字里:把“电量不低于20%”写在备注中而不写成可求值表达式,导致无法自动校验。约束必须落到具体变量和阈值上。
  • 事件与状态混淆:“电量低”是事件,“电量=25%”是状态。事件是瞬时的触发信号,状态是持续的快照,两者在迁移逻辑中角色不同。
  • 资源能力与实例混用:用“四旋翼”代替“UAV-01”,导致无法追踪具体平台的实时状态。能力用于匹配,实例用于调度。

掌握这六类对象的形式化描述方法后,任务编排就从“写文档”变成了“建模型”。下一阶段的工作——调度求解、冲突消解与执行监控——都建立在这一套对象定义之上。