Перейти к содержанию

Сводка изменений vs 4.5

Краткий обзор для тех, кто помнит старую прошивку. Подробности — в соответствующих разделах.

Терминология

GpsInject = MAVLink-сообщение GPS_INPUT (msg id 232) от наземной системы. Драйвер AP_GPS_MAV (GPS_TYPE=14) принимает его и публикует в EKF как обычный GPS-fix. Физического GPS-приёмника на борту никогда не было.

CMD 43003 = MAV_CMD_EXTERNAL_POSITION_ESTIMATE — стандартная upstream MAVLink-команда (в ArduPilot с 4.5.0-beta1), формат COMMAND_INT. В 4.5 уже была в прошивке, но мы её не использовали. Теперь — основной канал коррекций.

EKF origin — внутренняя точка отсчёта EKF. Фильтр хранит позицию борта в метрах North/East относительно этой точки, не в широте/долготе. До того как origin установлен, EKF в принципе не может выдать глобальные координаты. Подробнее: tech/architecture/origin.

За одну страницу

4.5                                  →   4.6.3 V1.2.0

EK3_SRC1_POSXY = 3 (GPS)            →   EK3_SRC1_POSXY = 6 (ExtNav)
EK3_SRC1_VELXY = 3 (GPS)            →   EK3_SRC1_VELXY = 0 (None)
EK3_SRC1_VELZ  = 3 (GPS)            →   EK3_SRC1_VELZ  = 0 (None)
AHRS_OPTIONS   = 0                  →   AHRS_OPTIONS   = 32 (DisableDCMFallbackFW)
EK3_WIND_P_NSE = 0.1                →   EK3_WIND_P_NSE = 0.05
                                        + новый параметр EK3_EXTNAV_DRIFT = 1.0
AHRS_WND_ENBL/SPD/DIR — активны     →   деактивируем (DCM fallback off)

Канал коррекций позиции (что наземка реально шлёт):
  было:    GpsInject — MAVLink GPS_INPUT через GPS_TYPE=14 (MAV-driver)
  стало:   CMD 43003 — MAV_CMD_EXTERNAL_POSITION_ESTIMATE напрямую в setLatLng

Origin EKF (точка отсчёта координат внутри EKF):
  было:    прошивка сама записывает координату при первом GpsInject-fix
           (через стандартную auto-set-origin логику GPS-драйвера)
  стало:   оператор присылает координату командой SET_GPS_GLOBAL_ORIGIN
           один раз за сессию, до первой CMD 43003

Реакция EKF на коррекцию позиции:
  было:    жёсткий ResetPositionNE каждый раз при поступлении GpsInject
  стало:   первая коррекция — snap (на земле, безопасно);
           следующие — soft-correction через Zholobov latch

EKF init без коррекций:
  было:    требует GPS 3D-fix (которым в нашем случае был GpsInject)
  стало:   пропускает GPS check при EK3_SRC1_POSXY=6

Почему перешли с GpsInject на CMD 43003

Кастомный soft-correction патч (Zholobov latch) живёт только в функции NavEKF3_core::setLatLng(). Если данные приходят через GPS_INPUTAP_GPS_MAV → стандартная GPS-fusion ветка EKF, то наш латч не на этом пути кода. Каждая коррекция вызывала бы обычный snap (или отбрасывалась guard'ом при healthy aiding), и весь смысл «мягкой коррекции на высокой скорости» терялся.

Чтобы использовать soft-correction, нужно подавать коррекции в EKF через путь setLatLng(). Единственный стандартный способ это сделать — MAV_CMD_EXTERNAL_POSITION_ESTIMATE (CMD 43003). Поэтому переход на CMD 43003 не «обновление формата», а архитектурно вынужденное решение, без которого все остальные патчи бесполезны.

По разделам

Источники EKF

Подробно: tech/params/delta

EKF теперь работает на ExternalNav вместо GPS. Это значит:

  • Координаты приходят только через CMD 43003 (или через VISION_POSITION_ESTIMATE — у нас не используется).
  • Скоростей от внешнего источника нет — раньше они приходили в GPS_INPUT вместе с позицией; CMD 43003 несёт только координаты. EKF вычисляет скорость из IMU + airspeed.
  • Высота — от барометра (как и раньше).
  • Pitot работал и в 4.5, и сейчас — но сейчас он критичен, потому что других velocity-обзёрваций у EKF нет.

Кастомные патчи

В прошивке семь load-bearing коммитов поверх стока 4.6.3:

Коммит Что делает
8702e23 Параметры AHRS_WND_* (мёртвый код при нашей конфигурации)
23351a4 EKF init не требует GPS 3D-fix при SRC1_POSXY ∈ {4, 6}
5257387 Снят guard на setLatLng для CMD 43003
d04f9d1 Zholobov latch — soft-correction на повторных CMD 43003
5913765 V1.2.0 baseline: восстановлен AID_NONE guard для НЕ-ExtNav источников
46c32e6 FAKE airspeed backend (bench-only, на полётной прошивке выключен)
02ea64f extra-hwdef для bench-сборки

Подробно: appendix/e-code

Процедура взлёта

Главное операционное отличие. Раньше:

наземка стартует поток GpsInject → EKF получает первый «GPS-fix»
  → origin устанавливается автоматически → arm → взлёт

Теперь (Вариант B):

1. Boot
2. SET_GPS_GLOBAL_ORIGIN (один раз за сессию)
3. Первая CMD 43003 (snap на земле, безопасно)
4. arm
5. Взлёт
6. В полёте: следующие CMD 43003 — soft-correction

Подробно: pilot/takeoff

Ветер

Параметры AHRS_WND_ENBL/SPD/DIR больше не нужны: они пишут в DCM, а DCM fallback мы запрещаем через AHRS_OPTIONS=32. EKF учит ветер сам из airspeed.

Подробно: common/wind

DCM fallback

Раньше при «нездоровом» EKF AHRS молча переключался на DCM. Теперь это запрещено битом 0 AHRS_OPTIONS: если EKF упадёт, AHRS останется на EKF (с предупреждением). Это страховка от ситуации «полёт навигируется DCM dead-reckoning'ом без ExtNav».

Что не изменилось

  • Барометр для высоты — как и был.
  • Три компаса — те же.
  • TECS / L1 — те же.
  • ARMING_CHECK битмаска у тебя в 4.5 уже подготовлена (бит GPS lock выключен).
  • IMU, RC, серво — без изменений.