|
|
# ============================================================
|
|
|
# config_intercept.py
|
|
|
# Параметры для модулей перехвата.
|
|
|
# Импортируется в main.py ПОСЛЕ config.py
|
|
|
# ============================================================
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
# 1. RANGE ESTIMATION (range_estimation.py)
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
RANGE_ENABLE = True
|
|
|
|
|
|
# Калибровка камеры (нужно измерить для вашего объектива)
|
|
|
# focal_length_px = focal_length_mm * image_width_px / sensor_width_mm
|
|
|
# Для типичной FPV камеры 2.1mm, 1/3" сенсор (4.8mm), 720px ширина:
|
|
|
# focal_length_px ≈ 2.1 * 720 / 4.8 ≈ 315
|
|
|
CAMERA_FOCAL_LENGTH_PX = 315.0
|
|
|
|
|
|
# Известный размер цели (метры). Типичный FPV-дрон ~0.25-0.30м по диагонали
|
|
|
TARGET_KNOWN_SIZE_M = 0.27
|
|
|
|
|
|
# Минимальный размер bbox (пиксели) для оценки дальности
|
|
|
RANGE_MIN_APPARENT_SIZE_PX = 4.0
|
|
|
|
|
|
# Максимальная правдоподобная дальность (метры)
|
|
|
RANGE_MAX_M = 500.0
|
|
|
RANGE_MIN_M = 0.3
|
|
|
|
|
|
# Сглаживание оценки дальности (EMA alpha, 0=нет сглаживания, 0.9=сильное)
|
|
|
RANGE_SMOOTH_ALPHA = 0.65
|
|
|
|
|
|
# Tau (time-to-contact)
|
|
|
TAU_SMOOTH_ALPHA = 0.50
|
|
|
TAU_MIN_AREA_RATE = 0.5 # минимальная скорость роста площади (px²/s)
|
|
|
TAU_WARN_SEC = 3.0 # предупреждение: < N секунд до контакта
|
|
|
TAU_CRITICAL_SEC = 1.0 # критическая фаза
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
# 2. PROPORTIONAL NAVIGATION (proportional_navigation.py)
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
PN_ENABLE = True
|
|
|
|
|
|
# Навигационная константа (N). Обычно 3-5.
|
|
|
# N=3 — базовый PN, N=4-5 — более агрессивный перехват
|
|
|
PN_NAV_GAIN = 4.0
|
|
|
|
|
|
# Использовать Augmented PN (учитывает ускорение цели)
|
|
|
PN_AUGMENTED = True
|
|
|
PN_AUG_GAIN = 0.5 # вес компенсации ускорения цели
|
|
|
|
|
|
# Максимальная команда ускорения (нормализованная, 0..1)
|
|
|
PN_MAX_ACCEL_CMD = 1.0
|
|
|
|
|
|
# Если range недоступен, fallback к screen-space PN
|
|
|
PN_SCREEN_FALLBACK = True
|
|
|
|
|
|
# Сглаживание LOS rate
|
|
|
PN_LOS_RATE_SMOOTH = 0.40
|
|
|
|
|
|
# Минимальная closing velocity для активации PN (м/с)
|
|
|
PN_MIN_CLOSING_VEL = 0.5
|
|
|
|
|
|
# Lead bias (секунды предсказания вперед для упреждения)
|
|
|
PN_LEAD_TIME_SEC = 0.15
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
# 3. INTERCEPT FSM (intercept_fsm.py)
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
INTERCEPT_FSM_ENABLE = True
|
|
|
|
|
|
# Пороги перехода между фазами (по дальности, метры)
|
|
|
FSM_ACQUIRE_RANGE_M = 200.0 # SEARCH → ACQUIRE: цель обнаружена
|
|
|
FSM_TRACK_CONFIRM_HITS = 5 # ACQUIRE → TRACK: стабильный трек
|
|
|
FSM_INTERCEPT_RANGE_M = 80.0 # TRACK → INTERCEPT: начинаем атаку
|
|
|
FSM_TERMINAL_TAU_SEC = 1.5 # INTERCEPT → TERMINAL: осталось < N сек
|
|
|
FSM_TERMINAL_RANGE_M = 8.0 # или расстояние < N метров
|
|
|
|
|
|
# Таймауты (кадры)
|
|
|
FSM_ACQUIRE_TIMEOUT = 150 # не подтвердили → SEARCH
|
|
|
FSM_LOST_TIMEOUT = 60 # потеря в TRACK/INTERCEPT → LOST
|
|
|
FSM_LOST_RECOVER_TIMEOUT = 90 # LOST → SEARCH (полный сброс)
|
|
|
|
|
|
# Throttle / скорость сближения
|
|
|
FSM_INTERCEPT_THROTTLE_BIAS = 0.85 # базовый газ в фазе INTERCEPT
|
|
|
FSM_TERMINAL_THROTTLE = 1.0 # максимальный газ в TERMINAL
|
|
|
FSM_TRACK_THROTTLE_BIAS = 0.60 # удержание дистанции в TRACK
|
|
|
|
|
|
# Terminal phase — переход на инерциальную навигацию
|
|
|
FSM_TERMINAL_USE_KLT_ONLY = True # в TERMINAL отключить YOLO, только KLT
|
|
|
FSM_TERMINAL_LOCK_COMMANDS = False # заморозить команды в последний момент
|
|
|
FSM_TERMINAL_LOCK_TAU_SEC = 0.3 # за сколько секунд заморозить
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
# 4. AUTOPILOT BRIDGE (autopilot_bridge.py)
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
AUTOPILOT_ENABLE = True
|
|
|
AUTOPILOT_BACKEND = "json" # "json" | "mavlink" | "msp" | "proto_udp"
|
|
|
|
|
|
# JSON export (расширенный вариант текущего guidance_state.json)
|
|
|
AUTOPILOT_JSON_PATH = "autopilot_cmd.json"
|
|
|
AUTOPILOT_JSON_EVERY = 1 # каждый N-й кадр
|
|
|
|
|
|
# MAVLink
|
|
|
MAVLINK_CONNECTION = "udpout:127.0.0.1:14550"
|
|
|
MAVLINK_SYSTEM_ID = 1
|
|
|
MAVLINK_COMPONENT_ID = 191 # MAV_COMP_ID_ONBOARD_COMPUTER
|
|
|
MAVLINK_CMD_RATE_HZ = 30.0
|
|
|
|
|
|
# MSP (Betaflight / INAV)
|
|
|
MSP_PORT = "/dev/ttyUSB0" # или "COM3" на Windows
|
|
|
MSP_BAUD = 115200
|
|
|
MSP_CMD_RATE_HZ = 50.0
|
|
|
|
|
|
# Испытательный UDP-протокол "нейросеть -> блок"
|
|
|
PROTO_UDP_ENABLE = False
|
|
|
PROTO_UDP_HOST = "127.0.0.1"
|
|
|
PROTO_UDP_PORT = 5005
|
|
|
PROTO_UDP_DESCRIPTOR = 1
|
|
|
|
|
|
# Маппинг команд наведения → управления дроном
|
|
|
# Коэффициенты конвертации steer → RC channels (микросекунды)
|
|
|
AUTOPILOT_ROLL_SCALE = 500.0 # steer_x * scale + 1500
|
|
|
AUTOPILOT_PITCH_SCALE = 500.0 # steer_y * scale + 1500
|
|
|
AUTOPILOT_YAW_SCALE = 300.0
|
|
|
AUTOPILOT_THROTTLE_CENTER = 1500
|
|
|
AUTOPILOT_RC_MIN = 1000
|
|
|
AUTOPILOT_RC_MAX = 2000
|
|
|
|
|
|
# Экстренный стоп (kill switch при потере цели)
|
|
|
AUTOPILOT_FAILSAFE_ENABLE = True
|
|
|
AUTOPILOT_FAILSAFE_MISS_FRAMES = 30 # потеря > N кадров → hover/RTL
|
|
|
AUTOPILOT_FAILSAFE_ACTION = "hover" # "hover" | "rtl" | "land"
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
# 5. IMM FILTER (imm_filter.py)
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
IMM_ENABLE = True
|
|
|
|
|
|
# Процессный шум для каждой модели
|
|
|
IMM_CV_Q_POS = 2.0 # Constant Velocity — позиция
|
|
|
IMM_CV_Q_VEL = 4.0 # Constant Velocity — скорость
|
|
|
IMM_CA_Q_POS = 1.5 # Constant Acceleration — позиция
|
|
|
IMM_CA_Q_VEL = 3.0 # Constant Acceleration — скорость
|
|
|
IMM_CA_Q_ACC = 12.0 # Constant Acceleration — ускорение
|
|
|
IMM_CT_Q_POS = 2.0 # Coordinated Turn — позиция
|
|
|
IMM_CT_Q_VEL = 5.0 # Coordinated Turn — скорость
|
|
|
IMM_CT_Q_OMEGA = 1.0 # Coordinated Turn — угловая скорость
|
|
|
|
|
|
# Начальные вероятности моделей [CV, CA, CT]
|
|
|
IMM_INIT_PROBS = [0.6, 0.25, 0.15]
|
|
|
|
|
|
# Матрица переходов между моделями (Markov)
|
|
|
# [из CV→CV, из CV→CA, из CV→CT]
|
|
|
# [из CA→CV, из CA→CA, из CA→CT]
|
|
|
# [из CT→CV, из CT→CA, из CT→CT]
|
|
|
IMM_TRANSITION_MATRIX = [
|
|
|
[0.90, 0.07, 0.03],
|
|
|
[0.10, 0.82, 0.08],
|
|
|
[0.08, 0.07, 0.85],
|
|
|
]
|
|
|
|
|
|
# Measurement noise
|
|
|
IMM_R_POS = 16.0
|
|
|
IMM_R_SIZE = 25.0
|
|
|
|
|
|
# Заменить стандартный Kalman8D на IMM (если True, main.py использует IMM)
|
|
|
IMM_REPLACE_KALMAN = False # включить после тестирования
|
|
|
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
# 6. DRAW / DEBUG для новых модулей
|
|
|
# ─────────────────────────────────────────────────────────────
|
|
|
DRAW_RANGE_INFO = True
|
|
|
DRAW_INTERCEPT_FSM = True
|
|
|
DRAW_PN_VECTOR = True
|
|
|
DRAW_IMM_PROBS = True
|
|
|
DRAW_INTERCEPT_POINT = True
|
|
|
|
|
|
from runtime_env import apply_intercept_env_overrides
|
|
|
|
|
|
apply_intercept_env_overrides(globals())
|