Рой из 50+ дронов, управляемый централизованно, упирается в вычислительные ограничения — каждый кадр планирования требует O(N²) операций. Мы решаем эту задачу децентрализованными алгоритмами MARL (Multi-Agent Reinforcement Learning). Каждый дрон принимает решения на основе локальных наблюдений и коммуникации с соседями, что обеспечивает линейное масштабирование. Разберем, как мы строим такие системы — от симуляции до реальных полетов.
Проблемы при масштабировании
При N=10 централизованный планировщик работает. При N=100 — вычислительно неподъёмно. При N=1000 — невозможно. Децентрализованный рой масштабируется линейно: каждый дрон обрабатывает только ближайших соседей (K=5–8).
Надёжность связи: алгоритм должен работать при packet loss 20–30% и latency 50–200 мс. Мы используем gossip-протокол для распространения информации и communication-aware RL, где дрон решает, когда и кому отправлять сообщения.
Sim-to-real gap — главная причина отказов. Мы применяем domain randomization: случайные параметры ветра, массы, трения в симуляторе, чтобы модель обобщала на реальные условия.
Как MARL решает проблему масштабирования?
Базовые правила Рейнольдса (Separation, Alignment, Cohesion) дают примитивное поведение. Поверх них мы накладываем обучение с подкреплением для задачи-специфичного поведения: покрытие территории, поиск целей или транспортировка груза.
Observation на каждый дрон:
obs_per_drone = {
'own_state': [x, y, z, vx, vy, vz, battery], # 7 значений
'neighbors': [[rel_pos, rel_vel] for n in K_nearest_neighbors], # K×6
'goal': [dx, dy, dz], # направление к цели
'obstacles': lidar_scan # 16-ray LiDAR
}
Почему децентрализованный подход эффективнее?
MARL-рой демонстрирует на 40% выше coverage rate по сравнению с решением на основе только Reynolds Flocking. Reward-инжиниринг позволяет гибко балансировать между покрытием, избеганием столкновений и энергопотреблением.
Centralized Training Decentralized Execution (CTDE):
- Обучение: critic видит глобальное состояние всего роя
- Исполнение: каждый дрон использует только локальное наблюдение
QMIX (Multi-Agent Value Decomposition):
# QMIX: Q_tot = f(Q_1,...,Q_n, state)
# монотоническое смешивание индивидуальных Q-функций
# гарантирует: argmax Q_tot = [argmax Q_i for each i]
class QMIXNet(nn.Module):
def __init__(self, n_agents, state_dim):
super().__init__()
self.hyper_w1 = nn.Linear(state_dim, n_agents * 32)
self.hyper_w2 = nn.Linear(state_dim, 32)
self.hyper_b1 = nn.Linear(state_dim, 32)
self.hyper_b2 = nn.Linear(state_dim, 1)
def forward(self, q_agents, state):
w1 = F.elu(self.hyper_w1(state)).view(-1, q_agents.size(1), 32)
w2 = F.elu(self.hyper_w2(state)).unsqueeze(-1)
return q_total
Техническая реализация
Задачи роя
- Покрытие территории. N дронов равномерно покрывают область S за минимальное время. Reward пропорционален покрытой уникальной площади.
- Поиск и обнаружение. Рой ищет цели (люди в завалах, лесные пожары). Информация распространяется через mesh-сеть.
- Транспортировка. Несколько дронов несут груз совместно. Задача — синхронизировать тягу без центрального координатора.
- Защита от угроз (Counter-UAV). Часть роя — защитники, отслеживающие и перехватывающие adversarial дроны.
Коммуникация в рое
Каждый дрон знает только о K ближайших соседях (K=5–8). Gossip-протокол: информация распространяется волнами. Действие включает решение о коммуникации:
action_space = spaces.Dict({
'motion': spaces.Box(-1, 1, (3,)), # velocity
'message': spaces.Box(-1, 1, (8,)), # broadcast вектор соседям
})
obs = concat([own_state, neighbor_messages, sensor_readings])
Избегание столкновений
Velocity Obstacle (VO) / Reciprocal VO (ORCA): классический алгоритм, гарантирует collision-free при известных скоростях всех дронов. Используется как safety layer поверх RL.
from rl_swarm.safety import ORCASafetyLayer
safety = ORCASafetyLayer(max_speed=5.0, safety_radius=1.5)
raw_velocity = rl_policy.predict(obs)
safe_velocity = safety.compute_safe_velocity(
raw_velocity, drone_position, neighbor_positions, neighbor_velocities
)
Симуляция: Gazebo + PX4
# запуск 10 экземпляров PX4 + один Gazebo
./Tools/simulation/gazebo-classic/sitl_multiple_run.sh -n 10 -m iris
# каждый дрон на отдельном MAVLink порту: 14540+i
import asyncio
from mavsdk import System
async def control_swarm(n_drones):
drones = [System() for _ in range(n_drones)]
await asyncio.gather(*[
drone.connect(f"udp://:1454{i}") for i, drone in enumerate(drones)
])
await asyncio.gather(*[drone.action.takeoff() for drone in drones])
Сравнение подходов к управлению роем
| Характеристика | Централизованный | Децентрализованный (MARL) | Гибридный |
|---|---|---|---|
| Масштабируемость | O(N²) ✗ | O(N) ✓ | O(N log N) |
| Collision avoidance | Требует полной карты | Локальное ORCA | Safety layer + RL |
| Устойчивость к отказам | Единая точка отказа | Высокая (отказ одного не влияет) | Средняя |
| Quality of training | Высокая (полная информация) | Средняя (частичная наблюдения) | Высокая |
Сравнение алгоритмов MARL
| Алгоритм | Тип задач | Преимущества | Недостатки |
|---|---|---|---|
| QMIX | Кооперативные | Монотонное смешивание, гарантия согласованности | Не подходит для конкурентных сценариев |
| MADDPG | Кооперативные/конкурентные | CTDE, простая реализация | Высокая вариативность обучения |
| MAPPO | Кооперативные | Высокая эффективность с PPO | Чувствительность к гиперпараметрам |
Оценка и метрики
- Coverage rate: % целевой площади покрытой за T минут
- Formation error: среднеквадратичное отклонение от целевого формирования
- Collision rate: столкновений на 100 полётных часов
- Communication load: среднее число сообщений/сек на дрон
- Resilience: % задач выполненных при отказе 20% дронов
Reynolds, C. W. (1987). Flocks, herds, and schools: A distributed behavioral model.
Процесс разработки и сроки
- Анализ задачи и подбор алгоритма — определяем цели (покрытие, поиск, транспортировка), выбираем MARL-алгоритм (QMIX, MADDPG и др.)
- Симуляция и тренировка — строим окружение в Gazebo, настраиваем reward, запускаем distributed training на кластере GPU
- Safety layer и тестирование — интегрируем ORCA, проверяем отказоустойчивость в симуляции
- Sim-to-real перенос — калибруем модель на реальных данных, проводим полётные тесты на полигоне
- Развёртывание и поддержка — настраиваем систему управления, документируем API, передаём заказчику
Сроки ориентировочно: прототип на 5–10 дронов в симуляции — от 12 недель. Полноценная MARL-система с safety, sim-to-real и реальными полётами на 20+ дронах — от 28 до 36 недель. Стоимость рассчитывается индивидуально в зависимости от сложности задач и необходимого стека.
Что входит в работу
- Архитектура MARL (QMIX / MADDPG) с CTDE
- Симулятор Gazebo + PX4 с domain randomization
- Safety layer на базе ORCA
- Интеграция с реальными дронами (PX4, MAVLink)
- Документация по обучению и эксплуатации
- Обучение команды заказчика
- Поддержка 3 месяца после внедрения
У нас 5+ лет опыта в ML для робототехники и 15+ завершённых проектов по управлению БПЛА. Для оценки вашей задачи свяжитесь с нами — мы подготовим техническое предложение с метриками и сроками.
Получите консультацию — расскажите нам о вашей задаче, и мы предложим оптимальное решение.







