# -*- coding: utf-8 -*- """ 装备状态基类 + 各域子类 ───────────────────────────────────────────────────────────────── BaseState 公共状态基类(dataclass) ├── AircraftState 飞行器状态 ├── GroundState 地面车辆/机器狗状态 └── RadarState 雷达状态 ───────────────────────────────────────────────────────────────── """ from __future__ import annotations import copy import dataclasses from dataclasses import dataclass, field from enum import Enum from typing import Any, Dict, List # ───────────────────────────────────────────────────────────────── # 飞行阶段枚举 # ───────────────────────────────────────────────────────────────── class FlightPhase(Enum): GROUND = "GROUND" # 地面停放 TAKEOFF = "TAKEOFF" # 起飞滑跑 CLIMB = "CLIMB" # 爬升 CRUISE = "CRUISE" # 巡航 DESCENT = "DESCENT" # 下降 APPROACH = "APPROACH" # 进近 LAND = "LAND" # 着陆 # ───────────────────────────────────────────────────────────────── # 公共状态基类 # ───────────────────────────────────────────────────────────────── @dataclass class BaseState: """ 装备公共状态基类 每次 step(dt) 后生成新的状态快照,不可变(frozen 语义)。 子类通过新增字段扩展特有状态。 """ # ── 时间 ────────────────────────────────────────────────────── timestamp: float = 0.0 # 仿真绝对时刻(秒) elapsed_time: float = 0.0 # 自启动累计时长(秒) # ── 位置 ────────────────────────────────────────────────────── latitude: float = 0.0 # 纬度(度,WGS-84) longitude: float = 0.0 # 经度(度,WGS-84) altitude: float = 0.0 # 高度(米,MSL) # ── 姿态 ────────────────────────────────────────────────────── heading: float = 0.0 # 航向角(度,真北顺时针) pitch: float = 0.0 # 俯仰角(度,抬头为正) roll: float = 0.0 # 横滚角(度,右滚为正) # ── 速度 ────────────────────────────────────────────────────── speed: float = 0.0 # 地速(m/s) acceleration: float = 0.0 # 切向加速度(m/s²) # ── 生命周期 ────────────────────────────────────────────────── lifecycle: str = "CREATED" # LifecycleState.value # ── 扩展 ────────────────────────────────────────────────────── extra: Dict[str, Any] = field(default_factory=dict) sub_states: List["BaseState"] = None # ── 属性 ────────────────────────────────────────────────────── @property def position(self) -> tuple: return (self.latitude, self.longitude, self.altitude) # ── 序列化 ──────────────────────────────────────────────────── def to_dict(self) -> Dict[str, Any]: return dataclasses.asdict(self) @classmethod def from_dict(cls, d: Dict[str, Any]) -> "BaseState": valid = {f.name for f in dataclasses.fields(cls)} return cls(**{k: v for k, v in d.items() if k in valid}) def copy_with(self, **kwargs) -> "BaseState": obj = copy.copy(self) for k, v in kwargs.items(): setattr(obj, k, v) return obj def __repr__(self) -> str: return (f"{self.__class__.__name__}(" f"t={self.timestamp:.1f}s, " f"pos=({self.latitude:.4f},{self.longitude:.4f}," f"{self.altitude:.0f}m), " f"hdg={self.heading:.1f}°, " f"spd={self.speed:.1f}m/s, " f"lc={self.lifecycle})") # ───────────────────────────────────────────────────────────────── # 飞行器状态 # ───────────────────────────────────────────────────────────────── @dataclass class AircraftState(BaseState): """飞行器完整状态""" # ── 飞行阶段 ────────────────────────────────────────────────── phase: str = FlightPhase.GROUND.value # ── 飞行动力学 ──────────────────────────────────────────────── airspeed: float = 0.0 # 空速(m/s) vertical_speed: float = 0.0 # 垂直速度(m/s,上升为正) bank_angle: float = 0.0 # 坡度角(度) turn_rate: float = 0.0 # 转弯角速度(°/s) # ── 燃油 ────────────────────────────────────────────────────── fuel_remaining: float = 0.0 # 剩余油量(升/千克) fuel_percent: float = 100.0 # 剩余油量百分比 # ── 航线进度 ────────────────────────────────────────────────── route_progress: float = 0.0 # 航线完成进度(0.0~1.0) segment_index: int = -1 # 当前航段索引 # -- 风向 wind_direction: float = 0.0 wind_speed: float = 0.0 # ───────────────────────────────────────────────────────────────── # 地面装备状态(车辆 / 机器狗) # ───────────────────────────────────────────────────────────────── @dataclass class GroundState(BaseState): """地面装备状态(车辆 / 机器狗通用)""" # ── 地形 ────────────────────────────────────────────────────── slope_deg: float = 0.0 # 当前坡度(度) road_type: str = "road" # road / offroad / track # ── 运动 ────────────────────────────────────────────────────── is_stopped: bool = True # 是否静止 odometer_m: float = 0.0 # 里程计(米) # ── 电量(机器狗)──────────────────────────────────────────── battery_percent: float = 100.0 # 电量百分比 # ── 航线进度 ────────────────────────────────────────────────── route_progress: float = 0.0 segment_index: int = -1 # ───────────────────────────────────────────────────────────────── # 雷达状态 # ───────────────────────────────────────────────────────────────── @dataclass class RadarState(BaseState): """雷达装备状态""" # ── 扫描 ────────────────────────────────────────────────────── current_azimuth: float = 0.0 # 当前扫描方位角(度) scan_elevation: float = 0.0 # 当前扫描仰角(度) scan_cycles: int = 0 # 累计扫描圈数 # ── 跟踪 ────────────────────────────────────────────────────── is_tracking: bool = False # 是否处于跟踪模式 tracked_count: int = 0 # 当前跟踪目标数 tracked_targets: List[str] = field(default_factory=list) # ── 工作状态 ────────────────────────────────────────────────── is_transmitting: bool = False # 是否发射 power_output_kw: float = 0.0 # 当前发射功率(kW)