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