ArduPilot SITL: инфраструктура для запуска косимуляции
В состав примеров пакета поддержки Ardupilot входит готовое окружение ArduPilot SITL: автопилот ArduPilot (коптер arducopter), собранный для режима Software In The Loop (SITL) с расчетом физических параметров симуляции, и MAVProxy для трансляции телеметрии.
Основные понятия, которые используются в статье:
-
SITL (Software In The Loop) — симулятор, позволяющий запускать прошивку автопилота ArduPilot на персональном компьютере без аппаратной платы управления полетом. В режиме косимуляции SITL не рассчитывает физику аппарата сам, а получает ее извне.
-
Косимуляция — совместный расчет, при котором физику аппарата считает Engee, а логику управления — ArduPilot SITL; стороны синхронно обмениваются данными по UDP.
-
Lockstep — синхронный обмен «кадр за кадр»: каждая сторона ждет ответа другой, прежде чем перейти к следующему шагу расчета.
-
ШИМ-кадр — набор управляющих сигналов (широтно-импульсная модуляция) для моторов, который SITL отправляет в Engee.
-
JSON-кадр сенсоров — ответ Engee с данными виртуальных датчиков (положение, ориентация, скорости), сериализованными в JSON.
-
MAVProxy — легковесная наземная станция управления (GCS) с открытым исходным кодом, работающая в командной строке и предназначенная для систем, использующих протокол MAVLink (например, ArduPilot); в этой инфраструктуре ретранслирует телеметрию наружу.
-
GCS (Ground Control Station, наземная станция управления) — программное приложение на наземном компьютере, которое осуществляет беспроводную связь с автопилотом и используется для настройки параметров, планирования миссий, мониторинга в реальном времени и ручного управления полетом.
Как устроена инфраструктура
Инфраструктура для запуска косимуляции представляет собой Docker-контейнер.
Контейнер находится в каталоге примеров пакета поддержки (example_ardupilot/ardupilot-sitl). Получить примеры пакета поддержки в Engee можно командой:
engee.package.getdemos("Engee-Device-Manager")
В контейнере запускаются два процесса:
-
ArduPilot SITL (
arducopter) в режиме расчета физических параметров симуляции в Engee. В этом режиме автопилот не рассчитывает физику аппарата сам: он отправляет в Engee ШИМ-кадры управления моторами по UDP на порт9002и ожидает в ответ JSON-кадр с данными сенсоров. Обмен синхронизирован (lockstep); частота обмена задается в файле параметров автопилота (см. раздел Параметры автопилота). -
MAVProxy подключается к Ardupilot SITL и ретранслирует телеметрию MAVLink наружу. Такой подход позволяет одному потоку телеметрии доходить сразу до нескольких потребителей: на UDP-порт
14550— для наземной станции (GCS), на14551— для Engee, на14552— для диагностики.
Схема обмена:
ArduPilot SITL (контейнер) Engee
ШИМ-кадр, UDP 9002 ---------> Ardupilot Setup / Ardupilot RX
<--------- JSON-кадр сенсоров, UDP 9002 (Ardupilot TX)
MAVProxy (контейнер)
телеметрия MAVLink ----------> UDP 14550 (наземная станция GCS)
UDP 14551 (блоки MAVLink в Engee)
UDP 14552 (диагностика)
Порты
| Порт | Направление | Назначение |
|---|---|---|
UDP 9002 |
Ardupilot SITL ↔ Engee |
ШИМ-кадры из Ardupilot SITL в Engee, JSON-кадры сенсоров из Engee в Ardupilot SITL |
UDP 14550 |
MAVProxy → GCS |
телеметрия MAVLink для наземной станции |
UDP 14551 |
MAVProxy → Engee |
телеметрия MAVLink для блоков MAVLink |
UDP 14552 |
MAVProxy → Engee |
диагностика |
Что нужно установить
Docker
-
Windows — Docker Desktop. WSL2 устанавливается автоматически, вручную ничего настраивать не нужно.
-
Linux — Docker Engine и плагин compose:
sudo apt-get update sudo apt-get install -y docker.io docker-compose-v2
Запуск
Windows
-
Установите и запустите Docker Desktop, дождитесь статуса Ready.
-
Запустите
windows\build_and_run.batиз каталогаardupilot-sitl. Первая сборка занимает около 30 минут (клонируется и компилируется ArduPilot), последующие запуски — секунды. -
Проверьте, что контейнер поднялся:
docker ps -a
У контейнера ap_physics должен быть статус Up X minutes.
Настройка Engee
-
В Engee откройте модель-пример
example_engee_ardupilot_flight.engeeиз каталога примеров пакета поддержки (example_ardupilot). -
Выполните скрипт
Quadcopter_Parameters.ngscript— он задает параметры физики аппарата: массу, положения моторов относительно центра масс, ограничение скорости вращения винтов и коэффициенты регуляторов. -
Запустите симуляцию. Модель содержит подсистему
Ardupilot controlс блоками Ardupilot Setup, Ardupilot RX и Ardupilot TX, настроенными на UDP127.0.0.1:9002; частота шагов расчета модели задается в соответствии с частотой цикла автопилота из файла параметров.
Порядок запуска: сначала контейнер, затем модель Engee — блок Ardupilot Setup ожидает первый ШИМ-кадр от Ardupilot SITL в течение 5 секунд после старта симуляции.
Наземная станция (GCS)
Наземная станция необязательна для косимуляции: Engee обменивается данными с автопилотом напрямую по UDP 9002. Однако MAVProxy ретранслирует телеметрию MAVLink наружу: на UDP-порт 14550 — для наземной станции, на 14551 — для Engee, на 14552 — для диагностики. Благодаря этому к телеметрии можно одновременно подключить несколько потребителей: например, наблюдать за полетом и управлять аппаратом с наземной станции, при этом те же данные продолжают поступать в Engee на порт 14551.
Чтобы принимать телеметрию, настройте наземную станцию на протокол ArduPilot и прием данных по UDP на порту 14550.
Параметры автопилота
Поведение ArduPilot настраивается файлом параметров common/engee_physics.parm, который монтируется в контейнер. Файл параметров — стандартный способ конфигурации ArduPilot: с его помощью задаются частота цикла симуляции и основного контура управления, коэффициенты регуляторов (углов, угловых скоростей, позиционных контуров), параметры моторов, условия армирования и другие настройки автопилота.
Файл engee_physics.parm, который поставляется вместе с контейнером, относится к демо-модели example_engee_ardupilot_flight.engee из каталога примеров пакета поддержки: он настроен под аппарат и физику именно этой модели. Для собственной модели создайте свой файл параметров — частота обмена в нем должна соответствовать шагу расчета модели, а настройки автопилота — типу и конструкции аппарата.
Частота обмена в режиме косимуляции задается в этом файле — шаг расчета модели Engee должен ей соответствовать.
Чтобы изменить параметры, отредактируйте common/engee_physics.parm и перезапустите контейнер (снова выполните build_and_run.bat / build_and_run.sh).
Домашняя точка аппарата по умолчанию: -35.363261, 149.165237, 584, 0 (широта, долгота, высота, направление). Ее можно изменить переменной окружения HOME_LOC в файле docker-compose.yml.
Сеть
Взаимодействие Engee и контейнера не требует настройки портов вручную: Engee всегда слушает UDP-порт 9002 на своей машине (адрес 127.0.0.1), а контейнер сам доставляет туда свои пакеты.
-
Windows — контейнер работает в bridge-сети Docker Desktop и обращается к хосту через
host.docker.internal; весь трафик исходящий, поэтому пакеты контейнера попадают на UDP9002машины с Engee. -
Linux — контейнер работает в host-сети и общается с Engee и наземной станцией напрямую через
127.0.0.1.
Разница между платформами уже учтена в docker-compose.yml для каждой из них (переменные SIM_HOST и GCS_HOST) — общие файлы менять не нужно.
Диагностика
| Проблема | Что проверить |
|---|---|
Контейнер |
|
Модель остановилась с ошибкой |
запущен ли контейнер; не занят ли UDP-порт |
Нет телеметрии в наземной станции (GCS) |
слушает ли GCS UDP |