Настройка Optical Flow для ArduPilot

Все статьи

Что такое Optical Flow и зачем он нужен?

Optical Flow — это технология определения скорости и позиции дрона по смещению текстуры поверхности, видимой через направленную вниз камеру. Работает аналогично оптической мыши.

Основные применения:

ПрименениеОписание
🏢 Полёты в помещенияхУдержание позиции без GPS
🌉 Полёты под мостами/деревьямиГде GPS недоступен или даёт ошибки
🎥 Съёмка вблизи объектовТочное позиционирование
🏭 Инспекция инфраструктурыСтабильный ховёр вблизи конструкций
🚁 Резервирование навигацииBackup при потере GPS

⚠️ Ключевые ограничения:

  • Требуется текстурированная поверхность (бетон, трава, асфальт)
  • Не работает на однотонных поверхностях (снег, вода, чистый бетон)
  • Требуется хорошее освещение (не работает в темноте без ИК-подсветки)
  • Ограниченная высота (обычно до 8-30м в зависимости от сенсора)
  • Не даёт абсолютную позицию — только относительное смещение

Поддерживаемые сенсоры (актуально на 2026)

Таблица совместимости с ArduPilot 4.6/4.7:

СенсорИнтерфейсДальностьLidarЦенаРекомендация
ARK Flow MR DroneCAN80мм-∞✅ Broadcom AFBR (50м)~$150🏆 Лучший выбор для больших БПЛА
Holybro H-Flow DroneCAN80мм-30м✅ Встроенный~$120Отличное соотношение цена/качество
CubePilot HereFlowDroneCAN80мм-∞✅ Встроенный~$130Надёжный, хорошая поддержка
MicoAir MTF-01MAVLink UART80мм-8м✅ Встроенный~$40💰 Бюджетный вариант
Matek 3901-L0XMSP/I2C80мм-3м✅ VL53L0X~$35⚠️ EOL, ограниченная дальность
PX4FlowI2C/CAN0.8м-∞❌ Требуется внешний~$200⚠️ Устарел, не рекомендуется

🏆 Рекомендации для больших БПЛА:

# Для больших коптеров (вес не критичен) рекомендую:
1. ARK Flow MR — максимальная дальность, встроенный lidar 50м
2. Holybro H-Flow — хорошая альтернатива, 30м lidar
3. HereFlow — проверенное решение от CubePilot

# Бюджетный вариант:
MicoAir MTF-01 — но ограниченная дальность lidar (8м)

Подключение и базовые параметры

Вариант 1: DroneCAN сенсоры (ARK Flow, H-Flow, HereFlow)

Подключение:

Сенсор → CAN1/CAN2 порт автопилота (4-pin JST GH)
Питание: 5V от автопилота

Параметры:

# Базовая настройка DroneCAN
FLOW_TYPE = 6              # DroneCAN optical flow
CAN_P1_DRIVER = 1          # Включить CAN драйвер
CAN_D1_PROTOCOL = 1        # DroneCAN протокол

# Если сенсор имеет встроенный lidar:
RNGFND1_TYPE = 24          # DroneCAN rangefinder
RNGFND1_MAX_CM = 3000      # Максимальная дальность (30м для H-Flow)
                             # или 5000 (50м для ARK Flow MR)

# Позиция сенсора относительно центра масс (в метрах)
FLOW_POS_X = 0.0           # Вперёд/назад
FLOW_POS_Y = 0.0           # Влево/вправо  
FLOW_POS_Z = 0.1           # Вниз (например, 10см)

# Ориентация сенсора (если не стандартная)
FLOW_ORIENT_YAW = 0        # 0=вперёд, 90=вправо, 180=назад, 270=влево

# Перезагрузка автопилота

Вариант 2: MAVLink сенсоры (MicoAir MTF-01)

Подключение:

Сенсор TX → Автопилот RX (Serial порт)
Сенсор RX → Автопилот TX
Сенсор GND → Автопилот GND
Сенсор 5V → Автопилот 5V

Параметры:

# Настройка serial порта (например, Serial1)
SERIAL1_BAUD = 115         # 115200 baud
SERIAL1_PROTOCOL = 1       # MAVLink1

# Optical Flow
FLOW_TYPE = 5              # MAVLink optical flow

# Rangefinder (если встроен)
RNGFND1_TYPE = 10          # MAVLink rangefinder
RNGFND1_MAX_CM = 800       # 8м для MTF-01

# Позиция сенсора
FLOW_POS_X = 0.0
FLOW_POS_Y = 0.0
FLOW_POS_Z = 0.1

# Перезагрузка автопилота

Вариант 3: I2C/MSP сенсоры (Matek 3901-L0X)

Подключение:

Сенсор SDA → I2C SDA
Сенсор SCL → I2C SCL
Сенсор VCC → 3.3V
Сенсор GND → GND

Параметры:

FLOW_TYPE = 2              # PX4Flow (для MSP сенсоров)
# или
FLOW_TYPE = 1              # I2C

# Остальные параметры аналогично

Настройка EKF3 для Optical Flow

Базовая конфигурация (только Optical Flow, без GPS):

# Источники для EKF3
EK3_SRC1_POSXY = 0         # None (не использовать GPS для позиции)
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        # Отключить FuseAllVelocities
EK3_FLOW_DELAY = 0         # Задержка (зависит от сенсора, см. документацию)

# Проверка GPS перед армом (отключить для полётов без GPS)
ARMING_CHECK = 1           # Или убрать бит GPS из проверки

Гибридная конфигурация (GPS + Optical Flow):

# Основной источник — GPS
EK3_SRC1_POSXY = 3         # GPS для позиции
EK3_SRC1_VELXY = 5         # Optical Flow для скорости (улучшает точность)
EK3_SRC1_POSZ = 1          # Barometer
EK3_SRC1_VELZ = 3          # GPS
EK3_SRC1_YAW = 1           # Compass

# Опции
EK3_SRC_OPTIONS = 0

# Переключение источников через AUX канал
RCx_OPTION = 90            # EKF Pos Source (low=GPS, mid=OpticalFlow)

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

Метод 1: Inflight калибровка (рекомендуется)

Требования:

  • ✅ Наличие GPS
  • ✅ Текстурированная поверхность
  • ✅ Хорошее освещение
  • ✅ Высота 10-20м

Пошаговая инструкция:

# 1. Настроить AUX функцию для калибровки
RCx_OPTION = 158           # Optflow Calibration

# 2. Настроить EKF для калибровки (с GPS)
EK3_SRC1_POSXY = 3         # GPS
EK3_SRC1_VELXY = 3         # GPS
EK3_SRC1_POSZ = 1          # Baro
EK3_SRC1_VELZ = 3          # GPS
EK3_SRC1_YAW = 1           # Compass
EK3_SRC_OPTIONS = 0

# 3. Взлететь в Loiter на высоту 10-20м

# 4. Активировать калибровку через AUX переключатель

# 5. Выполнять покачивания по Roll и Pitch (±15°)
#    в течение 30-60 секунд

# 6. Проверить сообщения в GCS:
#    "FlowCal: Started"
#    "FlowCal: x:100% y:100%"
#    "FlowCal: scalarx:0.976 fit: 0.10"
#    "FlowCal: scalary:0.858 fit: 0.04"
#    "FlowCal: FLOW_FXSCALER=30, FLOW_FYSCALER=171"

# 7. Приземлиться и переключить EKF на Optical Flow
EK3_SRC1_POSXY = 0         # None (только Optical Flow)
EK3_SRC1_VELXY = 5         # Optical Flow

# 8. Тестовый полёт

Метод 2: Log-based калибровка (на земле)

Требования:

  • ✅ Пропеллеры сняты!
  • ✅ Текстурированная поверхность
  • ✅ Хорошее освещение

Пошаговая инструкция:

# 1. Включить логирование при disarmed
LOG_DISARMED = 1

# 2. Включить дрон, держать на уровне глаз

# 3. Поворачивать дрон по Roll ±15° (5-10 раз)
#    Закрыв один глаз, держать центр сенсора неподвижным

# 4. Повторить по Pitch

# 5. Скачать логи и построить графики:
#    - OF.flowX vs OF.bodyX vs IMU.GyrX
#    - OF.flowY vs OF.bodyY vs IMU.GyrY

# 6. Если OF.flowX ≠ OF.bodyX → корректировать FLOW_FXSCALER
#    Если OF.flowY ≠ OF.bodyY → корректировать FLOW_FYSCALER

# 7. Если OF.bodyX противоположен IMU.GyrX → 
#    проверить FLOW_ORIENT_YAW или ориентацию сенсора

Режим FlowHold

FlowHold — специальный режим полёта для удержания позиции с помощью Optical Flow без необходимости в rangefinder [[41]].

Основные параметры:

# Назначить режим на переключатель
FLTMODE1 = 20              # FlowHold (или другой слот)

# Параметры настройки FlowHold
FHLD_BRAKE_RATE = 800      # Скорость торможения (см/с²)
FHLD_FLOW_MAX = 200        # Максимальная скорость (см/с)
FHLD_QUAL_MIN = 10         # Минимальное качество flow
                             # Ниже этого — переключается в AltHold

Когда использовать FlowHold:

СитуацияРежимПричина
Полёт в помещенииFlowHoldНе нужен rangefinder
Полёт на улице с GPSLoiterGPS точнее
Полёт под мостомFlowHoldGPS недоступен
Съёмка вблизи объектовFlowHoldТочное позиционирование

Тестирование и проверка

Проверка 1: Статус сенсора

# В Mission Planner → Flight Data → Status
# Должны отображаться:
opt_m_x  = не ноль (движение по X)
opt_m_y  = не ноль (движение по Y)
opt_qua  = 0-255 (качество, >100 хорошо)

Проверка 2: Первый полёт (без использования flow в EKF)

# 1. Установить:
EK3_SRC1_VELXY = 0         # Не использовать flow

# 2. Полететь в Stabilize/AltHold на высоте 0.5-3м
#    с малыми углами крена

# 3. Скачать логи и проверить:
#    - EKF5.meaRng — коррелирует с высотой
#    - OF.flowX/Y — изменяются при движении
#    - OF.bodyX/Y — соответствуют IMU.GyrX/Y

Проверка 3: Второй полёт (с использованием flow)

# ⚠️ ТРЕБУЕТСЯ 15м свободного пространства!

# 1. Установить:
EK3_SRC1_VELXY = 5         # Использовать Optical Flow
EK3_SRC1_POSXY = 0         # Без GPS

# 2. Установить EKF Origin на карте (Mission Planner → ПКМ → Set Home here)

# 3. Взлететь в Loiter на высоту 1м

# 4. Если дрон начинает ускоряться или хаотично крениться →
#    немедленно переключиться в AltHold и сесть!

# 5. Если удерживает позицию → поздравляю, калибровка успешна!

Типовые проблемы и решения

Проблема 1: Optical Flow не работает

Симптомы:

  • opt_m_x, opt_m_y = 0
  • Нет реакции на движение

Решения:

# 1. Проверить FLOW_TYPE (должен быть 1, 2, 5 или 6)
# 2. Проверить подключение (CAN/Serial/I2C)
# 3. Проверить питание (5V, достаточный ток)
# 4. Проверить ориентацию (сенсор должен смотреть ВНИЗ)
# 5. Проверить поверхность (должна быть текстурированной)
# 6. Проверить освещение (не работает в темноте)

Проблема 2: Дрон «уплывает» в FlowHold

Симптомы:

  • Дрон медленно дрейфует
  • Не удерживает позицию

Решения:

# 1. Повторить калибровку (inflight метод)
# 2. Проверить FLOW_POS_X/Y/Z (точное измерение позиции)
# 3. Увеличить FLOW_FXSCALER/FYSCALER на 10-20%
# 4. Проверить качество flow (opt_qua > 100)
# 5. Уменьшить высоту полёта (ближе к поверхности)

Проблема 3: Дрон хаотично кренится при включении flow

Симптомы:

  • Резкие неконтролируемые движения
  • Максимальные углы крена

Решения:

# ⚠️ НЕМЕДЛЕННО ПЕРЕКЛЮЧИТЬСЯ В ALTHOLD И СЕСТЬ!

# 1. Проверить FLOW_ORIENT_YAW (правильная ориентация)
# 2. Проверить FLOW_POS_X/Y/Z (не перепутаны ли оси)
# 3. Повторить калибровку
# 4. Проверить вибрации (большие вибрации ломают flow)
# 5. Уменьшить EK3_GLITCH_RAD (радиус обнаружения сбоев)

Проблема 4: Flow работает только на малой высоте

Симптомы:

  • На высоте >3м flow теряет качество
  • opt_qua падает ниже 50

Решения:

# 1. Проверить характеристики сенсора (не все работают на большой высоте)
# 2. Для ARK Flow MR — работает до ∞ (но lidar до 50м)
# 3. Для H-Flow — lidar до 30м
# 4. Улучшить освещение поверхности
# 5. Использовать более текстурированную поверхность
# 6. Очистить линзу сенсора

Проблема 5: Вибрации на больших БПЛА

Симптомы:

  • Flow работает нестабильно
  • Высокий шум в логах

Решения:

# 1. Установить сенсор на демпферах (виброразвязка)
# 2. Выбрать место с минимальными вибрациями
#    (обычно центр рамы, не на лучах)
# 3. Добавить фильтры:
INS_LOG_BAT_MASK = 1       # Включить логирование вибраций
INS_HNTCH_FREQ = <частота> # Notch фильтр (по результатам анализа)

# 4. Для больших пропеллеров (13"+):
#    Уменьшить частоту обновления flow (если возможно)

Особенности для больших БПЛА

Высота подвеса сенсора

# Для больших коптеров критично правильно указать FLOW_POS_Z:
# Измерить расстояние от центра масс до сенсора (в метрах)

# Пример:
FLOW_POS_X = 0.05          # 5см вперёд от центра
FLOW_POS_Y = 0.0           # По центру
FLOW_POS_Z = 0.15          # 15см ниже центра масс

# ⚠️ Ошибка в 10см может дать значительную ошибку при кренах!

Минимальная высота полёта

# Для большинства сенсоров:
# Минимальная высота: 80мм (8см)
# Оптимальная высота: 1-5м
# Максимальная высота: зависит от сенсора (3-50м)

# Для больших БПЛА с длинными лучами:
# Учитывать, что при крене сенсор наклоняется
# и эффективная высота увеличивается

# Рекомендация:
# Минимальная высота полёта: 1м (для безопасности)

Освещение поверхности

# В помещениях с плохим освещением:
# 1. ARK Flow MR имеет встроенную ИК-подсветку (40mW)
# 2. Для других сенсоров — добавить внешнее освещение

# На улице:
# Избегать прямых солнечных лучей на сенсор
# Использовать защитный козырёк

Фильтры для больших рам

# Большие рамы (13"+ пропеллеры) имеют низкочастотные вибрации
# Рекомендуется:

# 1. Harmonic Notch фильтры (по RPM или частоте)
INS_HNTCH_MODE = 1         # Throttle-based
INS_HNTCH_FREQ = 35        # Частота (зависит от моторов/пропов)
INS_HNTCH_BW = 15          # Bandwidth
INS_HNTCH_ATT = 40         # Attenuation (dB)

# 2. Low-pass фильтры для flow
#    Обычно не требуются, но можно попробовать:
FLOW_FILT = 0.5            # Частота фильтра (Hz)

🎥 Видео материалы

Обучение и калибровка:

Практические примеры:


📚 Источники и дополнительная информация

Официальная документация ArduPilot:

Документация производителей:

Сообщество и форумы:


📊 Сводная таблица параметров

ПараметрЗначениеОписание
FLOW_TYPE1-6Тип сенсора (1=I2C, 2=PX4Flow, 5=MAVLink, 6=DroneCAN)
FLOW_ORIENT_YAW0-270Ориентация сенсора (градусы)
FLOW_POS_X/Y/ZметрыПозиция сенсора относительно центра масс
FLOW_FXSCALER%Калибровочный коэффициент X
FLOW_FYSCALER%Калибровочный коэффициент Y
FLOW_OPTIONSбитыОпции (бит 1 = стабилизированный подвес)
EK3_SRC1_POSXY0-5Источник горизонтальной позиции
EK3_SRC1_VELXY0-5Источник горизонтальной скорости
EK3_FLOW_DELAYмсЗадержка данных flow
FHLD_BRAKE_RATEсм/с²Скорость торможения в FlowHold
FHLD_FLOW_MAXсм/сМаксимальная скорость в FlowHold
FHLD_QUAL_MIN0-255Минимальное качество flow

✅ Чек-лист перед первым полётом

□ Сенсор установлен и ориентирован правильно
□ FLOW_TYPE установлен (1, 2, 5 или 6)
□ CAN/Serial/I2C подключен и работает
□ RNGFND настроен (если есть встроенный lidar)
□ FLOW_POS_X/Y/Z измерены и установлены
□ EKF3 настроен (EK3_SRC1_*)
□ Калибровка выполнена (inflight или log-based)
□ FLOW_FXSCALER/FYSCALER установлены
□ Проверка в Status: opt_m_x, opt_m_y, opt_qua ≠ 0
□ Первый полёт без flow в EKF (проверка логов)
□ Второй полёт с flow (15м свободного пространства!)
□ Тест FlowHold в безопасной зоне

🎯 Итоговые рекомендации для больших БПЛА:

  1. Выбор сенсора: ARK Flow MR или Holybro H-Flow (DroneCAN, встроенный lidar)
  2. Монтаж: В центре рамы, на демпферах, с точным измерением позиции
  3. Калибровка: Inflight метод с GPS (самый точный)
  4. Тестирование: Поэтапное — сначала без flow в EKF, потом с flow
  5. Безопасность: Всегда иметь возможность быстро переключиться в AltHold
Прокрутить вверх