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

Запрещённые комбинации

Комбинации параметров, которые приводят к молчаливому отказу EKF, опасному поведению или к тому что прошивка работает как сток (все кастомные патчи молчат).

1. EK3_SRC1_POSXY = 3 (GPS) + любая попытка использовать CMD 43003

Симптом: CMD 43003 проходит через setLatLng, но попадает в legacy hard-snap путь, защищённый AID_NONE guard'ом. Если EKF в AID_ABSOLUTE на GPS — коррекция отвергается. Если EKF в AID_NONE — коррекция вызовет жёсткий step, без soft-correction.

Эффект: Прошивка ведёт себя как обычная 4.6.3. Все кастомные патчи (Zholobov latch, init-bypass) молчат.

Решение: EK3_SRC1_POSXY = 6.

2. EK3_SRC1_POSXY = 6 + GPS подключён физически

Не запрещено, но бессмысленно. EKF не будет использовать GPS-данные для XY-позиции. Если GPS физически на борту — он будет тратить такты на чтение, но в фьюжен не пойдёт.

Что делать:

  • Если GPS не нужен — GPS_TYPE = 0 (тогда и pre-arm не будет ругаться на отсутствие fix).
  • Если GPS на борту как fallback на будущее — оставить GPS_TYPE = 1, EKF просто проигнорирует.

3. EK3_SRC1_VELXY = 6 (EXTNAV) при использовании CMD 43003

CMD 43003 шлёт только позицию, не скорость. Если поставить VELXY = 6, EKF ждёт velocity-данные от ExtNav, не получает, timeout'ит и идёт на VEL-fault.

Решение: EK3_SRC1_VELXY = 0 (None) — явно сообщить «скорость не приходит, вычисляй из IMU+airspeed».

4. AHRS_OPTIONS бит 0 = 0 (DCM fallback включён) + EK3_SRC1_POSXY = 6

Симптом: Если EKF в полёте станет «нездоровым» (healthy() = false), AHRS молча переключится на DCM. DCM не знает про ExtNav — он будет dead-reckoning'ить по airspeed + heading. ExtNav-коррекции не повлияют на DCM-позицию. Возможен «полёт куда-нибудь не туда».

Решение: AHRS_OPTIONS = 32 (бит 0 включён, DCM fallback запрещён). Лучше получить failsafe-сообщение, чем тихий переход в DCM.

5. EK3_EXTNAV_DRIFT = 0

Параметр имеет range 0.1 .. 5.0, но AP_Param set иногда позволяет записать 0. При нулевом значении:

R_floor = (time_since_last_correction) × 0 = 0
R_OBS = MAX(pos_err, 0)² = sq(pos_err)

То есть R_OBS будет полностью определяться pos_err от ExtNav (минимум _gpsHorizPosNoise). На длинном coast'е это даст слишком узкий R → большой Kalman gain → почти hard-snap. Эффект Zholobov latch практически нивелируется.

Решение: держать EK3_EXTNAV_DRIFT ∈ [0.3, 2.0]. Default 1.0 безопасен.

6. ARMING_CHECK бит 3 (GPS lock) = 1 при EK3_SRC1_POSXY = 6

Симптом: pre-arm не пройдёт — будет требовать GPS 3D-fix, который у нас нет.

Решение: убедиться что в ARMING_CHECK бит 3 выключен. В твоём 4.5-baseline 771810 = 0b10111100011000010 — бит 3 уже отключён. Проверить после миграции на 4.6.3.

7. EK3_PRIMARY ≠ 0 без понимания multi-core

Прошивка может запускать несколько cores EKF3 (EK3_IMU_MASK определяет какие IMU использует каждый core). Если EK3_PRIMARY = 1, выбран core 1 как основной. На нашей конфигурации EK3_IMU_MASK = 3 (cores 0 и 1), EK3_PRIMARY = 0 (core 0).

Менять EK3_PRIMARY имеет смысл только при отладке affinity / lane reset. В нормальной работе — оставить как есть.

8. SCR_ENABLE = 0 при наличии Lua-скриптов проекта

Если в ANDR_* / BOOST_* / S_* параметрах содержится логика для Lua-скриптов (мы видели в 4.5 baseline что они активны), и SCR_ENABLE = 0 — скрипты не загрузятся, параметры станут мёртвым кодом, поведение борта изменится. Проверить после миграции.

9. AHRS_EKF_TYPE ≠ 3

Только EKF3 поддерживает кастомные патчи прошивки. EKF2 не имеет ни init-bypass, ни Zholobov latch. DCM не имеет вообще никаких ExtNav-механизмов.

Решение: AHRS_EKF_TYPE = 3 обязательно. В нашем baseline стоит.