# -*- coding: utf-8 -*- """ 无人系统遥测数据模型 ───────────────────────────────────────────────────────────────── BaseTelemetry 通用遥测基类 UAVTelemetry 无人机遥测 RobotDogTelemetry 机器狗遥测 ───────────────────────────────────────────────────────────────── """ from __future__ import annotations import dataclasses import time from dataclasses import dataclass, field from enum import Enum from typing import Any, Dict, List # ───────────────────────────────────────────────────────────────── # 设备连接状态 # ───────────────────────────────────────────────────────────────── class ConnectionState(Enum): DISCONNECTED = "disconnected" CONNECTING = "connecting" CONNECTED = "connected" DEGRADED = "degraded" # 连接质量差 LOST = "lost" # 信号丢失 # ───────────────────────────────────────────────────────────────── # 通用遥测基类 # ───────────────────────────────────────────────────────────────── @dataclass class BaseTelemetry: """ 无人系统通用遥测数据基类 所有遥测字段均有默认值,确保部分遥测数据缺失时不崩溃。 子类通过新增字段扩展特有遥测项。 """ # ── 标识 ────────────────────────────────────────────────────── device_id: str = "" device_type: str = "" timestamp: float = field(default_factory=time.time) # ── 连接 ────────────────────────────────────────────────────── connection_state: str = ConnectionState.DISCONNECTED.value signal_strength: int = 0 # 信号强度(0~100) latency_ms: float = 0.0 # 通信延迟(ms) packet_loss_pct: float = 0.0 # 丢包率(%) # ── 位置姿态 ────────────────────────────────────────────────── latitude: float = 0.0 # 纬度(度) longitude: float = 0.0 # 经度(度) altitude: float = 0.0 # 高度(米,MSL) relative_altitude: float = 0.0 # 相对高度(米,AGL) heading: float = 0.0 # 航向(度,真北) pitch: float = 0.0 # 俯仰角(度) roll: float = 0.0 # 横滚角(度) # ── 速度 ────────────────────────────────────────────────────── ground_speed: float = 0.0 # 地速(m/s) vx: float = 0.0 # 北向速度(m/s) vy: float = 0.0 # 东向速度(m/s) vz: float = 0.0 # 垂直速度(m/s,下为正) # ── 电源 ────────────────────────────────────────────────────── battery_voltage: float = 0.0 # 电池电压(V) battery_current: float = 0.0 # 电池电流(A) battery_percent: int = 100 # 电量百分比(%) battery_remaining_s: int = 0 # 剩余续航(秒) # ── 系统状态 ────────────────────────────────────────────────── armed: bool = False # 是否解锁 mode: str = "" # 当前飞行/运动模式 system_status: str = "STANDBY" error_flags: int = 0 # 错误标志位 # ── GPS ─────────────────────────────────────────────────────── gps_fix_type: int = 0 # 0=无,1=2D,2=3D,3=RTK satellites_visible: int = 0 # 可见卫星数 hdop: float = 99.9 # 水平精度因子 vdop: float = 99.9 # 垂直精度因子 # ── 扩展 ────────────────────────────────────────────────────── extra: Dict[str, Any] = field(default_factory=dict) # ── 序列化 ──────────────────────────────────────────────────── def to_dict(self) -> Dict[str, Any]: return dataclasses.asdict(self) @property def is_connected(self) -> bool: return self.connection_state == ConnectionState.CONNECTED.value @property def gps_ok(self) -> bool: return self.gps_fix_type >= 2 and self.satellites_visible >= 6 @property def position(self) -> tuple: return (self.latitude, self.longitude, self.altitude) def __repr__(self) -> str: return (f"{self.__class__.__name__}(" f"id={self.device_id}, " f"pos=({self.latitude:.4f},{self.longitude:.4f}," f"{self.altitude:.0f}m), " f"hdg={self.heading:.1f}°, " f"spd={self.ground_speed:.1f}m/s, " f"bat={self.battery_percent}%)") # ───────────────────────────────────────────────────────────────── # 无人机遥测 # ───────────────────────────────────────────────────────────────── @dataclass class UAVTelemetry(BaseTelemetry): """无人机专有遥测数据""" device_type: str = "controller" # ── 飞行状态 ────────────────────────────────────────────────── flight_mode: str = "STABILIZE" flight_phase: str = "GROUND" airspeed: float = 0.0 # 空速(m/s) vertical_speed: float = 0.0 # 垂直速度(m/s,上为正) climb_rate: float = 0.0 # 爬升率(m/s) # ── 飞控状态 ────────────────────────────────────────────────── throttle_pct: int = 0 # 油门百分比 autopilot_enabled: bool = False # 自动驾驶仪是否激活 mission_current: int = -1 # 当前任务点索引 mission_total: int = 0 # 任务点总数 # ── 发动机/电机 ─────────────────────────────────────────────── motor_count: int = 4 # 电机数量 motor_rpm: List[int] = field(default_factory=list) # ── 载荷 ────────────────────────────────────────────────────── gimbal_pitch: float = 0.0 # 云台俯仰(度) gimbal_yaw: float = 0.0 # 云台偏航(度) camera_recording: bool = False # 是否录像中 # ── 返航点 ──────────────────────────────────────────────────── home_lat: float = 0.0 home_lon: float = 0.0 home_alt: float = 0.0 distance_to_home: float = 0.0 # 距返航点距离(米) # ───────────────────────────────────────────────────────────────── # 机器狗遥测 # ───────────────────────────────────────────────────────────────── @dataclass class RobotDogTelemetry(BaseTelemetry): """机器狗专有遥测数据""" device_type: str = "robot_dog" # ── 运动状态 ────────────────────────────────────────────────── gait_mode: str = "STAND" # STAND/WALK/TROT/BOUND body_height: float = 0.5 # 机身高度(米) step_frequency: float = 0.0 # 步频(Hz) odometer_m: float = 0.0 # 里程计(米) # ── 关节状态 ────────────────────────────────────────────────── joint_positions: List[float] = field(default_factory=list) joint_velocities: List[float] = field(default_factory=list) joint_torques: List[float] = field(default_factory=list) # ── 足端状态 ────────────────────────────────────────────────── foot_contact: List[bool] = field(default_factory=list) foot_force: List[float] = field(default_factory=list) # ── IMU ─────────────────────────────────────────────────────── accel_x: float = 0.0 accel_y: float = 0.0 accel_z: float = 0.0 gyro_x: float = 0.0 gyro_y: float = 0.0 gyro_z: float = 0.0 # ── 环境感知 ────────────────────────────────────────────────── obstacle_detected: bool = False nearest_obstacle_m: float = 99.9 terrain_slope_deg: float = 0.0