Что такое Optical Flow и зачем он нужен?
Optical Flow — это технология определения скорости и позиции дрона по смещению текстуры поверхности, видимой через направленную вниз камеру. Работает аналогично оптической мыши.
Основные применения:
| Применение | Описание |
|---|---|
| 🏢 Полёты в помещениях | Удержание позиции без GPS |
| 🌉 Полёты под мостами/деревьями | Где GPS недоступен или даёт ошибки |
| 🎥 Съёмка вблизи объектов | Точное позиционирование |
| 🏭 Инспекция инфраструктуры | Стабильный ховёр вблизи конструкций |
| 🚁 Резервирование навигации | Backup при потере GPS |
⚠️ Ключевые ограничения:
- Требуется текстурированная поверхность (бетон, трава, асфальт)
- Не работает на однотонных поверхностях (снег, вода, чистый бетон)
- Требуется хорошее освещение (не работает в темноте без ИК-подсветки)
- Ограниченная высота (обычно до 8-30м в зависимости от сенсора)
- Не даёт абсолютную позицию — только относительное смещение
Поддерживаемые сенсоры (актуально на 2026)
Таблица совместимости с ArduPilot 4.6/4.7:
| Сенсор | Интерфейс | Дальность | Lidar | Цена | Рекомендация |
|---|---|---|---|---|---|
| ARK Flow MR | DroneCAN | 80мм-∞ | ✅ Broadcom AFBR (50м) | ~$150 | 🏆 Лучший выбор для больших БПЛА |
| Holybro H-Flow | DroneCAN | 80мм-30м | ✅ Встроенный | ~$120 | Отличное соотношение цена/качество |
| CubePilot HereFlow | DroneCAN | 80мм-∞ | ✅ Встроенный | ~$130 | Надёжный, хорошая поддержка |
| MicoAir MTF-01 | MAVLink UART | 80мм-8м | ✅ Встроенный | ~$40 | 💰 Бюджетный вариант |
| Matek 3901-L0X | MSP/I2C | 80мм-3м | ✅ VL53L0X | ~$35 | ⚠️ EOL, ограниченная дальность |
| PX4Flow | I2C/CAN | 0.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 |
| Полёт на улице с GPS | Loiter | GPS точнее |
| Полёт под мостом | FlowHold | GPS недоступен |
| Съёмка вблизи объектов | 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)
🎥 Видео материалы
Обучение и калибровка:
- Inflight Optical Flow Calibration — Randy Mackay — официальное видео от разработчика ArduPilot
- ARK Flow Indoor Position Hold x64 — демонстрация работы ARK Flow MR
- Optical Flow Setup and Testing — подборка видео по настройке
Практические примеры:
- ArduPilot 4.4.0 + Matek 3901-L0X + FlowHold — пример бюджетной настройки
- HereFlow Optical Flow Test — тестирование HereFlow
📚 Источники и дополнительная информация
Официальная документация ArduPilot:
- Optical Flow Sensor Testing and Setup — основное руководство
- FlowHold Mode — режим FlowHold
- ARK Flow MR — документация ARK Flow
- HereFlow — документация HereFlow
- MicoAir MTF-01 — документация MTF-01
- Matek 3901-L0X — документация Matek
Документация производителей:
- ARK Electronics Documentation — полная документация ARK
- Holybro H-Flow Setup Guide — руководство Holybro
- MicoAir MTF-01 Product Page — характеристики MTF-01
Сообщество и форумы:
- ArduPilot Discourse — Optical Flow — обсуждения и помощь
- ArduPilot GitHub Issues — Optical Flow — баги и улучшения
📊 Сводная таблица параметров
| Параметр | Значение | Описание |
|---|---|---|
FLOW_TYPE | 1-6 | Тип сенсора (1=I2C, 2=PX4Flow, 5=MAVLink, 6=DroneCAN) |
FLOW_ORIENT_YAW | 0-270 | Ориентация сенсора (градусы) |
FLOW_POS_X/Y/Z | метры | Позиция сенсора относительно центра масс |
FLOW_FXSCALER | % | Калибровочный коэффициент X |
FLOW_FYSCALER | % | Калибровочный коэффициент Y |
FLOW_OPTIONS | биты | Опции (бит 1 = стабилизированный подвес) |
EK3_SRC1_POSXY | 0-5 | Источник горизонтальной позиции |
EK3_SRC1_VELXY | 0-5 | Источник горизонтальной скорости |
EK3_FLOW_DELAY | мс | Задержка данных flow |
FHLD_BRAKE_RATE | см/с² | Скорость торможения в FlowHold |
FHLD_FLOW_MAX | см/с | Максимальная скорость в FlowHold |
FHLD_QUAL_MIN | 0-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 в безопасной зоне
🎯 Итоговые рекомендации для больших БПЛА:
- Выбор сенсора: ARK Flow MR или Holybro H-Flow (DroneCAN, встроенный lidar)
- Монтаж: В центре рамы, на демпферах, с точным измерением позиции
- Калибровка: Inflight метод с GPS (самый точный)
- Тестирование: Поэтапное — сначала без flow в EKF, потом с flow
- Безопасность: Всегда иметь возможность быстро переключиться в AltHold
