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

Что именно должен доказать Optical Flow
Optical Flow не сообщает автопилоту готовую глобальную координату. Сенсор оценивает видимое угловое движение поверхности, а дальномер даёт расстояние до неё. EKF использует эту пару, чтобы оценить горизонтальную скорость и положение относительно исходной точки. Поэтому «сенсор виден в порту» и «в поле Status меняются числа» ещё не означают, что ArduPilot сможет удерживать позицию.
Практическая цепочка выглядит так: порт и протокол → поток и качество → дальномер и высота → ориентация осей → EKF origin и источники → короткий безопасный тест. Если перепрыгнуть через первые звенья, настройка PID или повторная калибровка только замаскируют причину.
Быстрая диагностика по симптому
Как читать результат. Это не автоматический диагноз, а порядок проверки. Один и тот же дрейф может быть вызван поверхностью, ориентацией, дальномером, EKF origin или конфигурацией источников. Если на любом шаге появляется опасное поведение, прекращай испытание и возвращайся к механике и логу.
Проверка сенсора в Mission Planner
- Открой Status. На неподвижном аппарате значения потока могут быть близки к нулю. Для проверки перемести сенсор или аппарат без пропеллеров над подходящей поверхностью и посмотри, меняются ли
opt_m_x,opt_m_yиopt_qua. - Проверь дальномер. Оптический поток даёт угловое движение, а дальность нужна для оценки линейной скорости. Перед взлётом дальномер должен выдавать правдоподобную высоту внутри своего диапазона, а не ноль, обрыв или значение ниже
RNGFNDx_MIN_CM. - Проверь поверхность. Матовая текстурированная поверхность обычно подходит лучше, чем однотонный пол, стекло, вода, зеркальная плитка или повторяющийся рисунок. Сравни результат при другом освещении и на нескольких высотах.
- Проверь калибровку. Официальная процедура использует переключатель с
RCx_OPTION=158. Это не повод крутить параметр наугад: сначала сними пропеллеры, назначь канал, выполни процедуру из документации и повтори исходный тест в тех же условиях.
Нормальный ноль и неисправный ноль. Когда сенсор и поверхность неподвижны относительно друг друга, opt_m_x и opt_m_y могут быть близки к нулю. Неисправность подозревай тогда, когда при контролируемом перемещении над пригодной поверхностью поля не реагируют, качество постоянно равно нулю или сенсор исчезает из Status.
Почему «данные есть» не равно «Loiter будет держать»
Для 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. На разных версиях и типах автопилота состав полей может отличаться, поэтому сначала открой список сообщений своей версии. Наличие красивого графика не заменяет проверку правильного знака, оси и физической ориентации.
GPS и Optical Flow: как не сломать переключение
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
Optical Flow оценивает относительное движение текстуры под камерой. Сам сенсор не знает глобальную координату и не заменяет GPS: для оценки скорости EKF нужны видимый рисунок поверхности и расстояние до неё. Без внешней привязки небольшая ошибка со временем превращается в дрейф.
- Нужна текстура: матовая трава, бетон с рисунком или асфальт дают больше устойчивых признаков, чем вода, снег, стекло и однотонная поверхность.
- Нужен свет: тень, блики и темнота срывают качество; рабочий диапазон ИК-подсветки зависит от конкретного модуля.
- Нужна правильная высота: слишком низко сенсор не видит достаточного смещения, слишком высоко теряет детали или выходит за диапазон дальномера.
- Нужна геометрия: оси, ориентация и положение относительно IMU должны соответствовать физическому монтажу.
Практический вывод: Optical Flow полезен в помещении, под навесом или как неглобальный источник скорости, но не обещает удержание над любой поверхностью и не является самостоятельной заменой навигации на большой высоте.
Базовые параметры и типовая схема EKF
Сначала сохрани исходные параметры. Ниже не пресет «для всех», а карта того, что нужно сверить с драйвером сенсора, его паспортом и версией 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
Калибровка Optical Flow
Inflight-калибровка подходит, когда есть валидный GPS и аппарат уже безопасно держится на нём. Нужны открытая зона, текстурированная поверхность, стабильный свет и высота не ниже примерно 10 м, но в пределах фактического диапазона дальномера.
- Назначь на свободный AUX-канал
RCx_OPTION=158и проверь, что переключатель не активирует другую функцию. - На время калибровки оставь EKF на GPS:
EK3_SRC1_POSXY=3,EK3_SRC1_VELXY=3,EK3_SRC1_POSZ=1,EK3_SRC1_VELZ=3,EK3_SRC1_YAW=1,EK3_SRC_OPTIONS=0. - Выполни взлёт в Loiter, включи калибровку AUX и плавно покачивай Roll и Pitch по процедуре ArduPilot. Следи за сообщениями
FlowCal, прогрессом и значениямиfit: меньшая ошибка лучше. - После сообщения о завершении посади аппарат, сохрани параметры и верни выбранный набор источников Optical Flow. Не редактируй scalers вручную по одному неудачному полёту.
Log-based вариант: сними пропеллеры, при необходимости включи LOG_DISARMED=1, удерживай сенсор над пригодной поверхностью и выполняй контролируемые повороты по Roll и Pitch. В логе сравни OF.flowX/flowY, OF.bodyX/bodyY и IMU.GyrX/GyrY на одном временном участке. Противоположный знак или перепутанная ось сначала указывают на монтаж и FLOW_ORIENT_YAW, а не на необходимость «подкрутить» коэффициент.
FlowHold: когда использовать и что настраивать
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. Для первого включения оставь вокруг аппарата свободное пространство и держи переключатель ручного режима под пальцем.
Короткий порядок перед первым полётом
- Пропеллеры сняты, параметры сохранены, версия ArduPilot и модель платы записаны.
- Сенсор виден в Status и реагирует на движение над подходящей поверхностью.
- Дальномер показывает действительную высоту до запуска моторов.
- Ориентация Optical Flow, IMU и дальномера соответствует физическому монтажу.
- EKF origin задан, активный набор источников проверен, а pre-arm не скрывается подключением случайного GPS.
- Первый тест выполнен в ручном или Stabilize-режиме на открытом месте; лог сохранён сразу после посадки.
Источники и связанные материалы
- ArduPilot: Optical Flow Sensor Testing and Setup — проверка Status, калибровка, EKF и log-based calibration.
- ArduPilot: EKF Source Selection and Switching — наборы EKF и их переключение.
- ArduPilot: GPS / Non-GPS Transitions — переходы между GPS и неглобальными источниками.
- ArduPilot: FlowHold Mode — ограничения Optical Flow и поведение при низком качестве.
- FPV Club: Настройка Optical Flow для ArduPilot — общий материал по установке и базовой настройке.
- FPV Club: GPS есть, а Loiter уводит в сторону — чтение EKF и лога при позиционном дрейфе.
Сноска 1. Значения параметров, названия полей лога и доступные функции могут различаться между ArduPilot 4.6/4.7, типами автопилотов и драйверами сенсоров. Перед изменением параметров сверяй официальную документацию для своей версии и сохраняй исходный файл параметров.
Сноска 2. Советы из Discourse — это разборы конкретных конфигураций, а не универсальные рецепты. Число вроде RNGFND1_MIN_CM=10 или 30 нельзя переносить на другой дальномер без проверки его паспорта, фактической высоты и диапазона измерения.
Материал проверен 9 августа 2026 года. Ссылки на официальную документацию и обсуждения открыты перед публикацией.
