Планувальник ротації покриття ISR
Інтерактивний планувальник ротації ISR Fischer 26 для цілодобового спостереження. Розрахунок мінімальної кількості дронів у повітрі, прогалин покриття та інтервалів зміщення.
Interactive: ISR Coverage Rotation Planner
Plan Fischer 26 rotation to maximize persistent ISR coverage. Adjust fleet size, endurance, and recharge time to see how many drones are airborne at any hour.
Постійне ISR-покриття з обмеженим флотом дронів
Планувальник ротації вирішує проблему планування безперервного повітряного спостереження дронами з обмеженою автономністю. П'ять Fischer 26 з 2-годинною автономністю та 2,5-годинною зарядкою не можуть літати одночасно — планувальник розраховує оптимальний інтервал зміщення щоб коли один дрон повертається на зарядку інший запускався на заміну. Візуальна 24-годинна шкала часу показує точно коли кожен дрон у повітрі (зелений) і заряджається (сірий) та виявляє прогалини коли жоден дрон не літає. Зі стандартною конфігурацією планувальник підтримує в середньому 2,2 дрони в повітрі безперервно з нульовими прогалинами.
Аналіз прогалин та розмір флоту
Критичний показник — мінімальна кількість дронів у повітрі в найгіршому випадку за 24-годинний цикл. Якщо це значення падає до нуля існує вікно коли бригада не має ISR-покриття і фактично оперує наосліп. Планувальник показує що чотири Fischer 26 зі стандартним профілем дають періодичні прогалини 15–20 хвилин. П'ять усувають усі прогалини. Шість забезпечують резерв — якщо один дрон втрачено від вогню противника решта п'ять підтримують безперервне покриття.
Оптимізація інтервалу зміщення
Оптимальний інтервал зміщення дорівнює загальному часу циклу поділеному на розмір флоту. Для 5 дронів з 4,5-годинним циклом зміщення становить 54 хвилини — один дрон запускається кожні 54 хвилини за ковзним графіком. Відхилення від оптимального інтервалу — наприклад запуск двох дронів одночасно після затримки обслуговування — створює тимчасове перенасичення а потім прогалину. Візуалізація часової шкали планувальника робить ці помилки планування негайно видимими.
Вплив погоди на планування покриття
Скандинавська погода суттєво впливає на автономність Fischer 26 і, отже, на планування ротації покриття. При −20 °C ємність LiPo-акумулятора падає приблизно до 50 % від номіналу, скорочуючи ефективну автономність із 2 годин до 1 години. Планувальник покриття має це враховувати: або подвоїти розмір флоту (10 дронів замість 5), або прийняти періодичні прогалини покриття в екстремальному холоді. Дощ понад 5 мм/год знижує ефективність оптичної камери, але не впливає на теплове виявлення — планувальник повинен рекомендувати лише тепловий ISR під час опадів. Вітер понад 15 м/с повністю перевищує безпечну експлуатаційну оболонку Fischer 26, що вимагає заземлення всіх фіксовано-крилих ISR і переходу на наземні сенсорні мережі.
Протокол передачі між вихідним і вхідним дроном
54-хвилинний інтервал зміщення створює 10–15 хвилинний період перекриття, коли і вихідний, і вхідний Fischer 26 одночасно в повітрі. Це перекриття навмисне і критичне для безперервного покриття — вхідний дрон повинен встановити MANET-мережеве з\'єднання і підтвердити функціональність сенсорів до того, як вихідний дрон повернеться на зарядку. Протокол передачі складається з чотирьох кроків: вхідний дрон досягає оперативної висоти і підтверджує потік даних COP; вхідний дрон перевіряє, що його конвеєр виявлення YOLOv8 генерує валідні виявлення; вихідний дрон отримує підтвердження завершення передачі; вихідний дрон починає політ повернення на базу. Якщо будь-який крок не виконано, вихідний дрон продовжує місію до розв\'язання проблеми, використовуючи 20 % резерв палива, спеціально передбачений для затримок передачі.
Реалізація
# ISR Coverage Rotation — Stagger Optimization
class CoverageModel:
def __init__(self, n_drones, endurance_h, recharge_h):
self.n = n_drones
self.endurance = endurance_h
self.cycle = endurance_h + recharge_h
def airborne_at(self, t_hours):
"""Count airborne drones at time t."""
count = 0
for i in range(self.n):
offset = i * (self.cycle / self.n)
phase = (t_hours + offset) % self.cycle
if phase < self.endurance:
count += 1
return count
def min_airborne_24h(self):
"""Worst-case airborne count in 24h cycle."""
return min(self.airborne_at(t/4) for t in range(96))
# 5× Fischer 26: 2h flight, 2.5h charge
model = CoverageModel(5, 2.0, 2.5)
stagger_min = (model.cycle / model.n) * 60
print(f"Stagger: {stagger_min:.0f} min between launches")
print(f"Min airborne: {model.min_airborne_24h()}")
print(f"Coverage: {model.min_airborne_24h() * 100} km² minimum")
Джерела
- ArduPilot — ardupilot.org
- FOI — FOI publications catalogue (foi.se/publications)