Сначала докажите три вещи: сенсор выдаёт изменяющийся поток, дальномер даёт правдоподобную высоту, а EKF получил корректные источники и origin. Если хотя бы одно звено не подтверждено, Loiter/PosHold и переключение GPS ↔ Optical Flow проверять рано.
Симптом: Optical Flow подключён, но в Mission Planner нет полезных значений opt_m_x/opt_m_y, качество opt_qua скачет, аппарат дрейфует в Loiter или появляется PreArm: Need Position Estimate. В этой статье разбираем диагностику от сенсора до EKF и только после этого переходим к переключению источников.

Optical Flow не сообщает автопилоту готовую глобальную координату. Сенсор оценивает видимое угловое движение поверхности, а дальномер даёт расстояние до неё. EKF использует эту пару, чтобы оценить горизонтальную скорость и положение относительно исходной точки. Поэтому «сенсор виден в порту» и «в поле Status меняются числа» ещё не означают, что ArduPilot сможет удерживать позицию.
Практическая цепочка выглядит так: порт и протокол → поток и качество → дальномер и высота → ориентация осей → EKF origin и источники → короткий безопасный тест. Если перепрыгнуть через первые звенья, настройка PID или повторная калибровка только замаскируют причину.
Как читать результат. Это не автоматический диагноз, а порядок проверки. Один и тот же дрейф может быть вызван поверхностью, ориентацией, дальномером, EKF origin или конфигурацией источников. Если на любом шаге появляется опасное поведение, прекращай испытание и возвращайся к механике и логу.
opt_m_x, opt_m_y и opt_qua.RNGFNDx_MIN_CM.RCx_OPTION=158. Это не повод крутить параметр наугад: сначала сними пропеллеры, назначь канал, выполни процедуру из документации и повтори исходный тест в тех же условиях.Нормальный ноль и неисправный ноль. Когда сенсор и поверхность неподвижны относительно друг друга, opt_m_x и opt_m_y могут быть близки к нулю. Неисправность подозревай тогда, когда при контролируемом перемещении над пригодной поверхностью поля не реагируют, качество постоянно равно нулю или сенсор исчезает из Status.
Для GPS-less схемы нужно проверить не только сенсор, но и всю оценку. В типовом примере официальной документации для Optical Flow используются EK3_SRC1_POSXY=0 и EK3_SRC1_VELXY=5; источник высоты выбирается отдельно. Эти значения являются частью конкретной схемы, а не универсальным пресетом для любого аппарата.
В Mission Planner нужно задать EKF origin через Set EKF Origin Here. Это не то же самое, что просто задать Home. Origin является начальной точкой, относительно которой EKF ведёт расчёт, и без неё аппарат может не получить пригодную позиционную оценку для Loiter или PosHold.
После задания origin проверь на карте и в логе, что оценка появилась, затем сравни состояние EKF, дальность и поток. Если PreArm исчезает только после подключения GPS, это показывает, что GPS временно дал автопилоту нужную оценку, но не доказывает, что Optical Flow исправен.
Ошибочная ориентация часто выглядит убедительно: поля Status меняются, но аппарат компенсирует движение не в ту сторону. Для направленного вниз дальномера параметр ориентации обычно должен соответствовать вниз направленному монтажу, например RNGFNDx_ORIENT=25 для поддерживаемой схемы. Всегда сверяй значение с документацией конкретного дальномера и его физическим креплением.
В DataFlash-логе сравнивай сообщения Optical Flow и IMU на одном временном участке: OF.flowX, OF.flowY, OF.bodyX, OF.bodyY и соответствующие поля IMU.GyrX/IMU.GyrY. На разных версиях и типах автопилота состав полей может отличаться, поэтому сначала открой список сообщений своей версии. Наличие красивого графика не заменяет проверку правильного знака, оси и физической ориентации.
EKF3 поддерживает несколько наборов источников. Но безопасное переключение означает не «переключить одну строку», а заранее настроить полный набор входов: позицию, скорость, высоту и курс. Для переключения наборов через канал используется RCx_OPTION=90, если эта опция доступна для конкретной версии и платы.
Сначала проверь каждый набор отдельно на земле со снятыми пропеллерами. При переходе на Optical Flow должны быть валидны поток и дальномер, а при переходе на GPS должен быть валиден GPS и не должно быть активной ошибки EKF. Отдельно сверяй EK3_SRC_OPTIONS и официальную страницу о GPS / Non-GPS transitions: поведение зависит от того, какие источники выбраны в наборах и как прошивка оценивает их здоровье.
В свежем обсуждении с MTF-01 автор описывает дрейф сразу после армирования при почти неподвижном аппарате, несмотря на попытки менять EK3_FLOW_M_NSE и EK3_FLOW_I_GATE. Это полезный symptom-first пример: до изменения параметров нужно проверить поток, высоту, ориентацию, heading, вибрации и переходы состояния именно в логе. Обсуждение на ArduPilot Discourse.
В кейсе с сообщением PreArm: Need Position Estimate поток и дальномер отображались, но автор сначала не мог включить Loiter/PosHold. В ответах отдельно обсуждались Set EKF Origin Here, действительный диапазон дальномера и то, что подключение GPS лишь временно убирало pre-arm. Это хороший пример того, почему «сенсор читается» и «EKF построил позицию» нужно проверять раздельно. Кейс с PreArm на Discourse.
В старой, но показательной ветке разработчик связал проблему с тем, что дальномер показывал около 0,13 м при RNGFND1_MIN_CM=30; после корректировки диапазона автор сообщил, что HereFlow заработал плавно. Это не универсальное значение для всех датчиков: смысл примера в проверке фактической высоты против MIN/MAX. Кейс с HereFlow и Loiter на Discourse.
В обсуждении GPS и Optical Flow автор наблюдал сильный дрейф в помещении при плохом GPS, хотя HDOP выглядел приемлемо, а с одним Optical Flow аппарат держался лучше. Такой опыт нельзя превращать в обещание автоматического fallback: нужно смотреть здоровье GPS, активный набор EKF, инновации и фактические сообщения лога. Обсуждение GPS и Optical Flow на Discourse.
Optical Flow оценивает относительное движение текстуры под камерой. Сам сенсор не знает глобальную координату и не заменяет GPS: для оценки скорости EKF нужны видимый рисунок поверхности и расстояние до неё. Без внешней привязки небольшая ошибка со временем превращается в дрейф.
Практический вывод: Optical Flow полезен в помещении, под навесом или как неглобальный источник скорости, но не обещает удержание над любой поверхностью и не является самостоятельной заменой навигации на большой высоте.
Сначала сохрани исходные параметры. Ниже не пресет «для всех», а карта того, что нужно сверить с драйвером сенсора, его паспортом и версией ArduPilot 4.6/4.7.
| Параметр | Что проверять |
|---|---|
FLOW_TYPE |
Тип интерфейса/драйвера именно твоего сенсора. Значение выбирается по официальной странице устройства, а не по названию разъёма. |
FLOW_POS_X/Y/Z |
Измеренное положение сенсора относительно опорной точки IMU, в метрах. Не подставляй «0.1» без измерения. |
FLOW_ORIENT_YAW |
Физическая ориентация платы. При неверном знаке сначала исправляют монтаж и ориентацию, а не PID. |
FLOW_OPTIONS |
Для стабилизированного подвеса проверь bit 1 по документации ArduPilot и производителя. |
FLOW_FXSCALER, FLOW_FYSCALER |
Результаты калибровки по осям X и Y. Не меняй их «для устранения дрейфа», пока не проверены сцена, дальномер и оси. |
EK3_FLOW_DELAY |
Задержка конкретного сенсора; оставляй значение из его документации или подтверждённого лога. |
RNGFNDx_MIN_CM/MAX_CM |
Фактический диапазон дальномера. При значении вне диапазона EKF теряет масштаб Optical Flow. |
Для типовой GPS-less проверки после исправного Status, дальномера и EKF origin официальная схема выглядит так:
EK3_SRC1_POSXY = 0 # None
EK3_SRC1_VELXY = 5 # Optical Flow
EK3_SRC1_POSZ = 1 # Barometer
EK3_SRC1_VELZ = 0 # None
EK3_SRC1_YAW = 1 # Compass
EK3_SRC_OPTIONS = 0
Inflight-калибровка подходит, когда есть валидный GPS и аппарат уже безопасно держится на нём. Нужны открытая зона, текстурированная поверхность, стабильный свет и высота не ниже примерно 10 м, но в пределах фактического диапазона дальномера.
RCx_OPTION=158 и проверь, что переключатель не активирует другую функцию.EK3_SRC1_POSXY=3, EK3_SRC1_VELXY=3, EK3_SRC1_POSZ=1, EK3_SRC1_VELZ=3, EK3_SRC1_YAW=1, EK3_SRC_OPTIONS=0.FlowCal, прогрессом и значениями fit: меньшая ошибка лучше.Log-based вариант: сними пропеллеры, при необходимости включи LOG_DISARMED=1, удерживай сенсор над пригодной поверхностью и выполняй контролируемые повороты по Roll и Pitch. В логе сравни OF.flowX/flowY, OF.bodyX/bodyY и IMU.GyrX/GyrY на одном временном участке. Противоположный знак или перепутанная ось сначала указывают на монтаж и FLOW_ORIENT_YAW, а не на необходимость «подкрутить» коэффициент.
FlowHold удерживает аппарат по Optical Flow без GPS и без направленного вниз лидара. При этом ArduPilot предупреждает, что на многих аппаратах режим может дать раскачку и нестабильное удержание; если есть исправный дальномер, обычный Loiter обычно предпочтительнее.
FHLD_BRAKE_RATE — желаемое торможение после отпускания стиков.FHLD_FILT_HZ — фильтр данных Optical Flow.FHLD_FLOW_MAX — максимальная скорость потока, учитываемая при остановке.FHLD_QUAL_MIN — минимальное качество; ниже порога FlowHold ведёт себя как AltHold.FHLD_XY_P, FHLD_XY_I, FHLD_XY_IMAX, FHLD_XY_FILT_HZ — параметры контура остановки по горизонтали.Не используй FlowHold как первый тест сенсора. Сначала докажи поток, дальность, ориентацию, EKF origin и ручное восстановление в Stabilize/AltHold. Для первого включения оставь вокруг аппарата свободное пространство и держи переключатель ручного режима под пальцем.
Сноска 1. Значения параметров, названия полей лога и доступные функции могут различаться между ArduPilot 4.6/4.7, типами автопилотов и драйверами сенсоров. Перед изменением параметров сверяй официальную документацию для своей версии и сохраняй исходный файл параметров.
Сноска 2. Советы из Discourse — это разборы конкретных конфигураций, а не универсальные рецепты. Число вроде RNGFND1_MIN_CM=10 или 30 нельзя переносить на другой дальномер без проверки его паспорта, фактической высоты и диапазона измерения.
Материал проверен 21 августа 2026 года. Ссылки на официальную документацию и обсуждения открыты перед публикацией.