4. 任务规划与调度模块集成
任务规划与调度模块是无人系统自主任务平台的“决策中枢”。它把上层下达的任务意图,翻译成无人系统可执行、可调度、可校验的动作序列,并在资源、时间、约束之间做出取舍。集成这一模块时,核心不是“把算法塞进系统”,而是打通四件事:任务怎么描述、任务怎么分解、任务按什么优先级与时间窗调度、规划算法以什么方式接入平台。
一、任务描述语言:把意图变成机器可读的契约
任务描述语言(Task Description Language, TDL)是规划模块的输入契约。它需要同时表达三层信息:任务目标(做什么)、约束条件(在什么限制下做)、执行语义(做到什么程度算完成)。在工程集成中,常用“结构化文本 + 参数表”的方式,而不是自由自然语言。例如一个区域侦察任务可描述为:
task_id: RECON_A03
type: area_recon
area: polygon[(116.20,39.90),(116.35,39.90),(116.35,40.02),(116.20,40.02)]
altitude: 120m ± 10m
speed: 12m/s
sensor: EO_IR
time_window: [2025-06-01T08:00, 2025-06-01T10:00]
priority: P2
completion: coverage ≥ 95% AND revisit ≤ 30min
集成时要注意:TDL 的字段必须与平台内部的任务对象模型一一映射,避免“描述语言一套、内部模型另一套”的双重维护。建议在平台中定义统一的 Task 对象,TDL 只作为序列化格式,解析后直接填充对象字段。这样规划算法、调度器、执行监控都面向同一份数据,减少集成缝隙。
二、任务分解:从高层任务到可执行原子动作
高层任务通常不能直接执行,需要分解为原子动作(如起飞、航点飞行、传感器开机、数据回传、降落)。分解的关键是保持约束可传递:父任务的时间窗、优先级、区域限制,必须能向下传递到子动作,否则调度器会丢失全局约束。
一种实用的分解方式是“任务树 + 约束继承”。以 RECON_A03 为例,可分解为:起飞 → 爬升到 120m → 按多边形边界生成扫描航线 → EO/IR 采集 → 数据回传 → 返航降落。每个子动作继承父任务的时间窗和优先级,同时可附加自身约束(如爬升阶段禁止传感器开机)。分解结果应输出为动作列表,每个动作带 action_id、precondition、effect、duration_est、resource 字段,供调度器使用。
三、优先级调度与时间窗约束
调度器要解决的是“多个任务争抢有限资源”的问题。优先级通常分为 P0(紧急)、P1(高)、P2(中)、P3(低)。调度策略可采用“优先级抢占 + 时间窗校验”:先按优先级排序,再检查每个任务的时间窗是否与已排任务冲突。若冲突,低优先级任务让位,或调整到窗口内的其他时段。
时间窗约束有两种常见形式:硬窗口(必须在 [t_start, t_end] 内完成,否则任务失败)和软窗口(尽量在窗口内,超出可接受但降级)。集成时要在调度器中显式区分,硬窗口任务不满足时触发告警或重规划,软窗口任务可记录偏差并继续执行。
一个实用的调度判断逻辑是:对每个待排任务,计算其“最晚开始时间” = t_end - duration_est。若当前时间已超过最晚开始时间,则硬窗口任务标记为不可行,软窗口任务降级。调度结果输出为时间轴上的任务序列,每个任务带 planned_start、planned_end、assigned_resource。
四、规划算法接入方式
规划算法接入平台,推荐采用“插件式接口”,而不是把算法代码直接嵌入调度器。接口定义输入输出:输入是分解后的动作列表、约束集合、资源状态;输出是可执行航路或动作时序。平台负责调用、超时控制、结果校验和异常回退。
常见接入方式有三种:进程内调用(算法以库形式链接,延迟低,适合 A*、CSP 等轻量算法);进程间调用(算法独立进程,通过 gRPC/ROS 通信,适合 RRT* 等计算量大的算法);服务化调用(算法部署为远程服务,适合多机共享规划能力)。集成时要统一坐标系和时间基准,避免算法输出与平台执行之间出现“米/度”“秒/毫秒”混用。
最后,规划与调度模块的集成不是一次性的,而是随任务类型增加持续迭代。建议先打通一条最小闭环:一个 TDL 任务 → 分解为 3~5 个动作 → 调度器排入时间窗 → 算法输出航路 → 执行监控回传状态。闭环跑通后,再逐步增加优先级抢占、多机协同、动态重规划等能力。