You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

180 lines
9.2 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# ============================================================
# 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())