base_agent/uas/action/action_params.py

1460 lines
48 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)