Спуфинг GPS-приемника ArduPilot по протоколу MAVLink в Engee
Подмена GPS-сигнала по MAVLink: Engee в роли GPS-приёмника для ArduPilot
Введение
Проект демонстрирует подмену GPS-сигнала прошивки коптера в ArduPilot: Engee отключает штатный GPS-приёмник автопилота, встраивается в MAVLink-обмен между автопилотом и наземной станцией как «внешний» приёмник, к которому в GPS-координаты добавляется регулируемый шум. Аппарат при этом ведёт миссию из QGroundControl: фильтр EKF автопилота достоверно сходится по приходящим от Engee MAVLink-сообщениям GPS_INPUT. Само управление строится по искажённой позиции, и траектория полёта расходится с маршрутом тем сильнее, чем больше заданная амплитуда шума .
Прошивка arducopter для программной имитации полётного контроллера (SITL) собрана и запущена в Docker-контейнере. Engee подключается к её телеметрии как ещё один участник MAVLink-сети — ровно так, как если бы к борту подключался бортовой компьютер или подменный GPS-приёмник.
Сценарий воспроизводит модель угрозы для БПЛА: подавление и нештатное поведение GPS — реальные риски при полётах. Стенд может рассматриваться более глобально в рамках развертывания цифрового полигона на базе Engee и позволяет отрабатывать сценарии безопасно, на настоящей логике автопилота и с воспроизводимыми результатами моделирования.
1. Постановка задачи
1.1. Что такое SITL?
SITL (software-in-the-loop, «программа в контуре») — режим, при котором настоящая прошивка автопилота собирается не под полётный контроллер, а под обычную операционную систему и запускается на компьютере как обычное приложение. Для прошивки это прозрачно: она «думает», что находится на борту, и выполняет весь свой код — фильтр EKF, контуры управления, режимы полёта, миссии. Отличие от реального полёта только в том, что «железо» и окружающий мир заменены программными источниками данных.
В обычном полёте источник позиции ArduPilot — GPS-приёмник. В SITL его роль играет встроенный модуль GPS: он берёт координаты из состояния внутренней физики и отдает их EKF (Extended Kalman Filter), который оценивает реальное положение дрона в пространстве. Мы целенаправленно отключаем этот GPS-приёмник в прошивке ArduPilot при помощи опции SIM_GPS1_ENABLE = 0 и объявляем тип приёмника равным 14 — «MAV» (GPS1_TYPE = 14), что означает, что единственным источником GPS-позиции для автопилота теперь становится исключительно MAVLink-сообщение GPS_INPUT, приходящее по телеметрическому каналу от Engee.
1.2. Кто подменяет сигнал
Демо-модель Engee example_mavlink_gps_noise.engee (загружается вместе с примерами, раздел 2.2) работает как эмулятор GPS-приёмника:
- читает истинную позицию аппарата из телеметрии SITL (
SIMSTATE); - добавляет к горизонтальным координатам гауссов шум с амплитудой , регулируемой прямо из модели;
- отправляет сообщение
GPS_INPUTc частотой 10 Гц.
Высота и скорости при этом передаются честные: модель подмешивает только широту и долготу.
1.3. Что наблюдаем
- до включения шума — полёт по маршруту, заданному в QGroundControl, EKF в норме;
- после включения — оценка позиции «уплывает», автопилот ведёт аппарат за уехавшей оценкой, и трек на карте расходится с линией миссии на величину порядка нескольких ;
- аппарат при этом не бросает миссию — для автопилота сигнал выглядит достоверным. Что и представляет собой главную опасность: позиция подменена, а доверие к ней — сохраняется.
Готовность EKF к приёму «позиции» контролируется по битовой маске EKF_STATUS_REPORT.flags & 0x210 (биты POS_HORIZ_ABS и PRED_POS_HORIZ_ABS); когда маска ненулевая, модель сообщает о готовности к запуску миссии.
2. Архитектура стенда: где работает ArduPilot
2.1. Состав стенда и верхнеуровневая идея взаимодействия.
Прошивка SITL ArduPilot работает в Docker-контейнере. В разделе 2.2. приведена инструкция по быстрой настройке готовой к использованию инфраструктуры ArduPilot под системы Windows/Linux. Внутри контейнера запущены:
- arducopter SITL — прошивка Copter, собранная для хост-машины. Модель —
quad, домашняя (стартовая) точка — площадка CMAC (Canberra Model Aircraft Club) в Австралии, с координатами-35.363261,149.165237,584,0, высота над уровнем моря584 м. Именно здесь работают EKF3, контуры положения, скорости и углов, планировщик режимов и миссий — тот же код, что и в прошивке на железе; - MAVProxy — MAVLink-маршрутизатор: подключен к SERIAL0 автопилота по TCP 5760 и ретранслирует трафик всем потребителям по UDP 14550, 14551 и 14552. Любой участник сети видит один и тот же поток телеметрии, а любое сообщение от участника (например, наш
GPS_INPUT) маршрутизируется в автопилот; - QGroundControl (работает на хосте, UDP 14550) — станция оператора: карта, взвод двигателей, взлёт, миссия.
Engee не «оборачивает» автопилот и не вторгается в его процессы — он встраивается третьим участником MAVLink-сети на UDP 14551, как подменный приёмник, подключённый к телеметрическому каналу. Схема взаимодействия представлена на рисунке 1.
Рисунок 1 — Схема стенда: Engee подменяет GPS-приёмник и подмешивает к позиции аппарата шум; ArduPilot SITL считает автопилот и физику (штатный GPS при этом отключён); MAVProxy передаёт телеметрию и команды; QGroundControl ведёт миссию и показывает сход с маршрута.
2.2. Установка и запуск инфраструктуры стенда
Файлы для развертывания локальной инфраструктуры стенда распространяются в составе демо-файлов подсистемы Engee.Интеграции. Установите подсистему Engee.Интеграции, после чего загрузите демо-файлы с помощью команды:
engee.package.getdemos("Engee-Device-Manager")
Директория, содержащая инфраструктурные файлы стенда будет лежать по пути: /user/Engee-Device-Manager-demos/example_ardupilot
В директории /user/Engee-Device-Manager-demos/example_communication находится рассматриваемая в рамках данной демонстрации модель example_mavlink_gps_noise.engee и docker-окружение стенда: файлы docker-compose.yml и Dockerfile. Окружение является кроссплатформенным: и под Windows (Docker Desktop), и под Linux (Docker Engine). Стенд SITL собирается локально в контейнере и поднимается одной и той же командой. Установку и запуск необходимо произвести в соответствии с инструкцией в файле /user/Engee-Device-Manager-demos/example_ardupilot/ardupilot-sitl/README.md под нужную вам платформу. После успешной установки и запуска SITL можно переходить к запуску модели в Engee.
2.3. Распределение сетевых портов в инфраструктуре стенда
| Порт | Канал | Назначение |
|---|---|---|
| TCP 5760 | SERIAL0 | подключение MAVProxy к автопилоту |
| UDP 14550 | MAVProxy → QGroundControl | станция оператора |
| UDP 14551 | MAVProxy ↔ Engee | телеметрия позиции коптера в модель и GPS-координаты из модели |
| UDP 14552 | MAVProxy → монитор | пассивный наблюдатель, ожидание heartbeat |
Один UDP-порт обслуживает одного потребителя: QGroundControl и тестовые скрипты разнесены по разным выходам MAVProxy, что в противном случае привело бы к конфликтам за сокет.
3. Схема MAVLink-обмена
Обмен между автопилотом и моделью:
| Сообщение | Направление | Используемые поля | Назначение |
|---|---|---|---|
SIMSTATE |
SITL → Engee | lat, lng |
истинная позиция аппарата из физики SITL |
GLOBAL_POSITION_INT |
SITL → Engee | relative_alt, vx, vy, vz |
относительная высота (мм) и скорости (см/с) |
HEARTBEAT |
SITL → Engee | base_mode |
флаг ARMED (бит 128) для логики высоты |
EKF_STATUS_REPORT |
SITL → Engee | flags |
биты готовности EKF (контроль сходимости, взвода моторов) |
GPS_INPUT |
Engee → SITL | lat, lon, alt, vn, ve, vd, fix_type, satellites_visible, hdop и др. |
показания GPS-приёмника с подмешанным шумом |
По данным стрелкам направлений передачи данных видно:
SITL публикует телеметрию через MAVProxy всем участникам; модель читает из этого потока истинное состояние и в ответ шлёт MAVLink-сообщение GPS_INPUT, которое маршрутизируется в автопилот. QGroundControl при этом продолжает видеть штатную телеметрию и управляет полётом как прежде. После включения опций SIM_GPS1_ENABLE = 0 и GPS1_TYPE = 14 у автопилота не остаётся других источников позиции — всё, что приходит в сообщении GPS_INPUT, он принимает за показания настоящего приёмника.
4. Модель Engee: верхний уровень
Рассмотрим теперь модель в Engee. Модель использует блоки пакета поддержки MAVLink в подсистеме Engee.Интеграции для приема и передачи телеметрии с наземной станцией QGroundControl.
Верхний уровень модели состоит из блоков MAVLink Setup, MAVLink RX, MAVLink TX и подсистемы GPS:
| Блок | Тип | Назначение |
|---|---|---|
MAVLINK Setup |
Engee Function | установка соединения, общая для RX и TX |
MAVLINK RX |
Engee Function | приём сообщений: по выходу на каждый тип сообщения и шина «Статус сообщений» |
MAVLINK TX |
Engee Function | передача GPS-координат в MAVLink-сообщении GPS_INPUT |
GPS |
SubSystem | эмулятор GPS-приёмника (см. раздел 5) |
BS_ekf, BW_ekf, ekf_ok |
Bus Selector, Bitwise, Relational | контроль готовности EKF (см. раздел 6) |
Ready |
Engee Function | однократное сообщение о готовности стенда |
Const_sigma, G_sigma_top |
Constant, Gain | регулятор амплитуды шума (см. раздел 6) |
Верхний уровень модели представлен на рисунке 2.
Рисунок 2 — Верхний уровень модели: настройка параметров MAVLink соединения, приём сообщений MAVLink от QGroundControl, контроль состояния EKF, подсистема GPS и передача зашумлённого GPS.
Блок MAVLINK Setup настраивает транспортный уровень протокола:
| Параметр | Значение |
|---|---|
| Транспорт | udp |
| IP | 127.0.0.1 |
| Порт | 14551 |
| Идентификатор отправляющей системы | 255 |
| Идентификатор компонента | 190 |
| Период дискретизации, с | -1 (наследуется) |
MAVLINK RX принимает набор сообщений ["SIMSTATE", "GLOBAL_POSITION_INT", "HEARTBEAT", "EKF_STATUS_REPORT"] — на каждый такой тип сообщения блок формирует свой выход шины. Пятый (последний) выход — шина «Статус сообщений» с булевыми признаками по каждому подписанному типу. Флаг истинен только на том шаге, где пришло истинно новое сообщение данного типа: внутри блока производится расчёт принятых сообщений каждого типа, и флаг сигнализирует о том, что «счётчик изменился с прошлого шага», что является удобным при обработке данных с шины в модели. В подсистеме GPS этот флаг приводит к устойчивому признаку «данные этого типа уже приходили» (раздел 5.2). Шина статуса также выведена на выходной порт модели для контроля обмена. MAVLINK TX передаёт единственный тип: ["GPS_INPUT"]. Оба блока получают соединение от MAVLINK Setup по дескриптору соединения conn.
Соединения верхнего уровня:
RX.SIMSTATE→GPS.in_sim— истинные координаты;RX.GLOBAL_POSITION_INT→GPS.in_gpi— высота и скорости;RX.HEARTBEAT→GPS.in_hb— флаг «взвод моторов»;RX.EKF_STATUS_REPORT→BS_ekf— флаги EKF (контроль готовности, раздел 6);RX.Статус сообщений→GPS.in_stat— импульсные признаки приёма, ими управляются переключатели подсистемы GPS (раздел 5.2);GPS.out_gps→TX.GPS_INPUT— зашумлённые показания приёмника.
5. Подсистема GPS
Подсистема GPS собрана из трёх частей: Noise (генерация шума), PosVel (обработка истинного состояния аппарата) и Assemble (сборка составного MAVLink-сообщения GPS_INPUT).
Рисунок 3 — Подсистема GPS: шум, истинное состояние и сборка выходного MAVLink-сообщения GPS_INPUT.
5.1. Noise: модель шума
Два независимых источника гауссового белого шума (среднее 0, дисперсия 1, период 0.1 с — частота GPS; начальные состояния 1 и 2 для воспроизводимости) умножаются на амплитуду в метрах, после чего переводятся в целочисленный формат координат MAVLink — десятимиллионные доли градуса (degE7):
где
— сдвиги координат в degE7,
— амплитуда шума в метрах.
Масштабные коэффициенты — это обратная величина длины дуги градуса:
- по широте: м коэффициент ;
- по долготе: длина дуги делится на ; для широты площадки CMAC () коэффициент .
Шум добавляется только к горизонтальным координатам — это минимальная «атака», которую EKF переносит устойчиво (см. раздел 10).
5.2. PosVel: истинное состояние аппарата
Подсистема извлекает истинные данные из телеметрии и приводит их к формату сообщения GPS_INPUT. Корректность данных определяется шиной «Статус сообщений» блока MAVLINK RX, поступающей на вход in_stat:
- координаты —
lat,lngизSIMSTATE(Int32, degE7) проходят удержаниеSwLatHold/SwLonHold. Их управление — посредствомsimHold/simMem: флаг «пришло новоеSIMSTATE» с шины статуса (её разбирает селекторBS_stat) служит управляющим сигналом удержанияsimHold; на истинном входе — константаcOneLat(1), на ложном — его же выход через Memory. Пока флаги не приходили, удержание держит ноль и переключатели отдают константы домашней точкиcHomeLat/cHomeLon: , — авиаплощадка, где аппарат стоит на старте; с первым же принятымSIMSTATEудержание устанавливается в единицу. Шум прибавляется сумматорами уже после переключателей. Удержание необходимо, потому что статус — импульсный («в этом шаге пришло новое сообщение»): без неё на шаге без свежих данных переключатель подпрыгивал бы обратно к домашней точке. - флаг «взвод моторов» —
base_mode ≥ 128(MAV_MODE_FLAG_SAFETY_ARMED) изHEARTBEAT, с таким же удержанием на Memory (armedL): аппарат, с однажды взведенными моторами (ARMED), считается летающим до конца работы модели; - высота — относительная высота из
GLOBAL_POSITION_INT(мм → м, коэффициент 0.001) проходит переключательSwRelHoldпо удержанию статусаgpiHold/gpiMem(«приходило новое сообщениеGLOBAL_POSITION_INT»): до готовности — константаcRel0(0 м), после — реальное значение. Далее сумма с высотой площадки (584 м) проходит переключательSwAlt, управляемый флагом «взвод моторов»: на земле вGPS_INPUTуходит ровно 584 м AMSL, в полёте — . Это условие корректной привязки EKF: если на земле слать высоту из оценки AHRS2, возникает петля EKF → AHRS2 → GPS → EKF, из-за которой опорная высота (EKF-origin) и высота поля барометра встают неверно, и аппарат уезжает по высоте на ~585 м; - скорости —
vx,vy,vzизGLOBAL_POSITION_INT(см/с → м/с, коэффициент 0.01).
5.3. Assemble: сборка GPS_INPUT
Блок MAVLINK Select создаёт шину для сообщения GPS_INPUT, с помощью Bus Assignment заполням её поля:
| Поле | Источник | Значение |
|---|---|---|
lat, lon |
PosVel + Noise | зашумлённые координаты, degE7 |
alt |
PosVel | высота над уровнем моря, м |
vn, ve, vd |
PosVel | скорости, м/с |
fix_type |
Constant | 3 — пространственная координация по трем осям |
satellites_visible |
Constant | 12 |
hdop, vdop |
Constant | 1.0, 1.0 |
speed_accuracy |
Constant | 0.5 м/с |
horiz_accuracy |
Constant | 0.3 м |
vert_accuracy |
Constant | 0.4 м |
Заявленные точности у приёмника идеальные — EKF взвешивает измерения по заявленной точности, и с такими значениями зашумлённым координатам доверяют максимально.
6. Контроль готовности EKF и регулятор шума
6.1. Готовность EKF
Участок модели для контроля EKF следит, сходится ли EKF по позиции. Из EKF_STATUS_REPORT выбирается поле flags, побитово умножается на маску 0x210 и сравнивается с нулём:
где бит 0x10 — POS_HORIZ_ABS (абсолютная горизонтальная позиция получена), бит 0x200 — PRED_POS_HORIZ_ABS (позиция предсказуема, можно взводить моторы (ARM)). Пока биты не установлены, взвод моторов в QGroundControl закономерно отклоняется с «Need Position Estimate» — эти проверки не обходятся параметрами, позицию должно дать именно наше сообщение GPS_INPUT.
Единичный выход маски поступает в блок Ready (Engee Function), который однократно печатает сообщение о готовности к запуску:
mutable struct Block <: AbstractCausalComponent
announced::Bool
function Block()
new(false)
end
end
function (c::Block)(t::Real, ekf_ok)
if !c.announced && ekf_ok != 0
c.announced = true
info("[READY] EKF получил GPS и удерживает позицию (flags & 0x210) — можно запускать миссию в QGC. t=$(round(t, digits=1)) с")
end
return nothing
end
Сообщение выводится в окно диагностики Engee однократно — в момент, когда EKF впервые подтверждает позицию по зашумлённому GPS. Например:
[READY] EKF получил GPS и удерживает позицию (flags & 0x210) — можно запускать миссию в QGC. t=6.3 с
Это необходимый рабочий сигнал для оператора дрона: зашумлённый GPS-приёмник принят автопилотом, позиция удерживается — можно переходить в QGroundControl и выполнять миссию полёта. В QGroundControl производится: взвод моторов, задание миссии, взлёт и полёт по миссии. До появления сообщения [READY] попытка взвода моторов в QGroundControl будет отклоняться проверкой «Need Position Estimate».
6.2. Регулятор амплитуды шума
Амплитуда шума задаётся цепочкой Const_sigma (константа) → G_sigma_top (Gain) → вход sigma_m подсистемы GPS. Изменение константы приводит к усилению шума:
0.0— чистый GPS, базовый прогон;5.0— рабочий режим демонстрации: СКО шума 1.5 м по горизонтали.
В интерактивном режиме симуляции коэффициент меняется на работающей модели — шум GPS начинает приходить в полёте, и траектория начинает расходиться с маршрутом на глазах оператора наземной станции.
7. Настройка ArduPilot
Параметры прошивки для сценария задаются файлом mavlink_gps.parm из папки примера; он передаётся автопилоту через флаг --defaults:
| Параметр | Значение | Назначение |
|---|---|---|
GPS1_TYPE |
14 | тип приёмника «MAV»: позиция приходит по MAVLink (GPS_INPUT) |
SIM_GPS1_ENABLE |
0 | штатный GPS SITL выключен |
BARO_FIELD_ELV |
584 | высота поля барометра = высота авиаплощадки CMAC; фиксирует привязку барометра и исключает автоопределение высоты над уровнем моря |
ARMING_CHECK |
0 | проверки взвода моторов отключены для ускорения запуска модели в режиме отладки |
EK3_IMU_MASK |
1 | используется один IMU для ускорения запуска модели в режиме отладки |
Файл mavlink_gps.parm:
GPS1_TYPE 14
SIM_GPS1_ENABLE 0
BARO_FIELD_ELV 584
ARMING_CHECK 0
EK3_IMU_MASK 1
8. Сценарий демонстрации и результаты
8.1. Порядок проведения
-
Установите и запустите подсистему Engee.Интеграции, подключитесь к Engee из неё.
-
Установите и запустите наземную станцию, например, QGroundControl или Mission Planner.
-
С помощью вспомогательных Docker-файлов из
engee.package.getdemos("Engee-Device-Manager")(директория ardupilot-sitl) установите и запустите по приведенной в ней инструкции сборку ArduPilot в Docker-контейнере. Запустите контейнер с помощью командыdocker-compose up -d. -
Из директории с установленными примерами (см. п.2)
/user/Engee-Device-Manager-demos/example_communicationзапустите модельexample_mavlink_gps_noise.engeeв Engee. -
После получения сообщения
[READY]от EKF в окне диагностики Engee (после запуска модели Engee) в наземной станции, например, QGroundControl, выполните (Takeoff → Waypoints → …) — задание миссии. После чего нужно нажать кнопку Start Mission. Весь полёт ведёт станция, аппарат начинает идти по маршруту на чистом GPS от модели, без шума. -
В работающей модели поднимается коэффициент
G_sigma_top(например, до 5.0 м) — зашумление начинает срабатывать в полёте. -
Наблюдаем в QGroundControl: трек на карте начинает расходиться с линией миссии; автопилот продолжает честно дорабатывать миссию, но строит управление по зашумлённой позиции.
Представим результат работы стенда на записи 1.:
Запись 1 — Аппарат ведёт миссию, GPS начинает приходить с шумом, траектория расходится с маршрутом (вид в QGroundControl).
Параметры симуляции: решатель с фиксированным шагом (метод Эйлера), шаг 0.1 с — синхронно с частотой GPS_INPUT, время остановки 300 с — с запасом на проведение полноценных взлёта и миссии.
9. Сетевые требования: джиттер сетевого канала
Модель работает в Engee, телеметрия SITL поступает через цепочку SITL → MAVProxy → Engee.Интеграции→ Engee. Каждое MAVLink-сообщение проходит этот путь в обе стороны, поэтому стабильность сетевого канала — критичное условие для корректной работы стенда.
Почему джиттер важен
Модель опрашивает телеметрию каждые 100 мс (частота GPS_INPUT). Если сетевая задержка превышает этот интервал, Engee получает пустой поток, и блок MAVLink RX обнуляет все значения шины. Обнулённые координаты проходят в GPS_INPUT как позиция (0, 0) — для автопилота это «GPS Glitch», а для EKF — скачок инноваций, который может привести к EKF variance: over thresholds и срыву миссии.
Допустимые значения
| Метрика | Допустимо | Критично |
|---|---|---|
| RTT средний (avg) | < 50 мс | > 80 мс |
| RTT mdev (джиттер) | < 15 мс | > 30 мс |
| RTT max | < 100 мс | > 150 мс |
| Потери пакетов | 0% | > 0% |
При mdev < 15 мс разброс задержки редко превышает интервал опроса модели (100 мс), и пустые снапшоты практически не возникают.
Как измерить
Перед запуском модели проверьте стабильность сетевого канала, например:
ping -c 10 -i 0.3 engee.com
В выводе смотрите значение mdev (стандартное отклонение RTT) и max. Если mdev > 15 или max > 100 — канал нестабилен, для запуска модели необходим более устойчивый канал связи. Самый наглядный признак проблемы: дрон на карте QGroundControl телепортируется в точку 0°N, 0°E (Гвинейский залив). Это значит, что модель передала автопилоту нулевые координаты — так блок MAVLink RX обнуляет шину при пустом снапшоте. Для продвинутой диагностики можно открыть в QGC меню Analyze Tools → MAVLink Inspector и найти сообщение GPS_RAW_INT: при fix_type = 3 поле lat будет равно 0 вместо ожидаемых -35.363261°. После восстановления канала координаты возвращаются к домашней точке.
10. Модель шума и практические наблюдения
Модель шума — самое тонкое место стенда; выводы ниже подтверждены в модели Engee.
- Переключение по статусу, а не по данным. Признаком достоверности координат служит шина «Статус сообщений» блока
MAVLINK RX. У флага простая импульсная семантика — «в этом шаге пришло новое сообщение данного типа» (изменился внутренний счётчик сообщений), поэтому он удерживается парой «Hold + Memory» в устойчивый признак «данные уже приходили»: до первогоSIMSTATEудерживается домашняя точка, после — всегда живые данные. - Умеренный белый шум переносится спокойно. Гауссов шум с – м на частоте 10 Гц даёт дрожание оценки вокруг истинной точки: среднее совпадает, производная оценки конечна, EKF не видит противоречий.
- Чисто белый шум большой амплитуды опасен. Скачки позиции при честной скорости создают фиктивную скорость перемещения: EKF реагирует ростом дисперсии, ловит «glitch», в полёте возможны смена источника навигации (lane switch) и отказ по расходимости с оценкой EKF.
- Заявленная точность — часть процесса подмены. EKF взвешивает измерения по
hdopи полямaccuracy; «приёмник» с идеальными точностями заставляет фильтр доверять зашумленным координатам максимально. - Высота на земле — константа 584 м. Пока аппарат не взведет моторы, только фиксированная высота площадки гарантирует корректную привязку EKF-origin и высоты поля барометра; любые «умные» оценки высоты на этом этапе приводят к уводу аппарата вверх на сотни метров после взлёта.
- Воспроизводимость. Фиксированные начальные состояния генераторов (1 и 2) дают одинаковый шум в каждом запуске — эксперименты с разными сравнимы между собой.
Заключение
Стенд демонстрирует, как выглядит для автопилота подмена GPS: сообщение GPS_INPUT приходит по каналу телеметрии, с корректными полями и «идеальными» точностями — единственный источник позиции, которому доверяет EKF, лжёт на заданную величину , и аппарат послушно уводится с маршрута.
ArduPilot при этом работает в привычной для себя конфигурации SITL в Docker-контейнере, а Engee встраивается в MAVLink-обмен как полноправный участник сети. Та же инфраструктура поддерживает и второй сценарий — косимуляцию: в режиме расчёта физики в поставляемой конфигурации инфраструктуры заложен демо-сценарий, когда расчёт физики аппарата считает модель квадрокоптера в Engee (обмен PWM и состоянием через JSON по UDP), автопилот летит на основе физике, рассчитанной Engee, а роль GPS исполняет прямой SITL-бэкенд (GPS1_TYPE = 100). Совмещение обоих сценариев — подмена GPS поверх физики Engee — естественный следующий шаг: отказы навигации можно исследовать при полностью управляемой динамике аппарата.