1460 lines
48 KiB
Python
1460 lines
48 KiB
Python
from uas.action.action_type import ActionType
|
||
|
||
# ══════════════════════════════════════════════════════════════════
|
||
# ActionType 参数定义表
|
||
# 每个参数字段:
|
||
# type : Python 类型名称字符串
|
||
# description : 参数说明
|
||
# default : 默认值(None 表示必填,无默认值)
|
||
# required : 是否必填
|
||
# enum : 可选枚举值列表(可选字段)
|
||
# unit : 单位(可选字段)
|
||
# range : 取值范围 [min, max](可选字段)
|
||
# ══════════════════════════════════════════════════════════════════
|
||
|
||
ACTION_PARAMS: dict[ActionType, dict] = {
|
||
|
||
# ══════════════════════════════════════════
|
||
# 控制类
|
||
# ══════════════════════════════════════════
|
||
|
||
ActionType.PAUSE: {
|
||
"reason": {
|
||
"type": "str",
|
||
"description": "暂停原因描述,用于日志记录与态势上报",
|
||
"default": "manual_pause",
|
||
"required": False,
|
||
"enum": ["manual_pause", "low_battery", "signal_lost",
|
||
"obstacle_detected", "weather_warning", "await_authorization"],
|
||
},
|
||
"hold_position": {
|
||
"type": "bool",
|
||
"description": "暂停时是否原地悬停保持位置(True=悬停,False=保持当前运动状态)",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"max_hold_duration": {
|
||
"type": "float",
|
||
"description": "最大暂停等待时长,超时后自动执行超时策略",
|
||
"default": 300.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [1.0, 3600.0],
|
||
},
|
||
"timeout_action": {
|
||
"type": "str",
|
||
"description": "超过最大等待时长后的自动处置动作",
|
||
"default": "return_to_home",
|
||
"required": False,
|
||
"enum": ["return_to_home", "land", "abort", "resume"],
|
||
},
|
||
},
|
||
|
||
ActionType.RESUME: {
|
||
"resume_mode": {
|
||
"type": "str",
|
||
"description": "恢复执行模式",
|
||
"default": "continue_from_pause",
|
||
"required": False,
|
||
"enum": ["continue_from_pause", "restart_segment", "restart_mission"],
|
||
},
|
||
"speed_ramp_up_duration": {
|
||
"type": "float",
|
||
"description": "恢复后速度渐增时长,避免突变",
|
||
"default": 3.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [0.0, 30.0],
|
||
},
|
||
"verify_system_before_resume": {
|
||
"type": "bool",
|
||
"description": "恢复前是否执行快速系统验证",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.STOP: {
|
||
"stop_mode": {
|
||
"type": "str",
|
||
"description": "停止模式",
|
||
"default": "graceful",
|
||
"required": True,
|
||
"enum": ["graceful", "immediate", "safe_land"],
|
||
},
|
||
"save_mission_state": {
|
||
"type": "bool",
|
||
"description": "停止前是否保存当前任务状态,以便后续恢复",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"notify_ground_station": {
|
||
"type": "bool",
|
||
"description": "停止时是否向地面站发送通知",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"final_action": {
|
||
"type": "str",
|
||
"description": "任务停止后的最终动作",
|
||
"default": "hover",
|
||
"required": False,
|
||
"enum": ["hover", "land", "return_to_home", "none"],
|
||
},
|
||
},
|
||
|
||
ActionType.ABORT: {
|
||
"abort_reason": {
|
||
"type": "str",
|
||
"description": "中止原因",
|
||
"default": None,
|
||
"required": True,
|
||
"enum": ["system_failure", "threat_detected", "mission_compromised",
|
||
"operator_command", "fuel_critical", "communication_lost"],
|
||
},
|
||
"rollback_to_checkpoint": {
|
||
"type": "bool",
|
||
"description": "是否回滚到上一个安全检查点",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"checkpoint_id": {
|
||
"type": "str",
|
||
"description": "指定回滚的检查点ID,为空则回滚到最近检查点",
|
||
"default": None,
|
||
"required": False,
|
||
},
|
||
"emergency_return": {
|
||
"type": "bool",
|
||
"description": "是否立即执行紧急返航",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"broadcast_abort_signal": {
|
||
"type": "bool",
|
||
"description": "是否向编队内其他平台广播中止信号",
|
||
"default": False,
|
||
"required": False,
|
||
},
|
||
"data_purge": {
|
||
"type": "bool",
|
||
"description": "中止时是否清除敏感任务数据(防止被截获)",
|
||
"default": False,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.RESET: {
|
||
"reset_scope": {
|
||
"type": "str",
|
||
"description": "重置范围",
|
||
"default": "mission",
|
||
"required": True,
|
||
"enum": ["mission", "navigation", "sensors", "communication", "full_system"],
|
||
},
|
||
"preserve_logs": {
|
||
"type": "bool",
|
||
"description": "重置时是否保留日志数据",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"reinitialize_sensors": {
|
||
"type": "bool",
|
||
"description": "重置时是否重新初始化传感器",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"reset_waypoint_index": {
|
||
"type": "int",
|
||
"description": "重置后从第几个航点开始执行,-1 表示从头开始",
|
||
"default": -1,
|
||
"required": False,
|
||
"range": [-1, 9999],
|
||
},
|
||
},
|
||
|
||
ActionType.STANDBY: {
|
||
"standby_duration": {
|
||
"type": "float",
|
||
"description": "待机时长,0 表示无限期待机直到收到恢复指令",
|
||
"default": 0.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [0.0, 86400.0],
|
||
},
|
||
"power_mode": {
|
||
"type": "str",
|
||
"description": "待机功耗模式",
|
||
"default": "low_power",
|
||
"required": False,
|
||
"enum": ["low_power", "normal", "keep_sensors_active"],
|
||
},
|
||
"keep_comms_active": {
|
||
"type": "bool",
|
||
"description": "待机期间是否保持通信链路在线",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"wakeup_trigger": {
|
||
"type": "str",
|
||
"description": "唤醒触发条件",
|
||
"default": "command",
|
||
"required": False,
|
||
"enum": ["command", "timer", "event", "threat_detected"],
|
||
},
|
||
"maintain_altitude": {
|
||
"type": "bool",
|
||
"description": "待机期间是否保持当前高度悬停",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
|
||
# ══════════════════════════════════════════
|
||
# 感知类
|
||
# ══════════════════════════════════════════
|
||
|
||
ActionType.CAPTURE_PHOTO: {
|
||
"camera_id": {
|
||
"type": "str",
|
||
"description": "摄像机设备ID",
|
||
"default": "cam_main",
|
||
"required": True,
|
||
"enum": ["cam_main", "cam_ir", "cam_wide", "cam_zoom", "cam_belly"],
|
||
},
|
||
"resolution": {
|
||
"type": "str",
|
||
"description": "拍摄分辨率",
|
||
"default": "4K",
|
||
"required": False,
|
||
"enum": ["720P", "1080P", "2K", "4K", "8K", "max"],
|
||
},
|
||
"count": {
|
||
"type": "int",
|
||
"description": "连拍张数",
|
||
"default": 1,
|
||
"required": False,
|
||
"range": [1, 100],
|
||
},
|
||
"interval": {
|
||
"type": "float",
|
||
"description": "连拍间隔时长",
|
||
"default": 1.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [0.1, 60.0],
|
||
},
|
||
"image_format": {
|
||
"type": "str",
|
||
"description": "图像存储格式",
|
||
"default": "jpeg",
|
||
"required": False,
|
||
"enum": ["jpeg", "png", "raw", "tiff"],
|
||
},
|
||
"zoom_level": {
|
||
"type": "float",
|
||
"description": "光学变焦倍数",
|
||
"default": 1.0,
|
||
"required": False,
|
||
"range": [1.0, 30.0],
|
||
},
|
||
"gimbal_pitch": {
|
||
"type": "float",
|
||
"description": "云台俯仰角,负值为向下",
|
||
"default": -90.0,
|
||
"required": False,
|
||
"unit": "度",
|
||
"range": [-90.0, 30.0],
|
||
},
|
||
"gimbal_yaw": {
|
||
"type": "float",
|
||
"description": "云台偏航角(相对机头方向)",
|
||
"default": 0.0,
|
||
"required": False,
|
||
"unit": "度",
|
||
"range": [-180.0, 180.0],
|
||
},
|
||
"auto_exposure": {
|
||
"type": "bool",
|
||
"description": "是否启用自动曝光",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"geotagging": {
|
||
"type": "bool",
|
||
"description": "是否在图像中嵌入 GPS 地理坐标信息",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"storage_path": {
|
||
"type": "str",
|
||
"description": "图像存储路径",
|
||
"default": "/data/photos/",
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.CAPTURE_VIDEO: {
|
||
"camera_id": {
|
||
"type": "str",
|
||
"description": "摄像机设备ID",
|
||
"default": "cam_main",
|
||
"required": True,
|
||
"enum": ["cam_main", "cam_ir", "cam_wide", "cam_zoom", "cam_belly"],
|
||
},
|
||
"duration": {
|
||
"type": "float",
|
||
"description": "录制时长,0 表示持续录制直到收到停止指令",
|
||
"default": 0.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [0.0, 86400.0],
|
||
},
|
||
"resolution": {
|
||
"type": "str",
|
||
"description": "视频分辨率",
|
||
"default": "1080P",
|
||
"required": False,
|
||
"enum": ["720P", "1080P", "2K", "4K"],
|
||
},
|
||
"fps": {
|
||
"type": "int",
|
||
"description": "帧率",
|
||
"default": 30,
|
||
"required": False,
|
||
"unit": "fps",
|
||
"enum": [24, 30, 60, 120],
|
||
},
|
||
"video_format": {
|
||
"type": "str",
|
||
"description": "视频编码格式",
|
||
"default": "h264",
|
||
"required": False,
|
||
"enum": ["h264", "h265", "mjpeg"],
|
||
},
|
||
"gimbal_pitch": {
|
||
"type": "float",
|
||
"description": "云台俯仰角",
|
||
"default": -45.0,
|
||
"required": False,
|
||
"unit": "度",
|
||
"range": [-90.0, 30.0],
|
||
},
|
||
"stabilization": {
|
||
"type": "bool",
|
||
"description": "是否启用电子防抖",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"stream_live": {
|
||
"type": "bool",
|
||
"description": "是否同步推送实时视频流至地面站",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"stream_url": {
|
||
"type": "str",
|
||
"description": "实时流推送地址(RTSP/RTMP)",
|
||
"default": None,
|
||
"required": False,
|
||
},
|
||
"storage_path": {
|
||
"type": "str",
|
||
"description": "视频本地存储路径",
|
||
"default": "/data/videos/",
|
||
"required": False,
|
||
},
|
||
"max_file_size_mb": {
|
||
"type": "int",
|
||
"description": "单个视频文件最大体积,超出后自动分段",
|
||
"default": 4096,
|
||
"required": False,
|
||
"unit": "MB",
|
||
"range": [64, 65536],
|
||
},
|
||
},
|
||
|
||
ActionType.RECOGNIZE_TARGET: {
|
||
"target_type": {
|
||
"type": "str",
|
||
"description": "目标类别",
|
||
"default": "any",
|
||
"required": True,
|
||
"enum": ["person", "vehicle", "aircraft", "vessel", "weapon",
|
||
"building", "radar", "uav", "any"],
|
||
},
|
||
"sensor_id": {
|
||
"type": "str",
|
||
"description": "用于识别的传感器ID",
|
||
"default": "cam_main",
|
||
"required": False,
|
||
"enum": ["cam_main", "cam_ir", "cam_wide", "cam_zoom", "sar", "lidar"],
|
||
},
|
||
"confidence_threshold": {
|
||
"type": "float",
|
||
"description": "目标识别置信度阈值,低于该值不上报",
|
||
"default": 0.85,
|
||
"required": False,
|
||
"range": [0.0, 1.0],
|
||
},
|
||
"max_targets": {
|
||
"type": "int",
|
||
"description": "单次识别最大目标数量",
|
||
"default": 10,
|
||
"required": False,
|
||
"range": [1, 100],
|
||
},
|
||
"report_mode": {
|
||
"type": "str",
|
||
"description": "识别结果上报模式",
|
||
"default": "realtime",
|
||
"required": False,
|
||
"enum": ["realtime", "on_detect", "batch", "silent"],
|
||
},
|
||
"use_ai_model": {
|
||
"type": "str",
|
||
"description": "使用的 AI 识别模型名称",
|
||
"default": "yolo_v8_military",
|
||
"required": False,
|
||
},
|
||
"roi": {
|
||
"type": "dict",
|
||
"description": "感兴趣区域(图像坐标归一化),格式 {x, y, w, h}",
|
||
"default": None,
|
||
"required": False,
|
||
},
|
||
"enable_classification": {
|
||
"type": "bool",
|
||
"description": "是否对识别目标进行细粒度分类(如车辆型号)",
|
||
"default": False,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.SCAN_ENVIRONMENT: {
|
||
"scan_mode": {
|
||
"type": "str",
|
||
"description": "扫描模式",
|
||
"default": "360_horizontal",
|
||
"required": True,
|
||
"enum": ["360_horizontal", "360_full", "sector", "forward", "downward"],
|
||
},
|
||
"sensor_types": {
|
||
"type": "list",
|
||
"description": "参与扫描的传感器列表",
|
||
"default": ["cam_main", "cam_ir"],
|
||
"required": False,
|
||
"enum": ["cam_main", "cam_ir", "lidar", "radar", "sar",
|
||
"multispectral", "hyperspectral"],
|
||
},
|
||
"scan_range": {
|
||
"type": "float",
|
||
"description": "扫描有效距离",
|
||
"default": 1000.0,
|
||
"required": False,
|
||
"unit": "米",
|
||
"range": [10.0, 50000.0],
|
||
},
|
||
"sector_start_angle": {
|
||
"type": "float",
|
||
"description": "扇形扫描起始角度(scan_mode=sector 时有效)",
|
||
"default": -60.0,
|
||
"required": False,
|
||
"unit": "度",
|
||
"range": [-180.0, 180.0],
|
||
},
|
||
"sector_end_angle": {
|
||
"type": "float",
|
||
"description": "扇形扫描终止角度(scan_mode=sector 时有效)",
|
||
"default": 60.0,
|
||
"required": False,
|
||
"unit": "度",
|
||
"range": [-180.0, 180.0],
|
||
},
|
||
"scan_duration": {
|
||
"type": "float",
|
||
"description": "单次扫描持续时长,0 表示持续扫描",
|
||
"default": 0.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [0.0, 3600.0],
|
||
},
|
||
"resolution": {
|
||
"type": "str",
|
||
"description": "扫描分辨率等级",
|
||
"default": "medium",
|
||
"required": False,
|
||
"enum": ["low", "medium", "high", "ultra"],
|
||
},
|
||
"report_interval": {
|
||
"type": "float",
|
||
"description": "扫描结果上报间隔",
|
||
"default": 5.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [0.5, 60.0],
|
||
},
|
||
"anomaly_alert": {
|
||
"type": "bool",
|
||
"description": "发现异常目标时是否自动告警",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.DETECT_OBSTACLE: {
|
||
"detection_range": {
|
||
"type": "float",
|
||
"description": "障碍物探测距离",
|
||
"default": 30.0,
|
||
"required": False,
|
||
"unit": "米",
|
||
"range": [1.0, 500.0],
|
||
},
|
||
"sensor_id": {
|
||
"type": "str",
|
||
"description": "障碍物探测传感器",
|
||
"default": "lidar",
|
||
"required": False,
|
||
"enum": ["lidar", "radar", "ultrasonic", "stereo_cam", "tof", "fusion"],
|
||
},
|
||
"sensitivity": {
|
||
"type": "str",
|
||
"description": "探测灵敏度等级",
|
||
"default": "medium",
|
||
"required": False,
|
||
"enum": ["low", "medium", "high"],
|
||
},
|
||
"avoidance_action": {
|
||
"type": "str",
|
||
"description": "检测到障碍物后的自动规避动作",
|
||
"default": "stop_and_hover",
|
||
"required": False,
|
||
"enum": ["stop_and_hover", "reroute", "ascend", "alert_only", "none"],
|
||
},
|
||
"min_safe_distance": {
|
||
"type": "float",
|
||
"description": "触发规避的最小安全距离",
|
||
"default": 5.0,
|
||
"required": False,
|
||
"unit": "米",
|
||
"range": [0.5, 100.0],
|
||
},
|
||
"detection_directions": {
|
||
"type": "list",
|
||
"description": "探测方向列表",
|
||
"default": ["forward", "downward"],
|
||
"required": False,
|
||
"enum": ["forward", "backward", "left", "right",
|
||
"upward", "downward", "all"],
|
||
},
|
||
"continuous": {
|
||
"type": "bool",
|
||
"description": "是否持续探测(True=持续,False=单次)",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"report_to_gcs": {
|
||
"type": "bool",
|
||
"description": "是否将障碍物信息上报地面站",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.TRACK_TARGET: {
|
||
"target_id": {
|
||
"type": "str",
|
||
"description": "被跟踪目标的唯一标识符",
|
||
"default": None,
|
||
"required": True,
|
||
},
|
||
"tracking_mode": {
|
||
"type": "str",
|
||
"description": "跟踪模式",
|
||
"default": "visual_lock",
|
||
"required": True,
|
||
"enum": ["visual_lock", "ir_lock", "radar_lock",
|
||
"gps_follow", "multi_sensor_fusion"],
|
||
},
|
||
"sensor_id": {
|
||
"type": "str",
|
||
"description": "主跟踪传感器",
|
||
"default": "cam_main",
|
||
"required": False,
|
||
"enum": ["cam_main", "cam_ir", "cam_zoom", "radar", "lidar"],
|
||
},
|
||
"follow_distance": {
|
||
"type": "float",
|
||
"description": "跟踪保持距离",
|
||
"default": 100.0,
|
||
"required": False,
|
||
"unit": "米",
|
||
"range": [5.0, 5000.0],
|
||
},
|
||
"follow_altitude_offset": {
|
||
"type": "float",
|
||
"description": "相对目标的高度偏移量",
|
||
"default": 50.0,
|
||
"required": False,
|
||
"unit": "米",
|
||
"range": [-100.0, 500.0],
|
||
},
|
||
"max_tracking_duration": {
|
||
"type": "float",
|
||
"description": "最大跟踪时长,0 表示持续跟踪",
|
||
"default": 0.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [0.0, 86400.0],
|
||
},
|
||
"lost_target_action": {
|
||
"type": "str",
|
||
"description": "目标丢失后的处置动作",
|
||
"default": "hover_and_search",
|
||
"required": False,
|
||
"enum": ["hover_and_search", "return_to_last_position",
|
||
"abort_tracking", "alert_operator"],
|
||
},
|
||
"record_during_tracking": {
|
||
"type": "bool",
|
||
"description": "跟踪期间是否同步录像",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"gimbal_lock": {
|
||
"type": "bool",
|
||
"description": "是否锁定云台始终对准目标",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
|
||
# ══════════════════════════════════════════
|
||
# 系统类
|
||
# ══════════════════════════════════════════
|
||
|
||
ActionType.SYSTEM_RESTART: {
|
||
"subsystem_id": {
|
||
"type": "str",
|
||
"description": "重启的子系统标识,all 表示整机重启",
|
||
"default": "all",
|
||
"required": True,
|
||
"enum": ["all", "flight_controller", "payload", "navigation",
|
||
"communication", "ai_processor", "gimbal"],
|
||
},
|
||
"reboot_delay": {
|
||
"type": "float",
|
||
"description": "执行重启前的等待时延",
|
||
"default": 5.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [0.0, 60.0],
|
||
},
|
||
"safe_land_before_restart": {
|
||
"type": "bool",
|
||
"description": "整机重启前是否先执行安全降落",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"notify_before_restart": {
|
||
"type": "bool",
|
||
"description": "重启前是否向地面站发送通知",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"auto_resume_after_restart": {
|
||
"type": "bool",
|
||
"description": "重启完成后是否自动恢复任务",
|
||
"default": False,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.SYSTEM_SHUTDOWN: {
|
||
"shutdown_mode": {
|
||
"type": "str",
|
||
"description": "关机模式",
|
||
"default": "graceful",
|
||
"required": True,
|
||
"enum": ["graceful", "immediate", "safe_land_then_shutdown"],
|
||
},
|
||
"shutdown_delay": {
|
||
"type": "float",
|
||
"description": "执行关机前的等待时延",
|
||
"default": 10.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [0.0, 120.0],
|
||
},
|
||
"save_state_before_shutdown": {
|
||
"type": "bool",
|
||
"description": "关机前是否保存系统状态快照",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"upload_logs_before_shutdown": {
|
||
"type": "bool",
|
||
"description": "关机前是否上传飞行日志至地面站",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.SYSTEM_DIAGNOSE: {
|
||
"diagnosis_scope": {
|
||
"type": "list",
|
||
"description": "诊断范围列表",
|
||
"default": ["all"],
|
||
"required": False,
|
||
"enum": ["all", "flight_controller", "sensors", "battery",
|
||
"communication", "navigation", "payload", "motors"],
|
||
},
|
||
"report_level": {
|
||
"type": "str",
|
||
"description": "诊断报告详细程度",
|
||
"default": "standard",
|
||
"required": False,
|
||
"enum": ["minimal", "standard", "verbose"],
|
||
},
|
||
"auto_fix": {
|
||
"type": "bool",
|
||
"description": "发现可修复问题时是否自动修复",
|
||
"default": False,
|
||
"required": False,
|
||
},
|
||
"report_destination": {
|
||
"type": "str",
|
||
"description": "诊断报告发送目标",
|
||
"default": "ground_station",
|
||
"required": False,
|
||
"enum": ["ground_station", "local_log", "both"],
|
||
},
|
||
"timeout": {
|
||
"type": "float",
|
||
"description": "诊断超时时间",
|
||
"default": 30.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [5.0, 300.0],
|
||
},
|
||
"abort_mission_on_critical": {
|
||
"type": "bool",
|
||
"description": "发现严重故障时是否自动中止任务",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.SYSTEM_CALIBRATE: {
|
||
"device_id": {
|
||
"type": "str",
|
||
"description": "待校准设备标识",
|
||
"default": None,
|
||
"required": True,
|
||
"enum": ["imu", "compass", "barometer", "camera_gimbal",
|
||
"lidar", "radar", "ir_sensor", "gps", "all_sensors"],
|
||
},
|
||
"calibration_type": {
|
||
"type": "str",
|
||
"description": "校准类型",
|
||
"default": "standard",
|
||
"required": False,
|
||
"enum": ["standard", "quick", "factory_reset", "field_calibration"],
|
||
},
|
||
"require_stationary": {
|
||
"type": "bool",
|
||
"description": "校准期间是否要求平台静止",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"calibration_environment": {
|
||
"type": "str",
|
||
"description": "校准环境条件",
|
||
"default": "auto_detect",
|
||
"required": False,
|
||
"enum": ["auto_detect", "indoor", "outdoor", "magnetic_clean"],
|
||
},
|
||
"timeout": {
|
||
"type": "float",
|
||
"description": "校准超时时间",
|
||
"default": 60.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [10.0, 600.0],
|
||
},
|
||
"abort_on_failure": {
|
||
"type": "bool",
|
||
"description": "校准失败时是否中止任务",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.SYSTEM_UPDATE_CONFIG: {
|
||
"config_key": {
|
||
"type": "str",
|
||
"description": "配置项键名(支持点分路径,如 flight.max_speed)",
|
||
"default": None,
|
||
"required": True,
|
||
},
|
||
"config_value": {
|
||
"type": "any",
|
||
"description": "配置项新值",
|
||
"default": None,
|
||
"required": True,
|
||
},
|
||
"config_scope": {
|
||
"type": "str",
|
||
"description": "配置作用范围",
|
||
"default": "mission",
|
||
"required": False,
|
||
"enum": ["mission", "session", "persistent"],
|
||
},
|
||
"validate_before_apply": {
|
||
"type": "bool",
|
||
"description": "应用前是否校验配置合法性",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"rollback_on_error": {
|
||
"type": "bool",
|
||
"description": "配置应用失败时是否自动回滚",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"notify_ground_station": {
|
||
"type": "bool",
|
||
"description": "配置变更后是否通知地面站",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.SYSTEM_SELF_CHECK: {
|
||
"check_scope": {
|
||
"type": "list",
|
||
"description": "自检范围",
|
||
"default": ["critical"],
|
||
"required": False,
|
||
"enum": ["critical", "sensors", "actuators", "communication",
|
||
"navigation", "payload", "battery", "all"],
|
||
},
|
||
"check_level": {
|
||
"type": "str",
|
||
"description": "自检深度等级",
|
||
"default": "standard",
|
||
"required": False,
|
||
"enum": ["quick", "standard", "deep"],
|
||
},
|
||
"block_mission_on_failure": {
|
||
"type": "bool",
|
||
"description": "自检未通过时是否阻止任务继续执行",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"timeout": {
|
||
"type": "float",
|
||
"description": "自检超时时间",
|
||
"default": 20.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [5.0, 120.0],
|
||
},
|
||
"report_destination": {
|
||
"type": "str",
|
||
"description": "自检结果发送目标",
|
||
"default": "ground_station",
|
||
"required": False,
|
||
"enum": ["ground_station", "local_log", "both"],
|
||
},
|
||
},
|
||
|
||
|
||
# ══════════════════════════════════════════
|
||
# 网络类
|
||
# ══════════════════════════════════════════
|
||
|
||
ActionType.NETWORK_CONNECT: {
|
||
"target_node_id": {
|
||
"type": "str",
|
||
"description": "目标节点标识(地面站/中继/云端)",
|
||
"default": "ground_station_primary",
|
||
"required": True,
|
||
},
|
||
"protocol": {
|
||
"type": "str",
|
||
"description": "通信协议",
|
||
"default": "mavlink",
|
||
"required": False,
|
||
"enum": ["mavlink", "rtsp", "mqtt", "websocket", "custom_military"],
|
||
},
|
||
"frequency_mhz": {
|
||
"type": "float",
|
||
"description": "通信频率",
|
||
"default": 900.0,
|
||
"required": False,
|
||
"unit": "MHz",
|
||
"range": [100.0, 6000.0],
|
||
},
|
||
"encryption": {
|
||
"type": "str",
|
||
"description": "加密方式",
|
||
"default": "aes256",
|
||
"required": False,
|
||
"enum": ["none", "aes128", "aes256", "military_grade"],
|
||
},
|
||
"timeout": {
|
||
"type": "float",
|
||
"description": "连接超时时间",
|
||
"default": 10.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [1.0, 60.0],
|
||
},
|
||
"retry_count": {
|
||
"type": "int",
|
||
"description": "连接失败后重试次数",
|
||
"default": 3,
|
||
"required": False,
|
||
"range": [0, 10],
|
||
},
|
||
"fallback_node_id": {
|
||
"type": "str",
|
||
"description": "主节点连接失败时的备用节点ID",
|
||
"default": None,
|
||
"required": False,
|
||
},
|
||
"bandwidth_limit_kbps": {
|
||
"type": "int",
|
||
"description": "带宽限制,0 表示不限制",
|
||
"default": 0,
|
||
"required": False,
|
||
"unit": "Kbps",
|
||
"range": [0, 1000000],
|
||
},
|
||
},
|
||
|
||
ActionType.NETWORK_DISCONNECT: {
|
||
"connection_id": {
|
||
"type": "str",
|
||
"description": "要断开的连接标识符,all 表示断开所有连接",
|
||
"default": "all",
|
||
"required": True,
|
||
},
|
||
"graceful": {
|
||
"type": "bool",
|
||
"description": "是否优雅断开(等待数据传输完成后再断开)",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"send_disconnect_notice": {
|
||
"type": "bool",
|
||
"description": "断开前是否向对端发送断开通知",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"flush_buffer_before_disconnect": {
|
||
"type": "bool",
|
||
"description": "断开前是否清空发送缓冲区",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.NETWORK_SEND_DATA: {
|
||
"target_node_id": {
|
||
"type": "str",
|
||
"description": "数据接收节点标识",
|
||
"default": "ground_station_primary",
|
||
"required": True,
|
||
},
|
||
"data_type": {
|
||
"type": "str",
|
||
"description": "发送数据类型",
|
||
"default": "telemetry",
|
||
"required": True,
|
||
"enum": ["telemetry", "image", "video_stream", "log",
|
||
"sensor_data", "mission_report", "alert", "custom"],
|
||
},
|
||
"data_payload": {
|
||
"type": "dict",
|
||
"description": "数据内容(data_type=custom 时使用)",
|
||
"default": None,
|
||
"required": False,
|
||
},
|
||
"priority": {
|
||
"type": "str",
|
||
"description": "数据传输优先级",
|
||
"default": "normal",
|
||
"required": False,
|
||
"enum": ["low", "normal", "high", "critical"],
|
||
},
|
||
"compression": {
|
||
"type": "str",
|
||
"description": "数据压缩方式",
|
||
"default": "auto",
|
||
"required": False,
|
||
"enum": ["none", "gzip", "lz4", "auto"],
|
||
},
|
||
"confirm_receipt": {
|
||
"type": "bool",
|
||
"description": "是否要求接收方确认收到",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"retry_on_failure": {
|
||
"type": "bool",
|
||
"description": "发送失败时是否自动重试",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"max_retries": {
|
||
"type": "int",
|
||
"description": "最大重试次数",
|
||
"default": 3,
|
||
"required": False,
|
||
"range": [0, 10],
|
||
},
|
||
"encrypt_payload": {
|
||
"type": "bool",
|
||
"description": "是否对数据内容加密",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.NETWORK_SYNC: {
|
||
"sync_scope": {
|
||
"type": "list",
|
||
"description": "同步数据范围",
|
||
"default": ["mission_data"],
|
||
"required": True,
|
||
"enum": ["mission_data", "flight_logs", "sensor_data",
|
||
"images", "videos", "config", "all"],
|
||
},
|
||
"sync_mode": {
|
||
"type": "str",
|
||
"description": "同步模式",
|
||
"default": "incremental",
|
||
"required": False,
|
||
"enum": ["incremental", "full", "delta"],
|
||
},
|
||
"target_node_id": {
|
||
"type": "str",
|
||
"description": "同步目标节点",
|
||
"default": "ground_station_primary",
|
||
"required": False,
|
||
},
|
||
"bandwidth_limit_kbps": {
|
||
"type": "int",
|
||
"description": "同步带宽限制,0 表示不限制",
|
||
"default": 0,
|
||
"required": False,
|
||
"unit": "Kbps",
|
||
"range": [0, 1000000],
|
||
},
|
||
"timeout": {
|
||
"type": "float",
|
||
"description": "同步超时时间",
|
||
"default": 120.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [10.0, 3600.0],
|
||
},
|
||
"verify_integrity": {
|
||
"type": "bool",
|
||
"description": "同步完成后是否校验数据完整性",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"delete_after_sync": {
|
||
"type": "bool",
|
||
"description": "同步成功后是否删除本地副本(释放存储)",
|
||
"default": False,
|
||
"required": False,
|
||
},
|
||
"compress_before_sync": {
|
||
"type": "bool",
|
||
"description": "同步前是否压缩数据",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
|
||
# ══════════════════════════════════════════
|
||
# 运动类
|
||
# ══════════════════════════════════════════
|
||
|
||
ActionType.MOTION_MOVE: {
|
||
"target_position": {
|
||
"type": "dict",
|
||
"description": "目标位置坐标,格式 {lat, lon, alt}(WGS-84)",
|
||
"default": None,
|
||
"required": True,
|
||
},
|
||
"speed": {
|
||
"type": "float",
|
||
"description": "移动速度",
|
||
"default": 10.0,
|
||
"required": False,
|
||
"unit": "m/s",
|
||
"range": [0.1, 100.0],
|
||
},
|
||
"altitude_mode": {
|
||
"type": "str",
|
||
"description": "高度模式",
|
||
"default": "absolute",
|
||
"required": False,
|
||
"enum": ["absolute", "relative_to_ground", "terrain_following"],
|
||
},
|
||
"heading_mode": {
|
||
"type": "str",
|
||
"description": "飞行朝向控制模式",
|
||
"default": "auto",
|
||
"required": False,
|
||
"enum": ["auto", "fixed", "toward_target", "free"],
|
||
},
|
||
"fixed_heading": {
|
||
"type": "float",
|
||
"description": "固定航向角(heading_mode=fixed 时有效)",
|
||
"default": 0.0,
|
||
"required": False,
|
||
"unit": "度",
|
||
"range": [0.0, 360.0],
|
||
},
|
||
"acceptance_radius": {
|
||
"type": "float",
|
||
"description": "到达判定半径,进入该范围视为到达目标",
|
||
"default": 2.0,
|
||
"required": False,
|
||
"unit": "米",
|
||
"range": [0.1, 100.0],
|
||
},
|
||
"avoid_obstacles": {
|
||
"type": "bool",
|
||
"description": "移动过程中是否启用障碍物规避",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"path_type": {
|
||
"type": "str",
|
||
"description": "路径规划类型",
|
||
"default": "straight_line",
|
||
"required": False,
|
||
"enum": ["straight_line", "optimal", "terrain_hugging", "stealth"],
|
||
},
|
||
"max_acceleration": {
|
||
"type": "float",
|
||
"description": "最大加速度",
|
||
"default": 3.0,
|
||
"required": False,
|
||
"unit": "m/s²",
|
||
"range": [0.1, 20.0],
|
||
},
|
||
},
|
||
|
||
ActionType.MOTION_ROTATE: {
|
||
"target_yaw": {
|
||
"type": "float",
|
||
"description": "目标偏航角(相对北方,顺时针为正)",
|
||
"default": None,
|
||
"required": True,
|
||
"unit": "度",
|
||
"range": [0.0, 360.0],
|
||
},
|
||
"rotation_speed": {
|
||
"type": "float",
|
||
"description": "旋转角速度",
|
||
"default": 30.0,
|
||
"required": False,
|
||
"unit": "度/秒",
|
||
"range": [1.0, 360.0],
|
||
},
|
||
"rotation_direction": {
|
||
"type": "str",
|
||
"description": "旋转方向",
|
||
"default": "auto",
|
||
"required": False,
|
||
"enum": ["clockwise", "counter_clockwise", "auto"],
|
||
},
|
||
"relative_rotation": {
|
||
"type": "bool",
|
||
"description": "是否为相对旋转(True=相对当前朝向,False=绝对角度)",
|
||
"default": False,
|
||
"required": False,
|
||
},
|
||
"maintain_position": {
|
||
"type": "bool",
|
||
"description": "旋转过程中是否保持当前位置不变",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"gimbal_follow": {
|
||
"type": "bool",
|
||
"description": "旋转时云台是否跟随机体朝向",
|
||
"default": False,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.MOTION_HOVER: {
|
||
"duration": {
|
||
"type": "float",
|
||
"description": "悬停时长,0 表示持续悬停直到收到下一指令",
|
||
"default": 0.0,
|
||
"required": False,
|
||
"unit": "秒",
|
||
"range": [0.0, 86400.0],
|
||
},
|
||
"position_hold_accuracy": {
|
||
"type": "float",
|
||
"description": "位置保持精度(允许的最大漂移半径)",
|
||
"default": 1.0,
|
||
"required": False,
|
||
"unit": "米",
|
||
"range": [0.1, 20.0],
|
||
},
|
||
"altitude_hold_accuracy": {
|
||
"type": "float",
|
||
"description": "高度保持精度",
|
||
"default": 0.5,
|
||
"required": False,
|
||
"unit": "米",
|
||
"range": [0.1, 10.0],
|
||
},
|
||
"heading_lock": {
|
||
"type": "bool",
|
||
"description": "悬停时是否锁定朝向",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"locked_heading": {
|
||
"type": "float",
|
||
"description": "锁定的朝向角(heading_lock=True 时有效,None=保持当前朝向)",
|
||
"default": None,
|
||
"required": False,
|
||
"unit": "度",
|
||
"range": [0.0, 360.0],
|
||
},
|
||
"wind_compensation": {
|
||
"type": "bool",
|
||
"description": "是否启用风力补偿以维持位置",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"auto_exit_on_battery": {
|
||
"type": "float",
|
||
"description": "电量低于该阈值时自动退出悬停并返航",
|
||
"default": 0.2,
|
||
"required": False,
|
||
"range": [0.05, 0.5],
|
||
},
|
||
},
|
||
|
||
ActionType.MOTION_LAND: {
|
||
"landing_point": {
|
||
"type": "dict",
|
||
"description": "降落目标坐标 {lat, lon},None 表示原地降落",
|
||
"default": None,
|
||
"required": False,
|
||
},
|
||
"descent_speed": {
|
||
"type": "float",
|
||
"description": "下降速度",
|
||
"default": 1.5,
|
||
"required": False,
|
||
"unit": "m/s",
|
||
"range": [0.1, 5.0],
|
||
},
|
||
"final_approach_speed": {
|
||
"type": "float",
|
||
"description": "最终进近阶段(距地 2 米内)速度",
|
||
"default": 0.5,
|
||
"required": False,
|
||
"unit": "m/s",
|
||
"range": [0.1, 2.0],
|
||
},
|
||
"landing_mode": {
|
||
"type": "str",
|
||
"description": "降落模式",
|
||
"default": "precision",
|
||
"required": False,
|
||
"enum": ["precision", "normal", "emergency", "auto_detect_surface"],
|
||
},
|
||
"verify_landing_zone": {
|
||
"type": "bool",
|
||
"description": "降落前是否扫描确认降落区安全",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"disarm_after_landing": {
|
||
"type": "bool",
|
||
"description": "降落完成后是否自动解除电机锁定",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"abort_altitude": {
|
||
"type": "float",
|
||
"description": "若降落区异常,在此高度以上可中止降落并复飞",
|
||
"default": 5.0,
|
||
"required": False,
|
||
"unit": "米",
|
||
"range": [1.0, 30.0],
|
||
},
|
||
"notify_on_land": {
|
||
"type": "bool",
|
||
"description": "降落完成后是否通知地面站",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
|
||
ActionType.MOTION_TAKEOFF: {
|
||
"target_altitude": {
|
||
"type": "float",
|
||
"description": "起飞目标高度(相对起飞点)",
|
||
"default": 50.0,
|
||
"required": True,
|
||
"unit": "米",
|
||
"range": [1.0, 5000.0],
|
||
},
|
||
"ascent_speed": {
|
||
"type": "float",
|
||
"description": "爬升速度",
|
||
"default": 3.0,
|
||
"required": False,
|
||
"unit": "m/s",
|
||
"range": [0.5, 10.0],
|
||
},
|
||
"heading_after_takeoff": {
|
||
"type": "float",
|
||
"description": "起飞后的初始朝向角,None 表示保持当前朝向",
|
||
"default": None,
|
||
"required": False,
|
||
"unit": "度",
|
||
"range": [0.0, 360.0],
|
||
},
|
||
"pre_takeoff_check": {
|
||
"type": "bool",
|
||
"description": "起飞前是否执行自检",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"arm_motors": {
|
||
"type": "bool",
|
||
"description": "起飞前是否自动解锁电机",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"takeoff_mode": {
|
||
"type": "str",
|
||
"description": "起飞模式",
|
||
"default": "normal",
|
||
"required": False,
|
||
"enum": ["normal", "vertical_only", "rolling", "catapult"],
|
||
},
|
||
"hover_after_takeoff": {
|
||
"type": "bool",
|
||
"description": "到达目标高度后是否先悬停等待下一指令",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
"notify_on_airborne": {
|
||
"type": "bool",
|
||
"description": "离地后是否立即通知地面站",
|
||
"default": True,
|
||
"required": False,
|
||
},
|
||
},
|
||
}
|
||
|
||
|
||
# ══════════════════════════════════════════════
|
||
# 工具函数
|
||
# ══════════════════════════════════════════════
|
||
|
||
def get_action_params(action_type) -> dict:
|
||
"""获取指定 ActionType 的参数定义"""
|
||
return ACTION_PARAMS.get(action_type if isinstance(action_type, ActionType) else ActionType(action_type), {})
|
||
|
||
|
||
def get_required_params(action_type: ActionType) -> dict:
|
||
"""获取指定 ActionType 的必填参数"""
|
||
return {
|
||
k: v for k, v in ACTION_PARAMS.get(action_type, {}).items()
|
||
if v.get("required", False)
|
||
}
|
||
|
||
|
||
def get_default_params(action_type: ActionType) -> dict:
|
||
"""获取指定 ActionType 的默认参数值字典"""
|
||
return {
|
||
k: v["default"]
|
||
for k, v in ACTION_PARAMS.get(action_type, {}).items()
|
||
if v["default"] is not None
|
||
}
|
||
|
||
|
||
def validate_action_params(action_type: ActionType, params: dict) -> list[str]:
|
||
"""
|
||
校验传入参数是否满足 ActionType 的参数约束。
|
||
返回错误信息列表,空列表表示校验通过。
|
||
"""
|
||
errors = []
|
||
definition = ACTION_PARAMS.get(action_type, {})
|
||
|
||
# 检查必填参数
|
||
for key, meta in definition.items():
|
||
if meta.get("required") and params.get(key) is None:
|
||
errors.append(f"缺少必填参数: {key} ({meta['description']})")
|
||
|
||
# 检查枚举值
|
||
for key, value in params.items():
|
||
if key in definition:
|
||
meta = definition[key]
|
||
if "enum" in meta and value not in meta["enum"]:
|
||
errors.append(
|
||
f"参数 {key}={value!r} 不在允许值列表中: {meta['enum']}"
|
||
)
|
||
if "range" in meta and value is not None:
|
||
lo, hi = meta["range"]
|
||
if not (lo <= value <= hi):
|
||
errors.append(
|
||
f"参数 {key}={value} 超出范围 [{lo}, {hi}]"
|
||
)
|
||
return errors
|
||
|
||
|
||
# ══════════════════════════════════════════════
|
||
# 使用示例
|
||
# ══════════════════════════════════════════════
|
||
|
||
if __name__ == "__main__":
|
||
import json
|
||
|
||
# 打印所有 ActionType 参数定义
|
||
output = {
|
||
at.value: params
|
||
for at, params in ACTION_PARAMS.items()
|
||
}
|
||
print(json.dumps(output, ensure_ascii=False, indent=2))
|
||
|
||
# 获取必填参数
|
||
print("\n--- TRACK_TARGET 必填参数 ---")
|
||
print(get_required_params(ActionType.TRACK_TARGET))
|
||
|
||
# 获取默认参数
|
||
print("\n--- MOTION_TAKEOFF 默认参数 ---")
|
||
print(get_default_params(ActionType.MOTION_TAKEOFF))
|
||
|
||
# 参数校验示例
|
||
print("\n--- 参数校验示例 ---")
|
||
errors = validate_action_params(
|
||
ActionType.MOTION_MOVE,
|
||
{"target_position": {"lat": 39.9, "lon": 116.4, "alt": 100}, "speed": 999}
|
||
)
|
||
print("校验错误:", errors) |