Датчик оптического потока - MTF02
Современные робототехнические системы, дроны и автоматизированные устройства требуют точного определения перемещения в пространстве. Один из ключевых компонентов для этой задачи — Оптический модуль инерциальной навигации, такой как MTF02. Этот компактный и энергоэффективный сенсор позволяет устройствам "чувствовать" движение даже без GPS или внешних ориентиров.
В конструкции датчика MTF-02 интегрированы две ключевые подсистемы:
- ToF motion sensor (Time-of-Flight) для получения точечного расстояния;
- Сенсор оптического потока (Optical flow) для отслеживания движения поверхности.
Основные характеристики
- Напряжение питания:4 - 5.5В, потребление ~200мВт;
- Размеры/вес: ~25x10x4,5мм 1,5г;
- Оптический поток: 42° - при освещенности 60 ≥ Lux;
- Минимальная высота: ≥ 8см;
- Максимальная скорость: до 7м/c на высоте 1 метр;
- ToF motion sensor: до 2,5 м @ 90% отражения и 600 Lux, мертвая зона ToF-камеры после 2см;
- Длина волны ToF: 940нм.
Процесс работы MTF-02:
- ToF motion sensor — технология измерения расстояния до объекта с помощью времени задержки отраженного сигнала (лазерного или ИК-импульса). Точечные датчики измеряют дистанцию до одной точки.
- Оптический поток (Optical flow) - датчик захватывает изображение поверхности вниз и вычисляет относительное движение при частоте ~50 Гц, работает начиная с высоты 8см и далее для алгоритмов стабилизации движения при полете или перемещении в помещении.
Это похоже на то, как компьютерная мышь определяет свое перемещение, но с более высокой точностью.
Интерфейсы и протоколы
- UART, LVTL 3.3В;
- поддерживаемые протоколы: Micolink, Mavlink (APM +PX4), MSP(iNav):
- Частота передачи: 50 Гц.
Применение:
Дроны и квадрокоптеры
- Стабилизация в помещении без GPS;
- Точное позиционирование при посадке.
Роботы-пылесосы
- Построение карты помещения;
- Контроль пройденного пути.
Мобильная робототехника
- Навигация автономных роботов;
- Избегание столкновений.
Локализация и колижионирование
интеграция оптического потока и ToF
Аналитика движения
определение скорости движения по поверхности
Мое личное применение:
Задача стоит следующая: мне необходимо разработать такую систему, которая способна сканировать в пространстве над поверхностью т.е. по "воздуху".
Для решения поставленной задачи, был выбран датчик MTF-02, обладающий необходимыми характеристиками для одновременного определения пройденного пути, координат перемещения в плоскости (X, Y) и оценки высоты объекта.
Благодаря встроенномуToF motion sensor, обеспечивающей точное измерение расстояния, а также модулю оптического потока, MTF-02 способен адаптироваться к условиям, когда отсутствует прямая опора или контрольный фон, это делает его особенно эффективным в задачах, где важно отслеживать перемещение объекта в подвешенном состоянии или при движении над неровной/неоднородной поверхностью.
Схема подключения датчика MTF-02
Для более стабильного напряжения питания можно использовать следующую схему, в которой работает понижающий преобразователь MP2315, но необходим источник +12В, в моем случае используется аккумуляторная сборка (NiMH/Pb +12В).
Вид осциллограммы передаваемых данных модуля MTF-02 по интерфейсу USART (линия TX)
Настройка микроконтроллера STM32F103 в CubeIDE
- В пункте [ 1 ] настраиваю скорость (Baud Rate [115200]), остальные параметры без изменений;
- В пункте [ 2 ] заходим в параметр "DMA Settings" и включаем его на примем данных; (В рамках реализации приема данных по интерфейсу(USART) была задействована технология прямого доступа к данным (DMA), что позволило существенно снизить нагрузку на центральный процессор.Для этого приемный сигнал USART(USART_RX) был сконфигурирован на работу в режиме DMA, при котором поступающие данные автоматически записываются в выделенный участок оперативной памяти без участия ядра;
- В пункте [ 3 ] заходим в параметр "NVIC Settings" и включаем глобальное прерывание. (Для отслеживания состояния интерфейса USART и обработки важных событий (например, завершения приема или ошибки), в разделе NVIC Settings было включено глобальное прерывание USART, это обеспечивает возможность немедленного реагирования со стороны микроконтроллера на изменения состояния периферии без постоянного опроса регистров).
Реализация программного кода(настройка и прием данных)
Создание переменных и макросов
Структуры MICOLINK_MSG_t msg и MICOLINK_PAYLOAD_RANGE_SENSOR_t
Реализацию структур я взял с официального сайта [ https://micoair.com/docs/decoding-micolink-messages-from-mtf-01/ ]
Метод uart_Handler_MTF
Данный метод отвечает за получение, предварительную обработку и подготовку к использованию данных, поступающих от датчика MTF-02.
Основные задачи метода• Приём данных с датчикаМетод реагирует на прерывания DMA — по заполнению первой или второй половины приёмного буфера. Это позволяет работать с потоком данных непрерывно, без потерь.
• Буферизация и переключение кадровИспользуются два чередующихся буфера (uart_rezult_buf1 и uart_rezult_buf2), чтобы приём новых данных и обработка предыдущих шли параллельно.
• Декодирование пакетаПолученные байты передаются в функцию micolink_decode, которая разбирает пакет и выделяет физические величины:
flow_vel_x_cop — линейная скорость по оси X
flow_vel_y_cop — линейная скорость по оси Y
distance_m — дистанция до поверхности
• Сглаживание данныхДля уменьшения шумов значения проходят через циклический буфер и усредняются функцией calculate_average. Это даёт стабильные показания скорости и расстояния.
• Интегрирование скорости в путьНа основе сглаженных скоростей выполняется интегрирование (update_position) для получения пройденного пути по осям X и Y.Параллельно рассчитывается общая длина пути и угол движения (calculateBetaRadians).
• Подготовка данных для передачиФормируются готовые строки (sprintf) с данными в удобном текстовом формате для отладки, логирования или передачи в другие системы.
Метод update_motion
Данный метод отвечает за расчёт общей скорости и пройденного пути, он выполняет ключевую навигационную задачу — на основе данных от MTF-02 вычисляет, с какой скоростью движется объект и какое расстояние он прошёл с момента старта измерений.
Принцип работы• Измерение времени между кадрамиФункция хранит момент предыдущего вызова (last_time_ms) и определяет, сколько секунд прошло между текущим и прошлым измерением (delta_time_s). Это позволяет интегрировать движение по времени.
• Вычисление мгновенной скорости
Используются проекции скорости по осям X и Y (flow_vel_x, flow_vel_y).
Их векторная сумма (sqrtf(...)) даёт модуль скорости в плоскости.
Результат умножается на измеренное датчиком расстояние до поверхности (distance_m), что учитывает масштаб оптического потока.
Деление на 100 применяется, если исходные скорости приходят в сантиметрах в секунду (приведение к м/с).
• Интегрирование для получения путиОбщая скорость умножается на интервал времени — это даёт приращение пути за данный шаг.Приращение накапливается в переменной total_path_m, которая отражает суммарное пройденное расстояние с начала работы системы.
• Обновление времениВ конце функция сохраняет текущее время вызова, чтобы при следующем измерении корректно вычислить delta_time_s.
Простыми словамиМетод update_motion — это шагомер с точностью до миллиметров, но не по количеству шагов, а по точным данным от оптического датчика.Он измеряет скорость движения, умножает её на прошедшее время и складывает результат в копилку пройденного пути
Метод update_position
Данный метод отвечает за то, чтобы перевести показания датчика MTF-02 из скоростей в координаты — то есть понять, где сейчас находится объект относительно точки старта.
Как это работаетОпределение времени между измерениямиМетод вычисляет, сколько секунд прошло с момента предыдущего вызова (delta_time_s).Это нужно, чтобы правильно учесть, на какое расстояние мог сдвинуться объект.
• Отсев шумовЕсли скорость по X или Y слишком мала (меньше 0,01 см/с), она считается шумом и приравнивается к нулю. Это предотвращает накопление ошибок из-за микроколебаний или дрожания датчика.
• Перевод в метры в секундуПоказания датчика приходят в сантиметрах в секунду, поэтому они делятся на 100, чтобы работать в метрической системе (м/с).
Интегрирование — путь из скорости
Скорость умножается на время, прошедшее с предыдущего измерения.
Полученное приращение добавляется к текущим координатам position_x_m и position_y_m.
Таким образом, шаг за шагом накапливается точка текущего положения в метрах.
• Обновление времениСохраняется момент последнего измерения, чтобы при следующем вызове правильно рассчитать delta_time_s.
Простыми словамиupdate_position — это математический «следопыт»:он берёт скорости, отбрасывает шум, переводит их в пройденное расстояние и складывает с предыдущими координатами.В результате получается текущая позиция объекта в двухмерном пространстве.
Метод calculateBetaRadians перевод угла в радианы
Метод calculate_average вычисление среднего значения из буфера, необходим для сглаживания данных поступающих от датчика MTF-02
Обработка и расшифровка данных MicoLinkВ
В работе с датчиком MTF-02 информация передаётся в виде бинарных сообщений по протоколу MicoLink. Этот набор функций выполняет полный цикл приёма — от поимки первого байта до получения готовых чисел скорости и высоты.
1. Метод micolink_parse_char, осуществляет приём и разбор данных, обрабатывает поток входящих байтов, поступающих от датчика.
Каждый байт проходит через «машину состояний»:
Заголовок — признак начала пакета.
ID устройства и системы — кому адресовано сообщение.
ID сообщения — тип передаваемых данных (например, показания дальномера).
Длина полезной нагрузки — сколько байт занимает полезная информация.
Полезная нагрузка — сами измеренные значения (скорости, дистанция).
Контрольная сумма — защита от ошибок в передаче.
Если всё прошло успешно и контрольная сумма совпала — пакет считается принятым.
2. Метод micolink_check_sum, осуществляет проверку целостностиКаждое сообщение содержит контрольную сумму — специальное число, рассчитанное по всем байтам пакета.
Если расчёт на приёмной стороне совпадает с переданным значением, значит, данные достоверны.
Этот шаг защищает от искажений, которые могут возникнуть в линии связи.
3. Метод micolink_decode, осуществляет декодирование,после успешного приёма пакет разбирается по смыслу.
В случае с MICO_LINK_MSG_ID_RANGE_SENSOR из него извлекаются:
time_ms — отметка времени измерения;
distance_m — высота над поверхностью, в метрах;
flow_vel_x и flow_vel_y — линейные скорости по осям X и Y (см/с).
Эти значения затем используются для расчёта скорости, перемещения и построения траектории движения.
Метод uart_startRecieving_MTF
После вызова данного метода MTF-02 начинает передавать пакеты данных по UART, а контроллер непрерывно принимает их в выделенный буфер, не тратя ресурсы на побайтовую обработку. Когда буфер наполняется наполовину или полностью, срабатывают соответствующие обработчики (uartRxHalfIRDone и uartRxFullIRDone), и начинается разбор протокола MicoLink.
Обработчики прерывания на прием
Данная реализация обработчиков конкретно у меня, находится в другом классе.
Обработчик ошибок
Главный метод
Ссылка на скачивание исходного кода [ #исскуствомк_исходный_код -Исходный код для датчика MTF-02]
Вывод
Датчик MTF-02 — это отличное решение для проектов, требующих точного измерения перемещения без сложных навигационных систем. Его простота, низкая цена и энергоэффективность делают его популярным в робототехнике, дронах и умных устройствах.
Если статья показалась Вам интересной, буду рад выпустить для Вас еще множество статей исследований по всевозможным видам устройств, так что, если не хотите их пропустить – буду благодарен за подписку на мой ТГ-канал: https://t.me/ChipCraft.