base_agent/uas/action/action_params.py

1460 lines
48 KiB
Python
Raw Normal View History

2026-06-18 03:28:14 +00:00
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)