Документация Engee

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")

В контейнере запускаются два процесса:

  1. ArduPilot SITL (arducopter) в режиме расчета физических параметров симуляции в Engee. В этом режиме автопилот не рассчитывает физику аппарата сам: он отправляет в Engee ШИМ-кадры управления моторами по UDP на порт 9002 и ожидает в ответ JSON-кадр с данными сенсоров. Обмен синхронизирован (lockstep); частота обмена задается в файле параметров автопилота (см. раздел Параметры автопилота).

  2. 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

Engee с пакетом поддержки оборудования

Установите или обновите подсистему Engee.Интеграции, как показано в статье, — она требуется для блоков Ardupilot и MAVLink.

Запуск

Windows

  1. Установите и запустите Docker Desktop, дождитесь статуса Ready.

  2. Запустите windows\build_and_run.bat из каталога ardupilot-sitl. Первая сборка занимает около 30 минут (клонируется и компилируется ArduPilot), последующие запуски — секунды.

  3. Проверьте, что контейнер поднялся:

    docker ps -a

У контейнера ap_physics должен быть статус Up X minutes.

Linux

  1. Сделайте скрипт исполняемым и запустите его:

    chmod +x linux/build_and_run.sh
    bash linux/build_and_run.sh
  2. Проверьте статус контейнера:

    docker ps -a

Логи контейнера: docker logs -f ap_physics.

Настройка Engee

  1. В Engee откройте модель-пример example_engee_ardupilot_flight.engee из каталога примеров пакета поддержки (example_ardupilot).

  2. Выполните скрипт Quadcopter_Parameters.ngscript — он задает параметры физики аппарата: массу, положения моторов относительно центра масс, ограничение скорости вращения винтов и коэффициенты регуляторов.

  3. Запустите симуляцию. Модель содержит подсистему Ardupilot control с блоками Ardupilot Setup, Ardupilot RX и Ardupilot TX, настроенными на UDP 127.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; весь трафик исходящий, поэтому пакеты контейнера попадают на UDP 9002 машины с Engee.

  • Linux — контейнер работает в host-сети и общается с Engee и наземной станцией напрямую через 127.0.0.1.

Разница между платформами уже учтена в docker-compose.yml для каждой из них (переменные SIM_HOST и GCS_HOST) — общие файлы менять не нужно.

Диагностика

Проблема Что проверить

Контейнер ap_physics в статусе Exited

docker logs ap_physics — ошибки сборки или запуска Ardupilot SITL

Модель остановилась с ошибкой ArduPilot lockstep timed out waiting for PWM

запущен ли контейнер; не занят ли UDP-порт 9002 другим процессом; на Windows — разрешен ли трафик в брандмауэре

Нет телеметрии в наземной станции (GCS)

слушает ли GCS UDP 14550; статус контейнера (docker ps -a)