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

EXTNAV — почему выбран

EK3_SRC1_POSXY управляет тем, откуда EKF берёт NE-позицию. Значения:

Значение Источник Применимо у нас?
0 None Нет (тогда AID_NONE)
1 OpticalFlow Нет (нет камеры)
3 GPS Нет (нет GPS на борту в полёте)
4 Beacon Не применимо — нет наземных маяков
6 ExternalNav Наш выбор
7 WheelEncoder Нет (не самокат)

Остаётся два кандидата для GPS-denied операций: 4 (Beacon) и 6 (ExternalNav). Они работают принципиально по-разному.

EXTNAV vs BEACON — таблица

EXTNAV (6) BEACON (4)
Физический канал MAVLink: VISION_POSITION_ESTIMATE, ODOMETRY, setLatLng (CMD 43003) Range-fusion от наземных маяков
Кто публикует Наземный оператор / внешняя нав-система / VIO Маяки Marvelmind, Pozyx и подобные
Тип данных NE-позиция, опционально velocity, опционально yaw Дистанции от нескольких точек с известными координатами
Параметры VISO_*, EK3_VIS_VERR_* BCN_*, RNGBCN_*, EK3_BCN_*
Compile flag EK3_FEATURE_EXTERNAL_NAV EK3_FEATURE_BEACON_FUSION
Применимость в нашем сценарии CMD 43003 идёт сюда Не подходит — нет range-данных

Почему именно EXTNAV для CMD 43003

Все кастомные патчи прошивки гейтятся на источник через единообразный код:

// libraries/AP_NavEKF3/AP_NavEKF3_PosVelFusion.cpp:212-214
if (posxy_source == AP_NavEKF_Source::SourceXY::EXTNAV ||
    posxy_source == AP_NavEKF_Source::SourceXY::BEACON) {
    return applyExtNavSoftCorrection(loc, posAccuracy, timestamp_ms);
}

В коде эти два значения трактуются одинаково (обоих покрывает init-bypass из 23351a4 и Zholobov latch из d04f9d1). Но активный backend выбирается параметром: BEACON=4 без подключённых маяков просто не получит данных, и CMD 43003 будет работать вхолостую.

⇒ Для CMD 43003 как канала только EXTNAV (6).

Полный набор источников

EK3_SRC1_POSXY = 6      # ExtNav
EK3_SRC1_VELXY = 0      # None (CMD 43003 — только позиция, не скорость)
EK3_SRC1_VELZ  = 0      # None
EK3_SRC1_POSZ  = 1      # Baro
EK3_SRC1_YAW   = 1      # Compass

Почему VELXY = 0 (None), а не 6 (EXTNAV): твой канал CMD 43003 несёт только координаты. Если поставить 6, EKF будет ждать velocity-данных от ExtNav и таймаутить их — это испортит логику фьюжена. None — это явное сообщение фильтру: «скорость от внешнего источника не приходит, выводи из IMU + airspeed».