Тел. : +7 922-02-59-564 Ярмолич Ольга Андреевна

Тел. : +7 992-017-49-73 Гильмутдинова Лариса Петровна

Тел. : +7 922-181-21-18 Каравайкина Ирина Павловна

Электронка:  ezavod@list.ru

Главный эффект: стоимость уничтожения одного дрона падает до тысяч или десятков тысяч рублей (пулемёт + свой FPV + интеллект).

Три режима адаптивной ПВО: как математический переключатель помогает сбивать дроны в городской застройке и лесополосах

Версия 2.0 (полная, с кодом и методиками)


Аннотация

В условиях городской застройки и лесистой местности традиционные средства ПВО сталкиваются с серьёзными ограничениями: радар не видит низколетящие малые дроны на фоне зданий и деревьев, оптика слепнет от бликов, дыма и веток, а РЭБ лишь переводит дрон в автономный режим.

Мы предлагаем систему с адаптивным переключателем между тремя режимами работы:

  • M₁ — «Аналитик» (оценка скрытых параметров);
  • M₂ — «Стрелок» (точное поражение с контуром стабилизации);
  • M₃ — «Адаптер» (адаптация и обучение в реальном времени).

В статье разберём реальный сценарий боя у пятиэтажки и лесополосы с цифрами энтропии, ошибки слежения и правилами выбора оружия. В конце — полный код симулятора и методика расчёта энтропии по трём акустическим датчикам.


Исходная обстановка

Ландшафт:

  • жилой квартал (пятиэтажки, сараи, СНТ);
  • за домами — лесополоса, воронки, старые окопы.

Противник:

  • рой FPV‑дронов (4 шт.) + базовая станция;
  • тактика: вылет из‑за зданий, ложные цели, скрытие в кронах.

Наши средства:

  • 2 акустические станции (пеленгация по звуку);
  • 1 оптическая камера с тепловизором;
  • 1 зенитный пулемёт (управляемый сервоприводами);
  • 3 своих FPV‑дрона‑перехватчика;
  • 1 станция РЭБ ближнего радиуса.

Задача: сбить все вражеские дроны с минимальным расходом боеприпасов и своих бортов.


Сценарий в реальном времени (0–45 секунд)

Этап 1: t = 0–8 с — неопределённость, режим M₁ («Аналитик»)

Ситуация. Акустика засекла шум винтов. Источников несколько, сигнал переотражается от зданий. Непонятно:

  • сколько дронов;
  • откуда летят;
  • это FPV или разведчик?

Расчёт энтропии H(t)H(t). Используем формулу Шеннона для распределения вероятностей направлений:

H(t)=−∑pilog⁡2piH(t)=pilog2pi

Вероятности направлений (по методу максимальной энтропии):

Направление

Север (лес)

Юг (дома)

Запад (пустырь)

Низ (окопы)

P(направление)P(направление)

0,55

0,30

0,10

0,05

Подставляем значения:

H=−(0,55log⁡20,55+0,30log⁡20,30+0,10log⁡20,10+0,05log⁡20,05)≈1,45 битH=(0,55log20,55+0,30log20,30+0,10log20,10+0,05log20,05)1,45 бит

Порог: H>0,7H>0,7 → включаем режим M₁.

Действия M₁:

  • DBN (байесовская сеть) строит вероятностную карту появления дронов;
  • отдаётся команда: наблюдать сектор «лес» (вероятность 0,55) и подняться оптикой на уровень 3‑го этажа (откуда обычно выходят FPV).

Результат через 5 секунд: оптика ловит первый дрон у кромки леса.


Этап 2: t = 8–17 с — дрон в прямой видимости, режим M₂ («Стрелок»)

Ситуация. Дрон типа FPV летит прямо на пулемётную точку:

  • высота — 8 м;
  • скорость — 12 м/с;
  • дальность — 450 м.

Метрики:

  • энтропия H=0,2H=0,2 (направление известно);
  • ошибка прогноза e(t)=0,05e(t)=0,05 (траектория предсказуема);
  • плотность датчиков κ=0,9κ=0,9 (оптика + акустика работают).

Правило выбора: e<0,15e<0,15κ>0,7κ>0,7H<0,4H<0,4 → режим M₂.

Действие M₂. Задействуем ПИД‑регулятор наведения пулемёта:

u(t)=Kpe(t)+Ki∫e dt+Kddedtu(t)=Kpe(t)+Kiedt+Kddtde

где:

  • Kp=0,6Kp=0,6 — пропорциональный коэффициент;
  • Ki=0,2Ki=0,2 — интегральный коэффициент;
  • Kd=0,1Kd=0,1 — дифференциальный коэффициент;
  • e(t)e(t) — угловая ошибка наведения.

Через 3 секунды пулемёт берёт упреждение — очередь из 20 патронов сбивает дрон на дальности 150 м.

Результат: один дрон уничтожен, потрачено 20 патронов (экономично).


Этап 3: t = 18–30 с — дрон пропал за домом, режим M₃ («Адаптер»)

Ситуация. Осталось 3 дрона. Один нырнул за пятиэтажку (зона радиотени):

  • пулемёт не видит цель;
  • РЭБ бесполезна (дрон перешёл на автопилот по последней координате).

Метрики:

  • ошибка прогноза e(t)e(t) резко выросла до 0,5 (прогноз — прямая линия, факт — пропал);
  • κκ упала до 0,4 (оптика потеряла цель).

Правило выбора: e>0,3e>0,3 или κ<0,5κ<0,5 → режим M₃.

Действие M₃. Агент DRL (обученная политика) пробует последовательность:

  1. Выпустить свой FPV‑дрон в обход дома с другой стороны.
  2. Анализировать телеметрию (тепловизионный канал своего дрона).
  3. Как только чужой дрон найден — команда своему дрону на таран.

Награда:

  • уничтожение чужого дрона: +100;
  • потеря своего дрона: −20;
  • пустая трата времени: −1 за секунду.

Агент выбирает эту тактику, потому что в симуляторе она дала 76 % успеха против «ушедшего за угол» дрона.

Результат: свой дрон через 9 секунд находит и таранит вражеский FPV. Потеря своего перехватчика, но цель уничтожена.


Этап 4: t = 30–45 с — оставшиеся два дрона меняют тактику (эффект адаптации)

Ситуация. Противник заметил: «по прямым целям стреляет пулемёт, за угол посылает встречный дрон». Дроны начинают маневрировать хаотично, подныривая в воронки и скрываясь в ветвях. Стандартные методы сбоят — ошибка прогноза e(t)e(t) скачет от 0,2 до 0,5.

Переключатель переходит в гибридный режим (M₂ + M₃ с весами):

u=w2uПИД+w3uDRLu=w2uПИД+w3uDRL

Веса рассчитываются так:

w2=exp⁡(−βe2)exp⁡(−βe2)+exp⁡(−βσDL),w3=1−w2w2=exp(βe2)+exp(βσDL)exp(βe2),w3=1w2

где σDLσDL — дисперсия действий DRL‑агента (мера уверенности).

При e=0,4e=0,4 веса получаются w2≈0,3w20,3w3≈0,7w30,7 — действует в основном адаптер.

Адаптер пробует неожиданное действие: применить РЭБ не на глушение, а на имитацию ложной базовой станции — чтобы перехватить управление дроном. С первой попытки не выходит, со второй один дрон теряет связь и ложится в воронку. Второй дрон добит пулемётом, когда на секунду вылетает из‑за дерева (ПИД успевает).


Сводная таблица: какой режим когда работает

Режим

Условия (метрики)

Средства

Ресурс

Ошибка поражения

M₁ («Аналитик»)

H>0,7H>0,7 или κ<0,5κ<0,5

DBN, акустика, карта укрытий

процессор, время

не поражает, только разведка

M₂ («Стрелок»)

e<0,15e<0,15κ>0,7κ>0,7H<0,4H<0,4

Пулемёт с ПИД, лазер

патроны, энергия

<5% на дистанции 400 м

M₃ («Адаптер»)

e>0,3e>0,3 или дрон скрылся

Свой FPV-дрон, сетка, ложный сигнал

свои носители

20–40% в сложных условиях, но дёшево

Дополнительный гибридный режим (M₂+M₃):
0.15≤e≤0.30.15e0.3 и κ>0.5κ>0.5 → взвешенное управление u=w2uПИД+w3uDRLu=w2uПИД+w3uDRL.


Таблица порогов (шпаргалка командира)

Условие переключения в реальном бою — три значения, которые легко рассчитать на планшете:

Метрика

Зелёная зона (M₂)

Жёлтая зона (гибрид)

Красная зона (M₁ или M₃)

HH (энтропия, бит)

< 0.4

0.4 … 0.7

> 0.7

ee (ошибка прогноза)

< 0.15

0.15 … 0.30

> 0.30

κκ (плотность датчиков)

> 0.7

0.5 … 0.7

< 0.5

Правило:

  • Если хоть одна метрика в красной зоне → M₁ (при κ<0.5κ<0.5 или H>0.7H>0.7) или M₃ (при e>0.3e>0.3).
  • Если все в зелёной → M₂.
  • Иначе → гибрид M₂+M₃.

Методика расчёта энтропии H(t)H(t) по трём акустическим датчикам

Принцип TDOA (разность времени прихода сигнала)

Пусть три датчика расположены в точках A,B,CA,B,C с известными координатами.
Дрон издаёт звук (частота винтов ~ 200–500 Гц). Меряем время прихода сигнала на каждый датчик 
tA,tB,tCtA,tB,tC.

Вычисляем разности:

ΔtAB=tA−tB,ΔtAC=tA−tCΔtAB=tAtB,ΔtAC=tAtC

Каждой паре ΔtΔt соответствует гиперболоид (в 2D — гипербола), на которой лежит источник.

Шаги алгоритма

  1. Оцифровка сигнала (частота 48 кГц, окно 0.1 с).
  2. Корреляция между парами датчиков → находим ΔtAB,ΔtACΔtAB,ΔtAC.
  3. Решаем систему уравнений для координат (x,y)(x,y). Получаем оценку положения дрона с погрешностью.
  4. Повторяем для нескольких последовательных измерений → гистограмма направлений по секторам.
  5. Нормируем гистограмму в вероятности pipi.
  6. Считаем энтропию Шеннона:

H=−∑i=14pilog⁡2piH=i=14pilog2pi

Пример для нашего сценария (секторы: лес, дома, пустырь, окопы)

Измерение

Лес

Дома

Пустырь

Окопы

1

0.50

0.30

0.15

0.05

2

0.60

0.25

0.10

0.05

3

0.55

0.30

0.10

0.05

Среднее

0.55

0.283

0.117

0.05

Подставляем в формулу:

H=−[0.55log⁡2(0.55)+0.283log⁡2(0.283)+0.117log⁡2(0.117)+0.05log⁡2(0.05)]H=[0.55log2(0.55)+0.283log2(0.283)+0.117log2(0.117)+0.05log2(0.05)]

Вычисления:

  • 0.55 * (-0.862) = -0.474
  • 0.283 * (-1.82) = -0.515
  • 0.117 * (-3.09) = -0.361
  • 0.05 * (-4.32) = -0.216

Сумма = -1.566 → H≈1.57H1.57 бит (высокая неопределённость).

Вывод: H>0.7H>0.7 → включаем режим M₁.

Код для акустической локации и расчёта H (Python, упрощённый)

python

import numpy as np
from scipy.signal import correlate
 
def tdoa_localization(t1, t2, t3, sensor_positions, sound_speed=343):
    """
    t1,t2,t3 - время прихода сигнала на датчики 1,2,3
    sensor_positions: [[x1,y1],[x2,y2],[x3,y3]]
    возвращает координаты (x,y) источника
    """
    # разности расстояний
    d12 = (t1 - t2) * sound_speed
    d13 = (t1 - t3) * sound_speed
    
    # решение системы гипербол (упрощённо - взято из готовой лин. алгебры)
    A = np.array([[2*sensor_positions[1][0] - 2*sensor_positions[0][0], 2*sensor_positions[1][1] - 2*sensor_positions[0][1]],
                  [2*sensor_positions[2][0] - 2*sensor_positions[0][0], 2*sensor_positions[2][1] - 2*sensor_positions[0][1]]])
    b = np.array([d12**2 - (sensor_positions[0][0]**2 + sensor_positions[0][1]**2) + (sensor_positions[1][0]**2 + sensor_positions[1][1]**2),
                  d13**2 - (sensor_positions[0][0]**2 + sensor_positions[0][1]**2) + (sensor_positions[2][0]**2 + sensor_positions[2][1]**2)])
    try:
        x, y = np.linalg.solve(A, b)
        return x, y
    except:
        return None, None
 
def direction_to_sector(angle_deg):
    """0-360° -> 'forest','houses','wasteland','ditches'"""
    if angle_deg < 90: return 'forest'
    elif angle_deg < 180: return 'houses'
    elif angle_deg < 270: return 'wasteland'
    else: return 'ditches'
 
def entropy_from_detections(detections_list, sectors):
    """detections_list: список секторов (строки) за последние 3-5 измерений"""
    counts = {s: detections_list.count(s) for s in sectors}
    total = sum(counts.values())
    probs = [counts[s]/total for s in sectors]
    H = -sum(p * np.log2(p) for p in probs if p>0)
    return H
 
# Пример использования
sectors = ['forest','houses','wasteland','ditches']
detections = ['forest', 'forest', 'houses', 'forest', 'ditches']  # 5 замеров
H = entropy_from_detections(detections, sectors)
print(f"Entropy H = {H:.2f} bits")
if H > 0.7: print("Mode M₁ (Analyst) activated")

Код симулятора трёх режимов с переключателем (Python)

Этот симулятор моделирует поле боя, генерирует дронов, считает метрики H,e,κH,e,κ и переключает режимы.

python

import numpy as np
import math
from collections import deque
 
# -------------------  МЕТРИКИ -------------------
def entropy_h(probs):
    """H(t) - энтропия распределения по секторам"""
    return -sum(p * math.log2(p) for p in probs if p > 0)
 
def prediction_error(true_pos, pred_pos):
    """e(t) - относительная ошибка прогноза"""
    dist_true = math.hypot(true_pos[0], true_pos[1])
    if dist_true < 1e-3: return 0
    error = math.hypot(true_pos[0]-pred_pos[0], true_pos[1]-pred_pos[1])
    return error / dist_true
 
def sensor_coverage(active_sensors):
    """kappa(t) - доля работающих датчиков"""
    return active_sensors / 3.0  # всего 3 датчика
 
# -------------------  РЕЖИМЫ -------------------
def mode1_analyst(probs):
    print("M1: Analyst - Updating DBN, scanning high-prob sectors")
    sector = np.argmax(probs)
    return {"action": "scan", "priority_sector": sector}
 
def mode2_shooter(error_angle):
    print("M2: Shooter - PID tracking, firing solution")
    # Простой ПИД
    Kp, Ki, Kd = 0.6, 0.2, 0.1
    integral = 0
    derivative = 0
    u = Kp * error_angle + Ki * integral + Kd * derivative
    return {"action": "shoot", "u": u, "rounds": 20}
 
def mode3_adapter():
    print("M3: Adapter - Deploying own FPV, trying net / spoofing")
    return {"action": "deploy_fpv", "tactic": "ram"}
 
def hybrid_mode(w2, w3, u_pid, u_drl):
    print(f"Hybrid: weights PID={w2:.2f}, DRL={w3:.2f}")
    u = w2 * u_pid + w3 * u_drl
    return u
 
# -------------------  ПЕРЕКЛЮЧАТЕЛЬ -------------------
def switch_mode(h, e, kappa):
    """
    Правило переключения:
    - если H > 0.7 или kappa < 0.5 -> M1
    - иначе если e > 0.3 -> M3
    - иначе если e < 0.15 и kappa > 0.7 и h < 0.4 -> M2
    - иначе гибрид M2+M3
    """
    if h > 0.7 or kappa < 0.5:
        return 1
    elif e > 0.3:
        return 3
    elif e < 0.15 and kappa > 0.7 and h < 0.4:
        return 2
    else:
        return 0  # гибрид
 
# -------------------  СИМУЛЯТОР ПОЛЯ БОЯ -------------------
def simulate_battle():
    print("=== Simulating Air Defense with 3-mode switcher ===\n")
    # Инициализация
    time_steps = 45  # секунд
    drones = [{"pos": (100, 30), "vel": (5, -2), "type": "FPV", "alive": True},
              {"pos": (120, 25), "vel": (6, -1), "type": "FPV", "alive": True},
              {"pos": (80, 35), "vel": (4, -3), "type": "FPV", "alive": True},
              {"pos": (140, 20), "vel": (5, -2), "type": "FPV", "alive": True}]
    
    # Буферы для метрик
    history_probs = deque(maxlen=5)
    pred_pos = (100, 20)
    
    for t in range(time_steps):
        print(f"\n--- t={t}s ---")
        
        # Обновление позиций дронов (простейшая модель)
        for d in drones:
            if d["alive"]:
                x, y = d["pos"]
                vx, vy = d["vel"]
                d["pos"] = (x + vx, y + vy)
        
        # Собираем вероятности секторов на основе акустики (имитация)
        # Пусть в данном тесте сначала высокая энтропия, потом снижается
        if t < 10:
            probs = [0.55, 0.30, 0.10, 0.05]  # лес, дома, пустырь, окопы
        elif t < 25:
            probs = [0.70, 0.20, 0.07, 0.03]
        else:
            probs = [0.85, 0.10, 0.03, 0.02]
        
        h = entropy_h(probs)
        # Выбираем ближайшего живого дрона для e(t)
        alive_drones = [d for d in drones if d["alive"]]
        if alive_drones:
            true_pos = alive_drones[0]["pos"]
            e = prediction_error(true_pos, pred_pos)
            # Обновляем прогноз для следующего шага
            pred_pos = (true_pos[0] + 5, true_pos[1] - 2)
        else:
            e = 0.0
        
        kappa = sensor_coverage(np.random.choice([0,1], p=[0.1,0.9]))  # 90% работоспособность датчиков
        
        print(f"H={h:.2f} bits, e={e:.2f}, kappa={kappa:.2f}")
        
        mode = switch_mode(h, e, kappa)
        
        if mode == 1:
            action = mode1_analyst(probs)
        elif mode == 2:
            error_angle = 0.05  # имитация ошибки наведения
            action = mode2_shooter(error_angle)
            # В режиме M2 сбиваем один дрон с вероятностью 0.8
            if t > 8 and t < 17 and np.random.rand() < 0.8:
                for d in drones:
                    if d["alive"]:
                        d["alive"] = False
                        print("Hit! Enemy drone destroyed by M2 (shooter)")
                        break
        elif mode == 3:
            action = mode3_adapter()
            # В M3 сбиваем дрон с вероятностью 0.5
            if t > 18 and t < 30 and np.random.rand() < 0.5:
                for d in drones:
                    if d["alive"]:
                        d["alive"] = False
                        print("Enemy drone destroyed by M3 (adapter)")
                        break
        else:  # гибрид
            print("Hybrid mode M2+M3")
            # Взвешенное управление
            beta = 2.0
            sigma_dl = 0.5  # дисперсия DRL
            w2 = math.exp(-beta * e**2) / (math.exp(-beta * e**2) + math.exp(-beta * sigma_dl))
            w3 = 1 - w2
            u_pid = 0.1  # некоторое значение усиления
            u_drl = 0.3
            u = hybrid_mode(w2, w3, u_pid, u_drl)
            # В гибридном режиме редко сбиваем дрон
            if np.random.rand() < 0.3:
                for d in drones:
                    if d["alive"]:
                        d["alive"] = False
                        print("Drone destroyed in hybrid mode")
                        break
        
        # Проверка завершения боя
        if not any(d["alive"] for d in drones):
            print("\n*** All enemy drones neutralized ***")
            break
    
    print("\n=== Simulation finished ===")
 
if __name__ == "__main__":
    simulate_battle()

Как использовать код

  1. Сохраните файл adapter_pvo.py.
  2. Установите зависимости: pip install numpy scipy.
  3. Запуститеpython adapter_pvo.py.
  4. Наблюдайте вывод: в консоли будут метрики, переключения режимов и уведомления об уничтожении дронов.

Вы можете менять:

  • параметры датчиков в функции sensor_coverage;
  • пороги в switch_mode;
  • поведение дронов (траектории, типы);
  • вероятности поражения в каждом режиме.

Выводы для тактики

  1. Не пытайтесь всё время стрелять. Включите M₁ — соберите информацию, понизьте энтропию.
  2. Как только дрон виден и прямолинеен — применяйте M₂ (ПИД). Это максимально дёшево и надёжно.
  3. При манёвре, пропадании или постановке помех — сразу M₃. Пробуйте нетривиальные вещи: встречный дрон, ложный сигнал, ловушку.
  4. Переключатель может быть полуавтоматическим: достаточно планшета командира с калькулятором трёх формул (H,e,κH,e,κ) и таблицей решений.

Главный эффект: стоимость уничтожения одного дрона падает с миллионов рублей (ракета ПВО) до тысяч или десятков тысяч рублей (пулемёт + свой FPV + интеллект).


Задание для самостоятельной тренировки

Сценарий:
Ландшафт — плотный лес + овраг. Три дрона заходят на разных высотах.
Средства: 2 акустики, 1 тепловизор, 1 пулемёт, 1 свой FPV.

Вопросы:

  1. Для первого появления (шумы, неизвестно направление) какой режим включите?
  2. Какой порог HH вы выберете для перехода к M₂?
  3. Если дрон заходит на бреющем за деревьями, что делать: M₃ (выпускать свой) или пробовать другой вариант?

Ответы для самопроверки:

  1. Режим M₁ («Аналитик»), так как HH будет высокая.
  2. После снижения H<0.4H<0.4 и e<0.15e<0.15 — переход в M₂.
  3. Лучше M₃ с выпуском своего FPV, чтобы «зайти за дерево» вслед за дроном.

Дальнейшее развитие:

Описанный переключатель — это прототип. Для внедрения в подразделении необходимо:

  • Развернуть 3–4 акустических модуля (цена <5000 руб/шт);
  • Подключить одну управляемую турель (пулемёт или лазерную указку);
  • Научить DRL-агента в симуляторе (Gazebo с моделью леса/домов/воронок);
  • Установить планшет с правилами переключения (пороги H,e,κH,e,κ).

Ключевое преимущество: система работает в условиях, где дорогие ПВО слепнут, и позволяет эффективно защищать объекты в прифронтовой полосе, лесных массивах и городских кварталах.