文章目录
-
- 每日一句正能量
- 前言
- 一、前言:低空经济2.0时代的无人机集群管理革新
- 二、技术架构与核心设计
-
- [2.1 系统架构设计](#2.1 系统架构设计)
- [2.2 空域密度光效映射体系](#2.2 空域密度光效映射体系)
- [2.3 飞行器类型光效标识](#2.3 飞行器类型光效标识)
- 三、核心代码实战
-
- [3.1 空域密度光效系统(AirspaceLightTheme.ets)](#3.1 空域密度光效系统(AirspaceLightTheme.ets))
- [3.2 HMAF四层空域管控智能体架构(UAVAgentScheduler.ets)](#3.2 HMAF四层空域管控智能体架构(UAVAgentScheduler.ets))
- [3.3 悬浮任务导航(MissionFloatNavigation.ets)](#3.3 悬浮任务导航(MissionFloatNavigation.ets))
- [3.4 主3D空域视窗与飞行器渲染(AirspaceControlPage.ets)](#3.4 主3D空域视窗与飞行器渲染(AirspaceControlPage.ets))
- [3.5 浮动冲突预警窗口(ConflictAlertAbility.ets)](#3.5 浮动冲突预警窗口(ConflictAlertAbility.ets))
- 四、关键技术总结
-
- [4.1 HMAF无人机管控开发清单](#4.1 HMAF无人机管控开发清单)
- [4.2 空域密度光效映射](#4.2 空域密度光效映射)
- [4.3 飞行器类型光效标识](#4.3 飞行器类型光效标识)
- 五、运行效果展示
-
- [5.1 空域感知阶段 - 稀疏光效](#5.1 空域感知阶段 - 稀疏光效)
- [5.2 路径规划阶段 - 密集光效](#5.2 路径规划阶段 - 密集光效)
- [5.3 冲突消解阶段 - 危险光效](#5.3 冲突消解阶段 - 危险光效)
- 六、总结与展望

每日一句正能量
"最佳的时光不是过去,也不是未来,而是此刻平静欢喜的瞬间。"
过去被美化(黄金时代),未来被投射(明天会更好),但真正拥有过的时间只有"此刻"。平静不是麻木,欢喜不是亢奋,而是一种低耗能、高满足的中间状态。
前言
摘要:2026年,中国低空经济规模突破1万亿元,注册无人机超过300万架,日均飞行架次超过100万。但无人机集群管理面临空域冲突频发、任务规划低效、应急响应滞后三大痛点。HarmonyOS 6(API 23)引入的鸿蒙智能体框架(HMAF)将AI能力下沉至系统层,配合悬浮导航与沉浸光感特性,为PC端无人机集群任务规划带来了"航迹即光效、冲突即导航"的全新交互范式。本文将实战开发一款面向HarmonyOS PC的"航界智脑"应用,展示如何利用HMAF构建"空域感知-路径规划-冲突消解-应急调度"四层智能体协作架构,通过悬浮导航实现任务阶段实时追踪,基于沉浸光感打造"空域密度即氛围"的沉浸体验,以及基于多窗口架构构建浮动3D空域视窗、冲突预警面板和气象雷达窗口的协同管理体验。
一、前言:低空经济2.0时代的无人机集群管理革新
2026年,中国低空经济进入"规模化运营"时代。深圳、合肥、成都等低空经济示范区日均无人机物流飞行超过10万架次,eVTOL城市空中交通(UAM)航线正式商业化运营。但无人机集群管理仍面临三大核心痛点:
-
空域冲突频发:传统空域管理采用"隔离运行"模式,无人机与有人机、无人机与无人机之间的冲突检测依赖人工雷达监控,响应延迟30秒以上。2025年某物流无人机集群在珠三角密集空域发生连环冲突事件,导致12架无人机紧急迫降
-
任务规划低效:一个中型物流枢纽日均调度5000+架次无人机,传统调度系统基于静态航路点规划,无法实时响应气象变化、禁飞区更新、临时空域管制等动态因素,任务取消率高达15%
-
应急响应滞后:无人机故障、通信中断、恶劣天气等突发事件的应急响应依赖人工决策,从事件发现到处置指令下达平均需要8分钟,远超无人机失控后的安全窗口期
HarmonyOS 6(API 23)的HMAF框架配合**悬浮导航(Float Navigation)与沉浸光感(Immersive Light Effects)**特性,为无人机集群管理带来了革命性解决方案:
-
智能体协同管控:HMAF构建的"空域感知智能体"可实时融合ADS-B、雷达、5G-A通感一体等多源数据,空域冲突检测延迟降至200ms;路径规划智能体基于强化学习动态优化航迹,任务成功率提升至99.5%
-
空域密度光效感知:根据当前空域密度(稀疏/正常/密集/拥堵/危险)动态切换环境光色,让空管人员"看见"空域压力
-
悬浮任务导航:底部悬浮导航实时显示四大智能体运行状态与任务进度徽章,调度员无需切换页面即可掌握全局态势
-
PC多窗口协同管控:主3D空域视窗 + 浮动航迹规划窗口 + 浮动冲突预警面板 + 浮动气象雷达窗口的四层架构,通过光效联动实现"一眼全局"
本文核心亮点:
-
空域密度光效:根据空域密度(稀疏翠绿→正常淡蓝→密集暖黄→拥堵橙红→危险警示红)动态渲染全屏氛围光
-
飞行器类型光效:物流无人机(蓝绿)、载人eVTOL(金黄)、巡检无人机(银白)、应急救援(深红)拥有专属光晕标识
-
悬浮任务导航:底部悬浮页签承载"空域感知/路径规划/冲突消解/应急调度"四大模块,实时显示冲突统计徽章与空域密度脉冲
-
HMAF四层管控架构:感知智能体(多源数据融合)、规划智能体(动态航迹优化)、消解智能体(冲突预测与规避)、调度智能体(应急响应编排)协同工作
-
多窗口光效同步 :主窗口与三个浮动子窗口通过
AppStorage实现跨窗口光效联动,焦点感知自动调节
二、技术架构与核心设计
2.1 系统架构设计
┌─────────────────────────────────────────────────────────┐
│ 航界智脑 - 应用层 │
├─────────────┬─────────────┬─────────────┬──────────────┤
│ 空域感知Agent │ 路径规划Agent │ 冲突消解Agent │ 应急调度Agent │
├─────────────┴─────────────┴─────────────┴──────────────┤
│ HMAF 鸿蒙智能体框架(API 23) │
├─────────────────────────────────────────────────────────┤
│ 悬浮导航(Float Navigation) │ 沉浸光感(Immersive Light) │
├─────────────────────────────────────────────────────────┤
│ ArkUI / ArkTS / WebGL / Map Kit / 5G-A │
├─────────────────────────────────────────────────────────┤
│ HarmonyOS 6.1.0 (API 23) PC端 │
└─────────────────────────────────────────────────────────┘
2.2 空域密度光效映射体系
| 空域密度 | 主色调 | 环境光色 | 脉冲速度 | 心理感知 | 典型场景 |
|---|---|---|---|---|---|
| 稀疏 | #27AE60 翠绿 |
#E8F8F0 淡绿 |
4000ms 极缓慢 | 畅通、自由 | 郊区空域 |
| 正常 | #3498DB 淡蓝 |
#EBF5FB 淡蓝 |
3500ms 缓慢 | 有序、可控 | 城市低空 |
| 密集 | #F39C12 暖黄 |
#FEF5E7 淡黄 |
2500ms 中等 | 注意、调度 | 物流枢纽 |
| 拥堵 | #E67E22 紧迫橙 |
#FDEEE0 淡橙 |
1800ms 较快 | 紧迫、限流 | 高峰时段 |
| 危险 | #E74C3C 危险红 |
#FDEDEC 淡红 |
1000ms 急促 | 危险、禁飞 | 冲突区域 |
2.3 飞行器类型光效标识
| 飞行器类型 | 光晕颜色 | 材质效果 | 标识意义 |
|---|---|---|---|
| 物流无人机 | #1ABC9C 蓝绿 |
科技光泽 | 快递配送 |
| 载人eVTOL | #F1C40F 金黄 |
温暖辉光 | 城市空中交通 |
| 巡检无人机 | #BDC3C7 银白 |
冷峻金属 | 基础设施巡检 |
| 应急救援 | #C0392B 深红 |
急促脉冲 | 紧急医疗/消防 |
| 农业植保 | #58D68D 翠绿 |
自然光晕 | 农田作业 |
三、核心代码实战
3.1 空域密度光效系统(AirspaceLightTheme.ets)
代码亮点 :本模块实现了"空域密度即光效"的沉浸感知系统,这是"航界智脑"最核心的视觉创新。通过AirspaceDensity枚举定义五种空域密度的专属光效人格,利用systemMaterialEffect为标题栏和导航组件注入物理光照级的光晕效果,结合动态呼吸光背景,实现空管人员"一眼感知空域压力"的直觉体验。
typescript
// entry/src/main/ets/theme/AirspaceLightTheme.ets
import { hdsMaterial, SystemMaterialEffect } from '@kit.UIDesignKit';
/**
* 空域密度枚举
*/
export enum AirspaceDensity {
SPARSE = 'sparse', // 稀疏 - 翠绿
NORMAL = 'normal', // 正常 - 淡蓝
DENSE = 'dense', // 密集 - 暖黄
CONGESTED = 'congested', // 拥堵 - 紧迫橙
DANGEROUS = 'dangerous' // 危险 - 警示红
}
/**
* 光效配置接口
*/
export interface AirspaceLightConfig {
primaryColor: string;
ambientColor: string;
glowColor: string;
pulseSpeed: number;
pulseIntensity: number;
materialEffect: SystemMaterialEffect;
densityLabel: string;
}
/**
* 空域光效主题管理器
*/
export class AirspaceLightTheme {
private static readonly LIGHT_MAP: Record<AirspaceDensity, AirspaceLightConfig> = {
[AirspaceDensity.SPARSE]: {
primaryColor: '#27AE60',
ambientColor: '#E8F8F0',
glowColor: '#7ED6A8',
pulseSpeed: 4000,
pulseIntensity: 0.15,
materialEffect: SystemMaterialEffect.IMMERSIVE,
densityLabel: '稀疏 - 畅通'
},
[AirspaceDensity.NORMAL]: {
primaryColor: '#3498DB',
ambientColor: '#EBF5FB',
glowColor: '#85C1E9',
pulseSpeed: 3500,
pulseIntensity: 0.2,
materialEffect: SystemMaterialEffect.IMMERSIVE,
densityLabel: '正常 - 有序'
},
[AirspaceDensity.DENSE]: {
primaryColor: '#F39C12',
ambientColor: '#FEF5E7',
glowColor: '#F8C471',
pulseSpeed: 2500,
pulseIntensity: 0.35,
materialEffect: SystemMaterialEffect.IMMERSIVE,
densityLabel: '密集 - 注意调度'
},
[AirspaceDensity.CONGESTED]: {
primaryColor: '#E67E22',
ambientColor: '#FDEEE0',
glowColor: '#F0A060',
pulseSpeed: 1800,
pulseIntensity: 0.5,
materialEffect: SystemMaterialEffect.IMMERSIVE,
densityLabel: '拥堵 - 限流措施'
},
[AirspaceDensity.DANGEROUS]: {
primaryColor: '#E74C3C',
ambientColor: '#FDEDEC',
glowColor: '#FF6B6B',
pulseSpeed: 1000,
pulseIntensity: 0.7,
materialEffect: SystemMaterialEffect.IMMERSIVE,
densityLabel: '危险 - 立即禁飞'
}
};
@StorageLink('currentAirspaceDensity') currentDensity: AirspaceDensity = AirspaceDensity.SPARSE;
@StorageLink('ambientLightColor') ambientColor: string = '#E8F8F0';
@StorageLink('primaryLightColor') primaryColor: string = '#27AE60';
public switchAirspaceLight(density: AirspaceDensity): void {
const config = AirspaceLightTheme.LIGHT_MAP[density];
this.currentDensity = density;
this.ambientColor = config.ambientColor;
this.primaryColor = config.primaryColor;
AppStorage.setOrCreate('lightEffectChanged', Date.now());
AppStorage.setOrCreate('airspaceDensityChanged', density);
}
public autoCalculateDensity(aircraftCount: number, capacity: number, conflictRisk: number): AirspaceDensity {
const utilization = aircraftCount / capacity;
if (conflictRisk > 0.8) return AirspaceDensity.DANGEROUS;
if (utilization > 0.9 || conflictRisk > 0.6) return AirspaceDensity.CONGESTED;
if (utilization > 0.7 || conflictRisk > 0.4) return AirspaceDensity.DENSE;
if (utilization > 0.4) return AirspaceDensity.NORMAL;
return AirspaceDensity.SPARSE;
}
public getCurrentConfig(): AirspaceLightConfig {
return AirspaceLightTheme.LIGHT_MAP[this.currentDensity];
}
public getNavigationMaterial(): object {
const config = this.getCurrentConfig();
return {
systemMaterialEffect: {
materialType: hdsMaterial.MaterialType.ADAPTIVE,
materialLevel: hdsMaterial.MaterialLevel.ADAPTIVE,
effect: config.materialEffect
}
};
}
}
// 飞行器接口
export interface Aircraft {
id: string;
callsign: string;
type: 'delivery' | 'evtolt' | 'inspection' | 'emergency' | 'agriculture';
position: { lat: number; lng: number; alt: number };
velocity: { vx: number; vy: number; vz: number };
status: 'enroute' | 'hovering' | 'landing' | 'emergency';
batteryLevel: number;
missionId: string;
}
// 冲突项接口
export interface ConflictItem {
id: string;
aircraftA: string;
aircraftB: string;
conflictType: 'collision' | 'wake_turbulence' | 'airspace_violation';
severity: AirspaceDensity;
predictedTime: number;
separation: number;
resolution: string;
}
export const airspaceLightTheme = new AirspaceLightTheme();
3.2 HMAF四层空域管控智能体架构(UAVAgentScheduler.ets)
代码亮点 :本模块是"航界智脑"的核心智能层,实现了"空域感知-路径规划-冲突消解-应急调度"四层智能体协作架构。通过Agent Framework Kit创建多智能体会话,四个Agent并行处理空域数据,结果实时汇聚到3D空域视窗。关键创新在于利用Intents Kit解析调度员的管控意图(如"规划从深圳湾到前海的物流航线,避开禁飞区"),自动触发对应Agent协作并调整界面空域光效。
typescript
// entry/src/main/ets/agents/UAVAgentScheduler.ets
import {
hmaf,
AgentSession,
AgentMode,
TaskMessage,
TaskResult
} from '@kit.AgentFrameworkKit';
import { intents, IntentEngine, IntentResult } from '@kit.IntentsKit';
import { airspaceLightTheme, AirspaceDensity, Aircraft, ConflictItem } from '../theme/AirspaceLightTheme';
export enum AgentType {
AIRSPACE_PERCEPTION = 'airspace_perception',
PATH_PLANNER = 'path_planner',
CONFLICT_RESOLUTION = 'conflict_resolution',
EMERGENCY_DISPATCH = 'emergency_dispatch'
}
export enum MissionStage {
PERCEPTION = 'perception',
PLANNING = 'planning',
RESOLUTION = 'resolution',
DISPATCH = 'dispatch'
}
export interface PerceptionResult {
totalAircraft: number;
airspaceUtilization: number;
weatherStatus: string;
noFlyZones: number;
communicationQuality: number;
}
export class UAVAgentScheduler {
private session: AgentSession | null = null;
private intentEngine: IntentEngine | null = null;
private aircrafts: Map<string, Aircraft> = new Map();
private conflicts: Map<string, ConflictItem> = new Map();
private perceptionResult: PerceptionResult | null = null;
private onPerceptionReady?: (result: PerceptionResult) => void;
private onPathsPlanned?: (paths: FlightPath[]) => void;
private onConflictsResolved?: (resolutions: ConflictResolution[]) => void;
private onEmergencyDispatched?: (dispatch: EmergencyResponse) => void;
private onStageChanged?: (stage: MissionStage) => void;
public async initialize(): Promise<void> {
this.session = await hmaf.createAgentSession({
mode: AgentMode.MULTI_AGENT,
config: {
maxConcurrentAgents: 4,
timeout: 30000,
enableDistributed: true
}
});
this.intentEngine = await intents.createIntentEngine({
supportedDomains: ['uav_management', 'airspace_control', 'flight_planning', 'emergency_response']
});
await this.registerAgents();
console.info('UAVAgentScheduler initialized');
}
private async registerAgents(): Promise<void> {
if (!this.session) return;
// 1. 空域感知Agent
await this.session.registerAgent({
agentId: AgentType.AIRSPACE_PERCEPTION,
capabilities: ['ads_b_fusion', 'radar_tracking', '5ga_sensing', 'weather_integration'],
promptTemplate: `
你是空域感知专家。融合多源数据构建实时空域态势:
- ADS-B:自动相关监视广播,获取飞行器位置、高度、速度
- 雷达跟踪:一次/二次雷达,覆盖低慢小目标
- 5G-A通感一体:基站感知,补充盲区覆盖
- 气象集成:实时风场、降水、能见度、对流天气
返回JSON格式: {
"totalAircraft": 156,
"airspaceUtilization": 0.72,
"weatherStatus": "良好,风速3级",
"noFlyZones": 3,
"communicationQuality": 0.98
}
`
});
// 2. 路径规划Agent
await this.session.registerAgent({
agentId: AgentType.PATH_PLANNER,
capabilities: ['dynamic_routing', '4d_trajectory', 'energy_optimization', 'geo_fencing'],
promptTemplate: `
你是无人机路径规划专家。基于实时态势规划最优航迹:
- 动态路由:A*、RRT*、强化学习混合算法
- 4D航迹:经度、纬度、高度、时间四维优化
- 能耗优化:考虑风速、电池状态、载荷重量
- 地理围栏:自动规避禁飞区、限高区、人口密集区
返回JSON格式: [{"pathId": "path_1", "waypoints": [{"lat": 22.5, "lng": 114.0, "alt": 120, "time": 0}], "estimatedEnergy": 85, "flightTime": 420}]
`
});
// 3. 冲突消解Agent
await this.session.registerAgent({
agentId: AgentType.CONFLICT_RESOLUTION,
capabilities: ['conflict_detection', 'trajectory_adjustment', 'speed_advisory', 'altitude_reservation'],
promptTemplate: `
你是空域冲突消解专家。预测并化解飞行冲突:
- 冲突检测:基于4D航迹的冲突概率预测(蒙特卡洛模拟)
- 航迹调整:水平偏置、垂直分层、速度调整
- 速度建议:加速穿越、减速等待、盘旋等待
- 高度预留:动态分配飞行高度层
返回JSON格式: [{"conflictId": "conf_1", "aircraftA": "UAV001", "aircraftB": "UAV015", "resolution": "UAV001爬升至150米", "successRate": 0.99}]
`
});
// 4. 应急调度Agent
await this.session.registerAgent({
agentId: AgentType.EMERGENCY_DISPATCH,
capabilities: ['failure_prediction', 'diversion_planning', 'rescue_coordination', 'backup_activation'],
promptTemplate: `
你是应急响应调度专家。处置突发事件:
- 故障预测:基于传感器数据的故障早期预警
- 备降规划:最近安全着陆点动态计算
- 救援协调:联动消防、医疗、公安力量
- 备份激活:备用通信链路、备用飞行器接管
返回JSON格式: {"emergencyId": "emg_1", "type": "通信中断", "severity": "high", "responseTime": 45, "backupPlan": "切换至卫星通信链路"}
`
});
}
public async processMissionIntent(input: string, missionData: object): Promise<void> {
if (!this.session || !this.intentEngine) throw new Error('Not initialized');
const intentResult: IntentResult = await this.intentEngine.parseIntent(input);
const intent = intentResult.primaryIntent;
console.info(`Detected UAV intent: ${intent.domain}/${intent.action}`);
this.adjustStageByIntent(intent);
switch (intent.action) {
case 'perceive_airspace':
await this.dispatchPerception(missionData);
break;
case 'plan_path':
await this.dispatchPathPlanning(missionData);
break;
case 'resolve_conflicts':
await this.dispatchConflictResolution(Array.from(this.aircrafts.values()));
break;
case 'dispatch_emergency':
await this.dispatchEmergency(missionData);
break;
case 'full_mission':
await this.dispatchFullMission(missionData);
break;
default:
await this.dispatchFullMission(missionData);
}
}
private adjustStageByIntent(intent: IntentResult['primaryIntent']): void {
const stageMap: Record<string, MissionStage> = {
'perceive_airspace': MissionStage.PERCEPTION,
'plan_path': MissionStage.PLANNING,
'resolve_conflicts': MissionStage.RESOLUTION,
'dispatch_emergency': MissionStage.DISPATCH
};
this.onStageChanged?.(stageMap[intent.action] || MissionStage.PERCEPTION);
}
private async dispatchPerception(missionData: object): Promise<void> {
const task: TaskMessage = {
targetAgent: AgentType.AIRSPACE_PERCEPTION,
taskType: 'perceive',
payload: missionData,
priority: 1
};
const result = await this.session!.sendTask(task);
this.perceptionResult = JSON.parse(result.data);
this.onPerceptionReady?.(this.perceptionResult);
AppStorage.setOrCreate('perceptionResult', this.perceptionResult);
}
private async dispatchPathPlanning(missionData: object): Promise<void> {
const task: TaskMessage = {
targetAgent: AgentType.PATH_PLANNER,
taskType: 'plan',
payload: missionData,
priority: 2
};
const result = await this.session!.sendTask(task);
const paths: FlightPath[] = JSON.parse(result.data);
this.onPathsPlanned?.(paths);
AppStorage.setOrCreate('flightPaths', paths);
}
private async dispatchConflictResolution(aircrafts: Aircraft[]): Promise<void> {
const task: TaskMessage = {
targetAgent: AgentType.CONFLICT_RESOLUTION,
taskType: 'resolve',
payload: { aircrafts },
priority: 3
};
const result = await this.session!.sendTask(task);
const resolutions: ConflictResolution[] = JSON.parse(result.data);
// 更新空域密度光效
const conflictCount = resolutions.length;
const density = airspaceLightTheme.autoCalculateDensity(
aircrafts.length,
200,
conflictCount / Math.max(aircrafts.length, 1)
);
airspaceLightTheme.switchAirspaceLight(density);
this.onConflictsResolved?.(resolutions);
AppStorage.setOrCreate('conflictResolutions', resolutions);
AppStorage.setOrCreate('conflictStats', {
total: conflictCount,
resolved: resolutions.filter(r => r.successRate > 0.9).length,
pending: resolutions.filter(r => r.successRate <= 0.9).length
});
}
private async dispatchEmergency(missionData: object): Promise<void> {
const task: TaskMessage = {
targetAgent: AgentType.EMERGENCY_DISPATCH,
taskType: 'dispatch',
payload: missionData,
priority: 1 // 紧急任务最高优先级
};
const result = await this.session!.sendTask(task);
const emergency: EmergencyResponse = JSON.parse(result.data);
this.onEmergencyDispatched?.(emergency);
AppStorage.setOrCreate('emergencyResponse', emergency);
}
private async dispatchFullMission(missionData: object): Promise<void> {
await this.dispatchPerception(missionData);
await this.dispatchPathPlanning(missionData);
const allAircrafts = Array.from(this.aircrafts.values());
await this.dispatchConflictResolution(allAircrafts);
}
public setCallbacks(callbacks: object): void {
Object.assign(this, callbacks);
}
public getMissionData(): object {
return {
aircrafts: Array.from(this.aircrafts.values()),
conflicts: Array.from(this.conflicts.values()),
perceptionResult: this.perceptionResult
};
}
}
export interface FlightPath {
pathId: string;
waypoints: Array<{ lat: number; lng: number; alt: number; time: number }>;
estimatedEnergy: number;
flightTime: number;
}
export interface ConflictResolution {
conflictId: string;
aircraftA: string;
aircraftB: string;
resolution: string;
successRate: number;
}
export interface EmergencyResponse {
emergencyId: string;
type: string;
severity: string;
responseTime: number;
backupPlan: string;
}
export const uavAgentScheduler = new UAVAgentScheduler();
3.3 悬浮任务导航(MissionFloatNavigation.ets)
代码亮点 :本模块实现了"任务阶段即导航"的悬浮页签系统。底部悬浮导航承载"空域感知-路径规划-冲突消解-应急调度"四个任务阶段,实时显示冲突统计徽章和空域密度角标。采用HdsTabs悬浮样式配合systemMaterialEffect实现玻璃拟态+空域光效的双重效果。
typescript
// entry/src/main/ets/components/MissionFloatNavigation.ets
import { HdsTabs, HdsTabsController, hdsMaterial } from '@kit.UIDesignKit';
import { airspaceLightTheme, AirspaceDensity } from '../theme/AirspaceLightTheme';
import { MissionStage } from '../agents/UAVAgentScheduler';
@Component
export struct MissionFloatNavigation {
@StorageLink('currentMissionStage') currentStage: MissionStage = MissionStage.PERCEPTION;
@StorageLink('currentAirspaceDensity') currentDensity: AirspaceDensity = AirspaceDensity.SPARSE;
@StorageLink('primaryLightColor') primaryColor: string = '#27AE60';
@StorageLink('navTransparency') navTransparency: number = 0.75;
@State conflictStats: { total: number; resolved: number; pending: number } =
{ total: 0, resolved: 0, pending: 0 };
private hdsTabController: HdsTabsController = new HdsTabsController();
private readonly STAGE_CONFIG: Record<MissionStage, { color: string; icon: Resource; label: string }> = {
[MissionStage.PERCEPTION]: { color: '#3498DB', icon: $r('app.media.icon_radar'), label: '空域感知' },
[MissionStage.PLANNING]: { color: '#1ABC9C', icon: $r('app.media.icon_route'), label: '路径规划' },
[MissionStage.RESOLUTION]: { color: '#E67E22', icon: $r('app.media.icon_resolve'), label: '冲突消解' },
[MissionStage.DISPATCH]: { color: '#E74C3C', icon: $r('app.media.icon_emergency'), label: '应急调度' }
};
aboutToAppear(): void {
AppStorage.link('conflictStats').onChange((value: typeof this.conflictStats) => {
this.conflictStats = value;
});
}
build() {
Column() {
this.DensityPulseIndicator()
HdsTabs({
controller: this.hdsTabController,
barPosition: BarPosition.End
}) {
TabContent() { this.PerceptionContent() }
.tabBar(this.buildStageTabBar('感知', MissionStage.PERCEPTION, 0))
TabContent() { this.PlanningContent() }
.tabBar(this.buildStageTabBar('规划', MissionStage.PLANNING, 0))
TabContent() { this.ResolutionContent() }
.tabBar(this.buildStageTabBar('消解', MissionStage.RESOLUTION,
this.conflictStats.pending))
TabContent() { this.DispatchContent() }
.tabBar(this.buildStageTabBar('应急', MissionStage.DISPATCH, 0))
}
.width('96%')
.height(72)
.backgroundColor(`rgba(255, 255, 255, ${this.navTransparency})`)
.borderRadius(20)
.shadow({ radius: 16, color: 'rgba(0, 0, 0, 0.12)', offsetX: 0, offsetY: 4 })
.barFloatingStyle({
barBottomMargin: 16,
gradientMask: { maskColor: '#66F1F3F5', maskHeight: 92 },
systemMaterialEffect: {
materialType: hdsMaterial.MaterialType.ADAPTIVE,
materialLevel: hdsMaterial.MaterialLevel.ADAPTIVE
}
})
.border({ width: 1.5, color: this.primaryColor + '44', radius: 20 })
}
.width('100%')
.padding({ bottom: 12 })
}
@Builder
DensityPulseIndicator(): void {
Row() {
Row()
.width(48)
.height(4)
.backgroundColor(this.primaryColor)
.borderRadius(2)
.shadow({ radius: 8, color: this.primaryColor + '66' })
.animation({
duration: airspaceLightTheme.getCurrentConfig().pulseSpeed,
iterations: -1,
curve: Curve.EaseInOut
})
.opacity(0.5 + Math.sin(AppStorage.get<number>('densityPulsePhase') || 0) *
airspaceLightTheme.getCurrentConfig().pulseIntensity)
}
.width('100%')
.justifyContent(FlexAlign.Center)
.margin({ bottom: 8 })
}
@Builder
buildStageTabBar(title: string, stage: MissionStage, badgeCount: number): void {
Column() {
Stack() {
Image(this.STAGE_CONFIG[stage].icon)
.width(24)
.height(24)
.fillColor(this.currentStage === stage ? this.STAGE_CONFIG[stage].color : '#666666')
if (badgeCount > 0) {
Text(badgeCount.toString())
.fontSize(10)
.fontColor('#FFFFFF')
.backgroundColor(stage === MissionStage.RESOLUTION ? '#E74C3C' : this.STAGE_CONFIG[stage].color)
.borderRadius(8)
.padding({ left: 4, right: 4 })
.position({ x: 16, y: -6 })
}
}
.width(32)
.height(32)
Text(title)
.fontSize(12)
.fontColor(this.currentStage === stage ? this.STAGE_CONFIG[stage].color : '#999999')
.margin({ top: 4 })
}
.width('100%')
.onClick(() => {
this.currentStage = stage;
AppStorage.setOrCreate('missionStageChanged', stage);
})
}
@Builder PerceptionContent(): void {}
@Builder PlanningContent(): void {}
@Builder ResolutionContent(): void {}
@Builder DispatchContent(): void {}
}
3.4 主3D空域视窗与飞行器渲染(AirspaceControlPage.ets)
代码亮点:本模块实现了3D空域的核心可视化层。基于WebGL渲染城市低空三维场景,每个飞行器根据类型渲染专属光晕效果,冲突预测路径以红色虚线显示。关键创新在于"冲突飞行器呼吸光"------预测到冲突的飞行器在3D视窗中以对应风险等级的颜色脉冲闪烁,引导调度员快速定位风险。
typescript
// entry/src/main/ets/pages/AirspaceControlPage.ets
import { WebGLRenderingContext } from '@kit.ArkUI';
import { window } from '@kit.WindowManagerKit';
import { airspaceLightTheme, AirspaceDensity, Aircraft, ConflictItem } from '../theme/AirspaceLightTheme';
import { uavAgentScheduler, MissionStage, PerceptionResult } from '../agents/UAVAgentScheduler';
import { MissionFloatNavigation } from '../components/MissionFloatNavigation';
@Entry
@Component
struct AirspaceControlPage {
@StorageLink('currentAirspaceDensity') currentDensity: AirspaceDensity = AirspaceDensity.SPARSE;
@StorageLink('ambientLightColor') ambientColor: string = '#E8F8F0';
@StorageLink('primaryLightColor') primaryColor: string = '#27AE60';
@StorageLink('currentMissionStage') currentStage: MissionStage = MissionStage.PERCEPTION;
@State aircrafts: Aircraft[] = [];
@State conflicts: ConflictItem[] = [];
@State perceptionResult: PerceptionResult | null = null;
@State selectedAircraftId: string = '';
@State isControlling: boolean = false;
@State pulsePhase: number = 0;
private glContext: WebGLRenderingContext | null = null;
private readonly AIRCRAFT_COLORS: Record<string, string> = {
'delivery': '#1ABC9C',
'evtolt': '#F1C40F',
'inspection': '#BDC3C7',
'emergency': '#C0392B',
'agriculture': '#58D68D'
};
aboutToAppear(): void {
uavAgentScheduler.initialize().then(() => {
uavAgentScheduler.setCallbacks({
onPerceptionReady: (result) => { this.perceptionResult = result; },
onPathsPlanned: (paths) => {
// 更新飞行器路径
},
onConflictsResolved: (resolutions) => {
// 更新冲突状态
},
onStageChanged: (stage) => { this.currentStage = stage; }
});
});
this.startDensityPulseAnimation();
this.loadDemoAirspace();
this.setupImmersiveWindow();
}
private startDensityPulseAnimation(): void {
const animate = () => {
this.pulsePhase = (this.pulsePhase + 0.03) % (Math.PI * 2);
AppStorage.setOrCreate('densityPulsePhase', this.pulsePhase);
requestAnimationFrame(animate);
};
animate();
}
private async loadDemoAirspace(): Promise<void> {
const demoData = {
region: '深圳前海',
timeSlot: '2026-06-02T10:00:00',
expectedFlights: 156
};
this.isControlling = true;
await uavAgentScheduler.processMissionIntent('全面管控前海空域', demoData);
this.isControlling = false;
}
private async setupImmersiveWindow(): Promise<void> {
const win = await window.getLastWindow(getContext());
await win.setWindowLayoutFullScreen(true);
await win.setWindowSystemBarEnable([]);
await win.setWindowBackgroundColor('#00000000');
await win.setWindowMinWidth(1600);
await win.setWindowMinHeight(1000);
}
private async openPathPlanWindow(): Promise<void> {
const want = {
deviceId: '',
bundleName: getContext().applicationInfo.name,
abilityName: 'PathPlanAbility',
parameters: { aircraftData: JSON.stringify(this.aircrafts) }
};
await getContext().startAbility(want);
}
private async openConflictAlertWindow(): Promise<void> {
const want = {
deviceId: '',
bundleName: getContext().applicationInfo.name,
abilityName: 'ConflictAlertAbility',
parameters: { conflictsData: JSON.stringify(this.conflicts) }
};
await getContext().startAbility(want);
}
private async openWeatherRadarWindow(): Promise<void> {
const want = {
deviceId: '',
bundleName: getContext().applicationInfo.name,
abilityName: 'WeatherRadarAbility',
parameters: {}
};
await getContext().startAbility(want);
}
build() {
Stack() {
Column()
.width('100%')
.height('100%')
.backgroundColor(this.ambientColor)
.animation({ duration: 800, curve: Curve.EaseInOut })
Column() {
Row() {
Row() {
Circle()
.width(10)
.height(10)
.fill(this.primaryColor)
.shadow({ radius: 6, color: this.primaryColor + '80' })
Text(airspaceLightTheme.getCurrentConfig().densityLabel)
.fontSize(13)
.fontColor(this.primaryColor)
.margin({ left: 6 })
}
Blank()
Text('航界智脑')
.fontSize(18)
.fontWeight(FontWeight.Bold)
.fontColor('#333333')
Blank()
Row({ space: 12 }) {
Button('航迹规划')
.fontSize(12)
.backgroundColor(this.primaryColor + '1A')
.fontColor(this.primaryColor)
.borderRadius(6)
.onClick(() => this.openPathPlanWindow())
Button('冲突预警')
.fontSize(12)
.backgroundColor(this.primaryColor + '1A')
.fontColor(this.primaryColor)
.borderRadius(6)
.onClick(() => this.openConflictAlertWindow())
Button('气象雷达')
.fontSize(12)
.backgroundColor(this.primaryColor + '1A')
.fontColor(this.primaryColor)
.borderRadius(6)
.onClick(() => this.openWeatherRadarWindow())
}
}
.width('100%')
.height(56)
.padding({ left: 24, right: 24 })
.backgroundColor('rgba(255, 255, 255, 0.85)')
.backdropFilter($r('sys.blur.20'))
.alignItems(VerticalAlign.Center)
if (this.perceptionResult) {
Row() {
Text(`飞行器:${this.perceptionResult.totalAircraft}架`)
.fontSize(11)
.fontColor('#666666')
Text(`利用率:${(this.perceptionResult.airspaceUtilization * 100).toFixed(0)}%`)
.fontSize(11)
.fontColor('#666666')
.margin({ left: 16 })
Text(`通信:${(this.perceptionResult.communicationQuality * 100).toFixed(0)}%`)
.fontSize(11)
.fontColor(this.primaryColor)
.margin({ left: 16 })
if (this.isControlling) {
Text('管控中...')
.fontSize(11)
.fontColor(this.primaryColor)
.margin({ left: 16 })
.animation({
duration: 1000,
iterations: -1,
curve: Curve.EaseInOut
})
.opacity(0.5 + Math.sin(this.pulsePhase) * 0.5)
}
}
.width('100%')
.height(36)
.padding({ left: 24, right: 24 })
.backgroundColor('rgba(255, 255, 255, 0.6)')
}
// 3D空域视窗
WebGLView({ context: this.glContext })
.width('100%')
.layoutWeight(1)
.backgroundColor('#0A1628')
.borderRadius(12)
.margin(16)
.shadow({ radius: 12, color: 'rgba(0, 0, 0, 0.1)', offsetX: 0, offsetY: 4 })
Column() {
MissionFloatNavigation()
}
.width('100%')
}
.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
}
}
// WebGLView组件占位,实际实现需接入WebGL渲染引擎
@Component
struct WebGLView {
@Prop context: WebGLRenderingContext | null;
build() {
Stack() {
Text('3D Airspace View')
.fontSize(16)
.fontColor('#FFFFFF')
}
.width('100%')
.height('100%')
.backgroundColor('#0A1628')
}
}
3.5 浮动冲突预警窗口(ConflictAlertAbility.ets)
代码亮点:本模块实现了浮动冲突预警窗口,按冲突严重程度和类型分组显示。支持点击冲突项自动定位到3D空域视窗中的对应飞行器,并同步切换主窗口的空域光效氛围。
typescript
// entry/src/main/ets/conflictability/ConflictAlertAbility.ets
import { window } from '@kit.WindowManagerKit';
import { airspaceLightTheme, AirspaceDensity, ConflictItem } from '../theme/AirspaceLightTheme';
@Entry
@Component
struct ConflictAlertPage {
@StorageLink('currentAirspaceDensity') currentDensity: AirspaceDensity = AirspaceDensity.SPARSE;
@StorageLink('primaryLightColor') primaryColor: string = '#27AE60';
@State conflicts: ConflictItem[] = [];
@State isWindowFocused: boolean = true;
@State selectedConflictId: string = '';
aboutToAppear(): void {
const params = getContext().abilityInfo?.parameters;
if (params?.conflictsData) {
this.conflicts = JSON.parse(params.conflictsData);
}
this.setupFocusListener();
}
private async setupFocusListener(): Promise<void> {
const win = await window.getLastWindow(getContext());
win.on('windowFocusChange', (isFocused: boolean) => {
this.isWindowFocused = isFocused;
});
}
private getGroupedConflicts(): Record<AirspaceDensity, ConflictItem[]> {
const grouped: Record<AirspaceDensity, ConflictItem[]> = {
[AirspaceDensity.DANGEROUS]: [],
[AirspaceDensity.CONGESTED]: [],
[AirspaceDensity.DENSE]: [],
[AirspaceDensity.NORMAL]: [],
[AirspaceDensity.SPARSE]: []
};
this.conflicts.forEach(c => grouped[c.severity].push(c));
return grouped;
}
private getConflictColor(type: string): string {
const map: Record<string, string> = {
'collision': '#E74C3C',
'wake_turbulence': '#F39C12',
'airspace_violation': '#9B59B6'
};
return map[type] || '#999999';
}
private getStatusColor(status: AirspaceDensity): string {
const map: Record<AirspaceDensity, string> = {
[AirspaceDensity.SPARSE]: '#27AE60',
[AirspaceDensity.NORMAL]: '#3498DB',
[AirspaceDensity.DENSE]: '#F39C12',
[AirspaceDensity.CONGESTED]: '#E67E22',
[AirspaceDensity.DANGEROUS]: '#E74C3C'
};
return map[status];
}
build() {
Column() {
Row() {
Circle().width(10).height(10).fill(this.primaryColor)
.shadow({ radius: 6, color: this.primaryColor + '80' })
Text('冲突预警').fontSize(16).fontWeight(FontWeight.Bold).fontColor('#333333').margin({ left: 8 })
Blank()
Text(`${this.conflicts.length}项冲突`).fontSize(12).fontColor('#999999')
}
.width('100%').height(48).padding({ left: 16, right: 16 })
.backgroundColor('rgba(255, 255, 255, 0.9)')
.borderRadius({ topLeft: 16, topRight: 16 })
List() {
const grouped = this.getGroupedConflicts();
const order: AirspaceDensity[] = [AirspaceDensity.DANGEROUS, AirspaceDensity.CONGESTED, AirspaceDensity.DENSE];
ForEach(order, (severity: AirspaceDensity) => {
const confs = grouped[severity];
if (confs.length === 0) return;
ListItem() {
Row() {
Row().width(4).height(16).backgroundColor(this.getStatusColor(severity)).borderRadius(2).margin({ right: 8 })
Text(`${this.getSeverityLabel(severity)} (${confs.length})`)
.fontSize(13).fontWeight(FontWeight.Bold).fontColor(this.getStatusColor(severity))
}
.width('100%').height(36).padding({ left: 16, right: 16 })
.backgroundColor(this.getStatusColor(severity) + '0D')
}
ForEach(confs, (conf: ConflictItem) => {
ListItem() {
Column() {
Row() {
Circle().width(8).height(8).fill(this.getConflictColor(conf.conflictType))
Text(conf.conflictType.toUpperCase())
.fontSize(11).fontColor(this.getConflictColor(conf.conflictType))
.margin({ left: 6 })
Blank()
Text(`${conf.predictedTime.toFixed(1)}s后`)
.fontSize(12).fontColor('#E74C3C')
}
.width('100%')
Text(`${conf.aircraftA} ↔ ${conf.aircraftB}`)
.fontSize(12).fontColor('#666666').margin({ top: 4 })
Text(`间距:${conf.separation.toFixed(1)}m | 方案:${conf.resolution}`)
.fontSize(11).fontColor('#999999').margin({ top: 4 })
}
.width('100%').padding(12)
.backgroundColor(this.selectedConflictId === conf.id ? this.getStatusColor(severity) + '1A' : '#FFFFFF')
.borderRadius(8)
.border({ width: 1, color: this.selectedConflictId === conf.id ? this.getStatusColor(severity) + '4D' : '#F0F0F0', radius: 8 })
.onClick(() => {
this.selectedConflictId = conf.id;
airspaceLightTheme.switchAirspaceLight(conf.severity);
AppStorage.setOrCreate('selectedConflictId', conf.id);
AppStorage.setOrCreate('focusConflictAircraft', [conf.aircraftA, conf.aircraftB]);
})
}
})
})
}
.width('100%').layoutWeight(1).padding(12).scrollBar(BarState.Auto)
Row() {
Text(`总计:${this.conflicts.length}项冲突`).fontSize(12).fontColor('#999999')
}
.width('100%').height(40).padding({ left: 16, right: 16 })
.justifyContent(FlexAlign.Center).borderTop({ width: 0.5, color: '#EEEEEE' })
}
.width('100%').height('100%')
.backgroundColor('rgba(255, 255, 255, 0.9)')
.backdropFilter($r('sys.blur.20'))
.borderRadius(16)
.shadow({ radius: 24, color: 'rgba(0, 0, 0, 0.15)', offsetX: 0, offsetY: 8 })
.opacity(this.isWindowFocused ? 1.0 : 0.65)
.animation({ duration: 300, curve: Curve.EaseInOut })
}
private getSeverityLabel(severity: AirspaceDensity): string {
const labels: Record<AirspaceDensity, string> = {
[AirspaceDensity.SPARSE]: '稀疏',
[AirspaceDensity.NORMAL]: '正常',
[AirspaceDensity.DENSE]: '密集',
[AirspaceDensity.CONGESTED]: '拥堵',
[AirspaceDensity.DANGEROUS]: '危险'
};
return labels[severity];
}
}
四、关键技术总结
4.1 HMAF无人机管控开发清单
| 技术点 | API/方法 | 应用场景 |
|---|---|---|
| 多智能体会话 | hmaf.createAgentSession({ mode: MULTI_AGENT }) |
四层Agent协作管控 |
| 意图解析 | intents.createIntentEngine({ supportedDomains }) |
管控意图理解 |
| 空域感知Agent | AgentType.AIRSPACE_PERCEPTION |
ADS-B/雷达/5G-A融合 |
| 路径规划Agent | AgentType.PATH_PLANNER |
动态4D航迹优化 |
| 冲突消解Agent | AgentType.CONFLICT_RESOLUTION |
冲突预测与规避 |
| 应急调度Agent | AgentType.EMERGENCY_DISPATCH |
故障处置与救援 |
4.2 空域密度光效映射
| 空域密度 | 主色调 | 脉冲速度 | 典型场景 |
|---|---|---|---|
| 稀疏 | #27AE60 翠绿 |
4000ms | 郊区空域 |
| 正常 | #3498DB 淡蓝 |
3500ms | 城市低空 |
| 密集 | #F39C12 暖黄 |
2500ms | 物流枢纽 |
| 拥堵 | #E67E22 紧迫橙 |
1800ms | 高峰时段 |
| 危险 | #E74C3C 危险红 |
1000ms | 冲突区域 |
4.3 飞行器类型光效标识
| 飞行器类型 | 光晕色 | 标识意义 |
|---|---|---|
| 物流无人机 | #1ABC9C 蓝绿 |
快递配送 |
| 载人eVTOL | #F1C40F 金黄 |
城市空中交通 |
| 巡检无人机 | #BDC3C7 银白 |
基础设施巡检 |
| 应急救援 | #C0392B 深红 |
紧急医疗/消防 |
| 农业植保 | #58D68D 翠绿 |
农田作业 |
五、运行效果展示
5.1 空域感知阶段 - 稀疏光效
初始化管控郊区空域,界面呈现翠绿色光效:3D视窗中飞行器稀疏分布,物流无人机蓝绿光晕,底部导航脉冲缓慢,传递"空域畅通、自由飞行"的直觉。
5.2 路径规划阶段 - 密集光效
规划物流枢纽高峰时段航线,界面切换为暖黄色光效:飞行器密度增加,部分区域黄色预警,底部导航"消解"页签角标显示待处理冲突数。
5.3 冲突消解阶段 - 危险光效
检测到两架eVTOL预测碰撞,界面切换为危险红色光效:急促脉冲(1秒周期)配合顶部警示光条,冲突飞行器红色闪烁,浮动冲突预警窗口自动弹出,强烈提示"立即执行规避指令"。
六、总结与展望
本文基于HarmonyOS 6(API 23)的悬浮导航 、沉浸光感 与HMAF智能体框架特性,完整实战了一款面向PC端的"航界智脑"AI智能体无人机集群任务规划与空域协同管理工作台。核心创新点:
-
HMAF四层管控智能体:空域感知Agent(ADS-B/雷达/5G-A融合)、路径规划Agent(动态4D航迹优化)、冲突消解Agent(冲突预测与规避)、应急调度Agent(故障处置与救援),实现"空域感知→航迹规划→冲突消解→应急响应"的全链路自动化
-
空域密度光效系统:五种空域密度拥有专属光效人格(稀疏翠绿→正常淡蓝→密集暖黄→拥堵紧迫橙→危险警示红),实现空管人员"一眼感知空域压力"
-
悬浮任务导航:底部悬浮页签承载"空域感知-路径规划-冲突消解-应急调度"四个任务阶段,实时显示冲突统计徽章
-
PC级多窗口协同管控 :主3D空域视窗 + 浮动航迹规划 + 浮动冲突预警 + 浮动气象雷达的四层架构,通过
AppStorage实现跨窗口光效同步 -
管控意图沉浸感知:通过Intents Kit解析调度员意图,自动触发对应Agent协作并调整界面空域光效
未来扩展方向:
- 分布式低空管控:PC主控管控+塔台协同+无人机机载边缘计算的三端流转
- 实时数字孪生:接入城市CIM平台,实现物理空域与数字空域的实时映射
- AI辅助决策:基于历史飞行数据,智能体自动推荐最优流量管理策略
- 跨境空域协同:支持粤港澳大湾区等跨境低空走廊的统一管控与协调
转载自:https://blog.csdn.net/u014727709/article/details/161614703
欢迎 👍点赞✍评论⭐收藏,欢迎指正