18 ноября 2019

TinyViewPlus - засечка по ArUco-маркерам с Eachine ROTG02

Часто летаем с друзьями на тинивупах и иногда устраиваем маленькие локальные гоночки. В гоночках хотелось бы видеть результат:) Недавно наткнулся на интересную программу TinyViewPlus, позволяющую учитывать время прохождения круга по ArUco-маркерам, висящим на финишных воротах. Идея очень понравилась. Все, что нужно для работы программы - несколько приемников Eachine ROTG02, Eachine ROTG01 Pro или Eachine ROTG01. Сказано - сделано. Три приемника Eachine ROTG02 оказались у меня в руках. Сначала расскажу о самом приемнике Eachine ROTG02, а потом уже о программе TinyViewPlus.


Краткие характеристики Eachine ROTG02:
  • Количество каналов: 150
  • Диапазон частот: 5645~5945МГц
  • Разъемы для антенн: RP-SMA
  • Аналоговый видеовыход
  • Напряжение питания: 5В
  • Потребление тока: 300мА
  • Габариты: 60x41x11мм
Было получено три прибора в металлических контейнерах - защита на высоте! Контейнеры потом можно пустить под мелочевку:)


В комплекте есть пара антенн, шнур микроUSB-микроUSB и шнур микроUSB-USB-C. Никакой инструкции нет.


Сам приемник Eachine ROTG02 - простая пластиковая коробочка из слегка желтоватого пластика. На лицевой стороне две кнопки управления. С одной стороны торчат RP-SMA-выводы антенн, с другой стороны видны микроUSB и JST-1.25 на 4 пина с аналоговыми выводами.


Если на предыдущих версиях этого приемника на корпусе была написана распиновка JST-разъема, то в текущей версии производитель этого не сделал. Но распиновка осталась прежней: выход аудио, выход видео, плюсовой провод и общий. Приемник можно питать только от напряжения не более 5В.


Ради интереса разобрал приемник и увидел занятную вещь. Выводы видео и аудио на аналоговый разъем приходят только с одного из принимающих модулей. То есть, никакого OSD с данными по частоте работы приемника и мощности принимаемого сигнала на аналоговом выходе нет, как и диверсити-режима.


Приемник собран на стандартных модулях RX5808, поэтому различные тесты дальности и прочие сравнения с другими приемниками, построенными на таких же модулях, излишни. Дальность будет абсолютно типичной.

Осталось подключить устройство к телефону и посмотреть его в работе. Перед этим надо установить на телефон программу FUAV, предлагаемую производителем, или любую другую, умеющую работать UVC-устройствами.


Программа FUAV проста и незатейлива, имеет минимум настроек. После запуска и подключения приемника к телефону просто выводит на экран получаемую картинку.


Если на приемнике зажать и удерживать любую из кнопок - запускается процесс сканирования частот.


Выбрать конкретную частоту можно, используя эти же кнопки. За каждое нажатие кнопки частота смещается на 2МГц в ту или иную сторону. У приемника нет какой-либо конкретной сетки частот, только диапазон 5645~5945МГц. В настройках можно зафиксировать поворот экрана, включить автозапись при подключении Eachine ROTG02, выбрать место для хранения записей или включить воспроизведение звука.


В настройках доступен VR-режим, при котором экран разделяется на два. Можно взять любой VR-шлем, вставить туда телефон и подключить приемник.


К сожалению, полетать в такой конфигурации можно только на не очень быстрых FPV-носителях или покатать друзей. Задержка воспроизведения значительная, она ощущается при полете на гоночном квадрокоптере. Тем не менее, с помощью Eachine ROTG02 можно делать записи своих полетов. Телефон будет записывать видео в разрешении 640x480 пикселей с частотой 25 кадров в секунду.


Теперь об основной задаче этого приемника - организации тинивупной гонки. Просматривая ленту в FB, наткнулся на фотографии японской гонки на тинивупах. Взгляд зацепился за странные ворота, оклеенные какими-то символами, похожими на QR-код. Как оказалось, это ArUco-маркеры, используемые роботами для навигации.


Стал искать, для чего это, и наткнулся на программу от японских программистов TinyViewPlus. Программа использует ArUco-маркеры для фиксации прохождения финишных ворот. Каждый квадрик настроен на свою частоту. Картинку с квадриков получают приемники, подключенные к компьютеру. Программа видит изображение с камер каждого квадрика. Перед подлетом к воротам, программа фиксирует наличие маркера, закрепленного за данным гонщиком, и, при его потере из вида, засчитывает момент прохождения ворот. Ну а дальше - обычная математика:)

Программа TinyViewPlus мультиплатформенная, но пока хорошо работает только с Windows и MacOS X. Исходный код программы открыт, поэтому, немного изменив код, мне удалось запустить ее и на Linux, о чем чуть позже.

Программа может получать изображение максимум с четырех приемников. Приемники можно подключать через USB-хаб, но только не с Windows. Для этой операционной системы нужны настоящие USB-порты. Для вывода изображения на экран программа использует OpenGL. Под Windows программа не будет работать со встроенным видео-адаптером, нужно перенаправить вывод на дискретную видеокарту, если она есть. Еще момент, под Windows программа использует библиотеки из пакета Microsoft Visual C++ 2015 Redistributable и, если такого нет в системе, надо его установить. Кроме подсчета времени на трассе, программа умеет озвучивать голосом различные события во время гонки. Пока доступны только японский и английский языки, работа над русским языком уже ведется.

Картинки ArUco-маркеров можно найти по ссылкам: первый, второй, третий и четвертый. Их нужно распечатать по две штуки размером не менее 150x150мм. По опыту скажу, что размер лучше сделать побольше, где-то 200x200мм, чтобы на больших скоростях они лучше определялись. Маркеры нужно закрепить на финишных воротах напротив друг друга. На маркерах есть отметка INSIDE, этой отметкой маркеры должны смотреть внутрь ворот. Финишные ворота надо устанавливать на прямом участке трассы так, чтобы квадрик влетал в эти ворота по возможности максимально перпендикулярно их плоскости и не на очень большой скорости. Если влетать в ворота под углом, засечка может и не сработать. Еще одно важное замечание. Изображение с камеры квадрика не должно быть перегружено OSD-элементами, они мешают нормально считать ArUco-маркер. Финишные ворота лучше сделать побольше размером, чтобы тинивуп гарантированно пролетел их. Стартовую позицию надо размещать за финишными воротами.

Сразу после запуска программа пробует найти все подключенные к компьютеру приемники. Как только все приемники определятся, можно нажать любую клавишу. Нужно убедится, что каждый из приемников настроен на заданную частоту и картинка с квадрика передается чисто и без помех. От этого зависит качество определения маркеров.


Следующий этап - определение пилотов. Можно вручную изменить имена пилотов в программе, щелкнув мышкой по имени пилота. Можно вручную выбрать иконку пилота, предварительно сохранив ее в PNG-формате в каталоге "pilots" с данными программы. Имя файла должно соответствовать имени пилота, тогда имя пилота будет задано автоматически. А можно задать имена пилотов в полностью автоматическом режиме. Для этого каждому пилоту надо сгенерировать свой никнейм, как QR-код. Можно воспользоваться бесчисленным количеством онлайновых генераторов QR-кода, но проще всего сделать это по данной ссылке, введя в конце строки свой никнейм и указав желаемый размер картинки.

Как использовать полученный QR-код? В программе есть режим сканирования, который включается и отключается по Q-клавише. В этом режиме надо показать программе ваш QR-код любым способом, тогда программа вас идентифицирует и автоматически выставит имя пилота и вашу иконку, если название файла с иконкой будет соответствовать имени пилота и такой файл найдется в каталоге "pilots". Есть два способа показать программе ваш QR-код. Первый - просто распечатать картинку с вашим QR-кодом и, когда программа будет в режиме сканирования, показать ваш QR-код в камеру квадрика. Второй - зашить ваш QR-код в стартовый экран OSD квадрика. Второй способ, конечно, удобнее, но не у всех квадриков есть программируемое OSD:)


После определения всех пилотов, участвующих в гонке, режим сканирования автоматически выключается.

Как зашить ваш QR-код в стартовый экран с прошивкой BetaFlight? Сначала надо создать в любом графическом редакторе изображение размером 288x72 пикселя. Затем надо разместить ваш QR-код в любом месте этого изображения. Лучше сгенерировать QR-код в размере 100x100 пикселей и вставить его так, как показано ниже.


Изображение формируется только из белого и черного цвета. Зеленый цвет - это прозрачные участки. Необходимо сохранить изображение в PNG-формате. На вкладке OSD конфигуратора BetaFlight следует нажать кнопку Font Manager в нижнем правом углу, в открывшемся диалоге выбрать желаемый шрифт и загрузить ваше изображение. Затем нажать кнопку Upload Font и проверить результат.


Итак, пилоты определены. Следующий этап - параметры гонки. Для этого следует нажать H-клавишу в программе TinyViewPlus. На экране будут представлены опции программы с описанием параметров.


Основные параметры гонки задаются по D-клавише. Появляются диалоговые окна, где задается максимальное время гонки и количество кругов. По M-клавише задается минимально возможное время круга. Этот параметр необходим для того, чтобы не было ложных срабатываний засечки. Собственно, это все, что нужно для начала гонки. Гонка начинается по нажатию на пробел, так же и останавливается. По завершению гонки программа выводит результаты.


Для того, чтобы сделать запись гонки или провести трансляцию, удобнее всего использовать программу OBS Studio. Эта программа потребляет малое количество ресурсов компьютера и записывает видео с экрана в отличном качестве.


Немного слов про работу TinyViewPlus в Linux. Есть две проблемы, мешающие нормальной работе программы. Первая - кривое определение доступных видеоустройств в библиотеке OpenFrameWorks, на основе которой построена программа. В Linux приемник Eachine ROTG02 определяется, как составное устройство, создаются два дополнительных девайса, например /dev/video0 и /dev/video1. При обращении к первому девайсу программа нормально отрабатывает, при обращении ко второму - выпадает в segmentation fault. Причем, при любом обращении, даже если просто запросить параметры устройства. Я не смог решить эту проблему корректно, поэтому поставил костыль - в Linux заставил программу работать только с каждым первым устройством из двух новых. В таком режиме все работает хорошо. Следующий косяк - в Linux нет какой-либо встроенной системы text-to-speech, в отличии от MacOS X и Windows. То есть, можно прикрутить любую на выбор из имеющихся. Без проблем можно добавить, например, espeak. Но, если делать с расчетом на будущее, с учетом того, что программа будет русифицирована, получается так, что ни одна из оффлайновых TTS-систем нормально не говорит по русски, кроме RHVoice. И тут нашлись подводные камни. Репозитарий RHVoice с бинарными сборками под Ubuntu очень давно не обновлялся и там нет пакетов под современную систему. Надо либо самому собирать и устанавливать RHVoice без участия пакетного менеджера, либо локально пересобрать и обновить доступные пакеты, перетряхнув в них зависимости. Не то, чтобы это было большой проблемой, но это таки большой костыль. Не очень хочется привязывать TinyViewPlus к зависимостям, полученным через костыли. Поэтому вопрос привязки русского TTS-движка в Linux остается открытым, а английскую версию можно привязать в любой момент. Мою сборку программы TinyViewPlus позже можно будет найти на GitHub.

Работает TinyViewPlus замечательно! Теперь только с этой программой и летаем. Бывает очень интересно посмотреть результаты тренировки. Для организаторов тинивупных гонок программа так же будет очень кстати. Впервые будем ее использовать на гонке в Симферополе.


Ваши пожелания по доработке TinyViewPlus можно оставить в комментариях под постом или в VK-группе. Удачных тренировок!