Optical Flow в ArduPilot: сенсор и EKF

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

Проверка данных Optical Flow в окне Status Mission Planner
Проверка полей Optical Flow в окне Status Mission Planner. Иллюстрация: ArduPilot documentation, CC BY-SA 3.0. Источник изображения и инструкция.
⚠️ Безопасность. Первые проверки выполняй без пропеллеров и с отключённой силовой частью. Не проверяй Optical Flow через Loiter, PosHold, RTL или Auto над людьми, стенами и дорогим оборудованием. Пока не подтверждены данные потока, дальномер, EKF origin и ручное управление, аппарат нельзя считать готовым к позиционному режиму.

Что именно должен доказать Optical Flow

Optical Flow не сообщает автопилоту готовую глобальную координату. Сенсор оценивает видимое угловое движение поверхности, а дальномер даёт расстояние до неё. EKF использует эту пару, чтобы оценить горизонтальную скорость и положение относительно исходной точки. Поэтому «сенсор виден в порту» и «в поле Status меняются числа» ещё не означают, что ArduPilot сможет удерживать позицию.

Практическая цепочка выглядит так: порт и протокол → поток и качество → дальномер и высота → ориентация осей → EKF origin и источники → короткий безопасный тест. Если перепрыгнуть через первые звенья, настройка PID или повторная калибровка только замаскируют причину.

Быстрая диагностика по симптому

Интерактивная диагностика Optical FlowШаг 1 из 3


Как читать результат. Это не автоматический диагноз, а порядок проверки. Один и тот же дрейф может быть вызван поверхностью, ориентацией, дальномером, EKF origin или конфигурацией источников. Если на любом шаге появляется опасное поведение, прекращай испытание и возвращайся к механике и логу.

Проверка сенсора в Mission Planner

  1. Открой Status. На неподвижном аппарате значения потока могут быть близки к нулю. Для проверки перемести сенсор или аппарат без пропеллеров над подходящей поверхностью и посмотри, меняются ли opt_m_x, opt_m_y и opt_qua.
  2. Проверь дальномер. Оптический поток даёт угловое движение, а дальность нужна для оценки линейной скорости. Перед взлётом дальномер должен выдавать правдоподобную высоту внутри своего диапазона, а не ноль, обрыв или значение ниже RNGFNDx_MIN_CM.
  3. Проверь поверхность. Матовая текстурированная поверхность обычно подходит лучше, чем однотонный пол, стекло, вода, зеркальная плитка или повторяющийся рисунок. Сравни результат при другом освещении и на нескольких высотах.
  4. Проверь калибровку. Официальная процедура использует переключатель с 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: поведение зависит от того, какие источники выбраны в наборах и как прошивка оценивает их здоровье.

⚠️ Практическая граница. Хороший HDOP не гарантирует, что GPS пригоден внутри здания или рядом с помехами. Так же Optical Flow не является глобальной навигацией и не обещает бесконечное удержание позиции. Сначала воспроизведи переход на стенде, затем делай короткий тест на открытом месте с ручным способом восстановления.

Что показывают кейсы сообщества

В свежем обсуждении с 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
⚠️ Это пример для конкретной схемы, а не разрешение скопировать набор в любой аппарат. После изменения источников проверь EKF status, дальность, качество потока и ручной способ восстановления на стенде и в коротком безопасном тесте.

Калибровка Optical Flow

Inflight-калибровка подходит, когда есть валидный GPS и аппарат уже безопасно держится на нём. Нужны открытая зона, текстурированная поверхность, стабильный свет и высота не ниже примерно 10 м, но в пределах фактического диапазона дальномера.

  1. Назначь на свободный AUX-канал RCx_OPTION=158 и проверь, что переключатель не активирует другую функцию.
  2. На время калибровки оставь 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.
  3. Выполни взлёт в Loiter, включи калибровку AUX и плавно покачивай Roll и Pitch по процедуре ArduPilot. Следи за сообщениями FlowCal, прогрессом и значениями fit: меньшая ошибка лучше.
  4. После сообщения о завершении посади аппарат, сохрани параметры и верни выбранный набор источников 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-режиме на открытом месте; лог сохранён сразу после посадки.

Источники и связанные материалы

Сноска 1. Значения параметров, названия полей лога и доступные функции могут различаться между ArduPilot 4.6/4.7, типами автопилотов и драйверами сенсоров. Перед изменением параметров сверяй официальную документацию для своей версии и сохраняй исходный файл параметров.

Сноска 2. Советы из Discourse — это разборы конкретных конфигураций, а не универсальные рецепты. Число вроде RNGFND1_MIN_CM=10 или 30 нельзя переносить на другой дальномер без проверки его паспорта, фактической высоты и диапазона измерения.

Материал проверен 9 августа 2026 года. Ссылки на официальную документацию и обсуждения открыты перед публикацией.

Прокрутить вверх