Игры и Люди

… одетый только в халат из холщовой ткани, ходил в кабачки и к певичкам. Когда его спрашивали, почему он таков, он каждый раз открывал рот, засовывал туда кулак и не говорил. Император Лян-цзун призвал его и спросил: «Каков принцип Вашего Пути?» Гуйчжэнь ответил: «Одежда тонка — поэтому люблю вино, выпью вина и защищусь от холода, напишу картину — и расплачусь за вино. Кроме этого, ничего не умею». Лян-цзун не нашелся, что сказать…

От игрушек детства мы движемся к другим. Здесь — об этом.

Алхимия игры включает несколько ингредиентов.

Рецептура состоит из Миров, по которым можно путешествовать; не все из них достаточно хорошо населены. Дело — это Игрушка одного из миров.

Объединяя видимые и сокрытые элементы, Алхимия выступает и как самостоятельный Игрок.

Техника образов. Сейчас и раньше

Множество психотехник проникает в нашу жизнь. Одна из них — визуализация желательных событий. Утверждается, что представляя объект своих устремлений в виде образа — мысленно, или в звуках или хотя бы на бумаге — вы рано или поздно его получите. Наконец найден волшебный эликсир для диванной армии вершителей реальности: не затрачивая времени и сил, сберегая нервы и энергию, вы получаете машину, квартиру, или еще что-либо, до чего может дотянуться сознание визуализатора потребителя.

Отчего же не слышно про крупные победы в этом направлении? Где поток отзывов и описаний success story о достигнутых результатах? Может быть, образная техника на самом деле не работает? Или работает с какими-либо ограничениями?

За ответами вначале обратимся к современной науке — есть у нее что нибудь в запасниках для нашего случая? Исследования мозга человека показывают, что как ни странно, мозг не видит разницы между реальностью и воображением. Давнишняя вечеринка, которая отложилась у вас в памяти и картина которую вы рассматриваете сейчас и когда вы мечтали о победе в чемпионате Форумулы-1, сидя на диване — все это для вашего мозга одинаково достоверно. Именно с этим связан эффект плацебо — таблетки пустышки, которая действует также как и настоящее лекарство (даже когда пациент знает что это пустышка).

А теперь — внимание. Когда создаете определенный образ, или другими словами — мечтаете (ладно, визуализируете), в это самое время мозг начинает создавать новые нейронные связи. Этот процесс биологи называют нейропластичностью. И эти нейронные связи как раз призваны обеспечить переход к реализации вашей мечты. Фактически, вы создаете внутри себя новый бортовой компьютер, систему управления, которая поведет вас к результату путями, о которых вы сами не имеете никакого представления — ведь не случайно в технике визуализации запрещено думать о путях и способах, с помощью которых вы придете к цели.

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

Поймал человек золотую рыбку, а она ему говорит:
— Отпусти меня, что хочешь сделаю!
Он отвечает:
— Хочу стать Героем Советского Союза!
… и остался человек с двумя гранатами против пяти танков…

Если все работает именно так, то в чем проблема? Почему техника визуализации редко когда срабатывает? И на это есть две причины: первая это ключевые аспекты, которые не проговорены в этих техниках, и другая — более сложная, фундаментальная причина.

Рассмотрим их по порядку. Чтобы образ материализовался в реальности, он должен быть устойчивым, «чистым» и свободным от помех. Однако с помехами есть большая проблема. Жизнь современного человека состоит из рутины и повторения одного и того же — работа, дом, работа. Его мозг генерирует за день около 60 тысяч мыслей. Но больше 40 тысяч из них будут теми же мыслями, которые крутились в голове вчера. Это — мощная помеха, которая не дает образу выйти в пространство.

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

Забавно, что современные психологи, открывая для себя работающие техники, на самом деле идут по пути древних основателей таких дисциплин как цигун и йога, а то и магии )

Теперь про вторую, фундаментальную причину. Почему вы решили что ваш образ — единственный? А если вы согласны с тем что образы других тоже имеют право на жизнь, согласитесь и с тем что они могут противоречить вашему. Как результат этой борьбе образов ваша мечта может быть смята. Один из таких сильных образов, который может полностью подавить ваш — это образ принципа государства, который нарабатывался еще в Древнем Египте и с тех пор только накачивался энергией и усиливался. А что такое государство — мы все прекрасно знаем.

Быть может у древних практик ответов будет побольше, чем у современной науки? Частично приоткрывает завесу такой вид китайского боевого исскуства, как Син-И. В этом внутреннем стиле нарабатываются стойки и движения которые имитируют повадки разных животных. При поверхностном взгляде может показаться, что это просто красивая упаковка экзотических упражнений. Но на самом деле, в стойке медведя ученик ведет себя не как медведь, а по настоящему становится медведем. Ощущаете разницу? В результате, после наработки этого образа меняется костно-мышечная и энергетическая система с приобретением тех качеств, которые есть у медведя — сила, устойчивость в стойке.

Этот же ключ дает нам фантастическая книга «Хохот Шамана». О том же самом:

— Сплошной след лыжни очень смешон для Ворона.
— Откуда ты знаешь?
— Я сам — Ворон.
— То есть ты — как Ворон?
— Нет. Просто я — Ворон.
— То есть ты подобен Ворону?
— Повторяю для особо одаренных: я — Ворон.

Согласитесь, раньше вы просто не обратили бы внимание на этот фрагмент. Но сейчас понятно, о чем говорит Шаман. Он — в образе Ворона, и поэтому он не как Ворон. Он Ворон и есть.

Если древние мастера были такими продвинутыми в образной технике, почему тогда они не наработали себе больших дворцов и красивых повозок? Ну почему нет, наработали. Только не в этом мире. Наш мир их не очень интересовал; они считали его иллюзорным. Они жили в другой вселенной, и чем там занимались — очень интересный вопрос. Придет время, и мы отыщем ответы на него.

Обработка потока с видеокамеры средствами ПЛИС/FPGA. OV7670 + Zedboard

В статье маркеры визуальной системы автоматической посадки БЛА была описана  обработка видео-данных реального времени для системы оптического типа — VBLS. Это была хоть и шустрая, сделанная на C++, но модель. Теперь, как было замечено в конце этой статьи, пришло время показать систему в боевом варианте, где обработка видеопотока параллелится в ПЛИС.

В данной системе для экспериментов я выбрал весьма удобную отладочную плату  Zedboard. Чип Zynq-7000 основан на SoC архитектуре ARM+FPGA, однако на этом этапе функционал ARM использовать не будем и ограничиваемся работой только с ПЛИС. В качестве камеры выступает популярный модуль OV7670 разрешением 640х480 (хвала Алиэкспрессу!). Почему такое скромное разрешение? А потому что в Zedboard ресурсы ограничены, в частности критичным для нас является размер встроенной быстродействующей памяти BRAM (не путать с DDR). Результирующее видео выводится на дисплей через разъем VGA платы.

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

Теперь, пошли по порядку.

Инструментарий

Отладочная плата Zedboard. Конечно, это серьезный финансовый барьер для тех кто занимается разработкой в режиме хобби, но если вы собираетесь работать с ПЛИС то вам нужна эта плата. Она удобна, хорошо документирована, и к тому же на ней есть ARM, на котором вы будете дополнительно молотить то, что осталось от ПЛИС.

Micro-USB кабель. Он будет подключаться к разъему PROG платы и нужен для закачки логической матрицы.

По мере продвижения вперед ваш рабочий стол приобретет примерно такой вид.

ov7670, Zedboard, Zynq-7000, FPGA Xilinx, VHDL, PMOD, VGA, Video Processing, Visual Based Automatic Landing System, VBLS, Marker, Marker, UAV, Drone, Автоматическая посадка БПЛА, DinaPrim 2700

Внешние подключения системы: OV7670 + Zedboard

Среда разработки Vivado 2017.4. Качайте и устанавливайте ее бесплатный вариант — WebPack. Есть версии как для Linux так и для Windows; у меня стоит Linux версия. Среда весьма требовательная к ресурсам компа. Да, и сразу предупреждаю — «компиляция» исходного кода занимает приличное время (минуты). Это дисциплинирует и заставляет более требовательно относиться к своим исходникам — попросту нужно делать меньше ошибок. Для Vivado есть и более свежии версии, но у меня они пошли плохо — начались конфликты с кириллицей (кто бы мог подумать).

Для тех кто пользует Linux: поскольку среду разработки разворачивает скрипт установки, укажите место для Vivado как /opt/Xilinx, предварительно настроив права доступа на этот каталог.  Обновите правила udev для того, чтобы операционная система правильно определила кабель USB, подключенный к Zedboard. Для этого в каталоге

запустите соответствующие скрипты и обновите правила с помощью udevadm.

Камера OV7670. В поставке есть платы с чипом FIFO и без него. Нам он без надобности; наше описание расчитано на интерфейс камеры без этого буфера. Для подключения камеры к соединителям PMOD платы Zedboard я сделал переходную колодку. Можно обойтись и без пайки, просто соединив пины камеры с гнездами разъемов кабелями мама — папа. Только не делайте соединения слишком длинными — все таки работаем на частоте 25 МГц, длинный монтаж начнет звенеть.

ov7670, Zedboard, Zynq-7000, FPGA Xilinx, VHDL, PMOD, VGA, Video Processing, Visual Based Automatic Landing System, VBLS, Marker, Marker, UAV, Drone, Автоматическая посадка БПЛА, DinaPrim 2700

Переходная колодка для подключения камеры OV7670 к разъемам PMOD Zedboard

Дисплей с VGA входом и VGA кабель. Да, для того чтобы увидеть плоды своих трудов нам понадобится этот раритетный девайс, ничего не поделаешь. Будем формировать сигналы классического интерфейса VGA и выдавать их на разъем платы, который подключен к PL. И еще, потихоньку привыкаем к терминологии архитектуры Zynq: PL это программируемая логика (ПЛИС), PS это процессор (ARM).

Сразу отвечаю на вопрос продвинутых пользователей: это каким образом цифровая подсистема PL формирует сугубо аналоговые сигналы VGA? Если мы взглянем на схему платы, то увидим резистивные делители, подключенные к выходу VGA. Это фактически есть не что иное, как ЦАП, сделанный дешево и сердито. На каждый из сигналов цвета выделено 4 разряда, поэтому мы ограничены 16 градациями по каждому каналу. На самом деле, в этом проекте цвет нам не понадобится, поскольку будем работать с серым изображением.

Теперь переходим к следующему этапу — связываем все это вместе.

Подключение камеры OV7670 к плате Zedboard

Дальше, по ходу изложения, я поделюсь исходниками проекта. Но уже сейчас нам понадобится один файл — zedboard.xdc, в котором описаны внешние соединения, о которых должна знать PL.  Должна знать — потому что в этом файле осуществляется привязка по цепочке: контакт разъема PMOD платы — вывод PL — наименование соответствующего сигнала в коде VHDL. Функции этого файла, который в терминологии Xilinx именуется constraints файлом, горазо шире, но в нашем проекте мы используем этот необходимый минимум.

ov7670, Zedboard, Zynq-7000, FPGA Xilinx, VHDL, PMOD, VGA, Video Processing, Visual Based Automatic Landing System, VBLS, Marker, Marker, UAV, Drone, Автоматическая посадка БПЛА, DinaPrim 2700

Подключение камеры OV7670 к плате Zedboard

Поскольку я заговорил об исходниках, здесь будет уместно сообщить откуда я их взял ) За основу проекта использован этот VHDL код, однако имейте в виду что там есть ошибки как в самом коде, так и в распиновке PMOD разъемов платы Zedboard; кроме того я переделал этот проект с цветного на черно-белый. Можно сказать лишил его всех красок бытия ) Также я включил в состав исходников dummy модуль, в котором будут жить разные алгоритмы обработки изображения в реальном времени. Пока все что он делает — просто передает полученные байты изображения модулю VGA. А пока этот компонент живет в комфортном окружении, которое понадобится в будущем: блок памяти BRAM на входе и блок на выходе. Все в соответствии с правилами модульного программирования, выделение интерфейсов и изоляция модуля от остальных.

Итак, возвращаемся к подключению камеры. Для удобства я сделал табличку, в котором свел вместе пины камеры, коннекторов PMOD платы и данные из constraints file zedboard.xdc.

ov7670, Zedboard, Zynq-7000, FPGA Xilinx, VHDL, PMOD, VGA, Video Processing, Visual Based Automatic Landing System, VBLS, Marker, Marker, UAV, Drone, Автоматическая посадка БПЛА, DinaPrim 2700

Ваша задача — соединить пины камеры из первого столбца таблицы с гнездами разъема PMOD платы Zedboard второго столбца таблицы. О том каким выводам ПЛИС Zynq-7000 соответствуют эти сигналы, знаем только мы и руководство Zedboard Hardware Guide. VHDL коду все равно — он оперирует названиями сигналов из правого столбца таблицы, а привязывает эти сигналы к выводам Zynq-7000 файл zedboard.xdc. Таким образом все сходится.

Раз мы уже занялись подключением камеры OV7670, быстро пробежимся по ее выводам. RESET и PWDN — сброс и включение камеры. Управление камерой обеспечивает последовательный интерфейс SIOC/SIOD, аналогичный I2C. В камере находится тьма регистров, которые нужно правильно установить — главная причина того что я не разработал код с нуля а взял за основу существующий. Впрочем, это меня не спасло — все равно пришлось вникать в мануал устройства. Если вам придется заняться тем же самым, имейте в виду что зарезервированные регистры и биты также нужно устанавливать определенным образом, и тайна великая сия есть.

Камеру можно синхронизировать внешним сигналом XCLK (мы так и делаем, формируя его в коде), тогда все что она выдает идет синхронно с ее выходом PCLK. А идут с нее байты видеоданных по шине D в сопровождении импульса кадровой синхронизации VSYNC, по которому мы сбрасываем в ноль счетчики и адреса, и еще строб наличия данных строки HREF, по которому мы разрешаем считывание данных.

Вот собственно и все. Для чего нужны пины 3v3 и GND вы наверное догадались сами.

Теперь самое время объявить хорошую новость для тех, у кого нет платы Zedboard, камеры и дисплея. Вы можете сразу начинать экспериментировать с VHDL, поскольку в Vivado есть режим симуляции. Единственное что вам понадобится дополнительно — включить в симуляцию testbench файл tb_top.vhdl, который имитирует данные с камеры. Вы можете написать свой testbench с тем чтобы посмотреть временные диаграммы как всего проекта, так и одного отдельного модуля.

Запуск Vivado, создание проекта, прошивка ПЛИС

Создайте новый RTL проект, добавьте VHDL файлы и constraints файл zedboard.xdc (ссылки в следующем разделе). Не забудьте указать в настройках проекта, что вы используете Zedboard: это важно. Добавьте также в симуляцию файл tb_top.vhdl. В результате иерархия компонентов должна выглядеть примерно таким образом:

ov7670, Zedboard, Zynq-7000, Vivado, FPGA Xilinx, VHDL, PMOD, VGA, Video Processing, Visual Based Automatic Landing System, VBLS, Marker, Marker, UAV, Drone, Автоматическая посадка БПЛА, DinaPrim 2700

Иерархия исходных текстов проекта

Кстати, справа Vivado показывает нам сколько ресурсов мы заняли у ПЛИС (эти данные появятся после компиляции проекта). Видно, что мы хорошо поимели память BRAM: ее осталось всего 20%. Логических блоков LUT было использовано всего ничего — всего лишь 1%.

Обратите внимание на компоненты обозначенные квадратиками: это «библиотечные» IP блоки, специфичные для Zedboard, которые мы используем в проекте. Их мы находим в меню «IP Catalog» и настраиваем. Вам нужно немного поработать: создать три компонента из IP блоков, а именно Clock wizard и два блока памяти BRAM. Каким образом компоненты встраиваются в проект, видно из файла ov7670_top.vhd, который играет роль кросс — платы для остальных модулей, то есть является топовым модулем иерархии.

Даю настройки IP блоков, отличные от настроек по умолчанию (до двоеточия я указал название вкладки, в которой нужно изменить параметр):

Блоки BRAM конфигурации Simple Dual Ram имеют одинаковую «глубину» равную 307200 (640х480) и различаются только размером шины данных: в первом случае это 8 бит, соответствующие размерности данных с камеры, во втором — 4 бита, в котором кодируются все цветовые каналы VGA.

После того как вы вписали исходники в проект и подготовили IP блоки, нужно пройти этапы «компиляции». Первый из этих этапов — Synthesis, на котором ваша схема будет связана вместе и для нее будут подобраны элементарные кирпичики FPGA — Slices and LUTs. Здесь вас ждут типичные ошибки синтаксиса (которые можно выловить раньше — редактор указывает на них сразу) и например ошибки несовпадения разрядности, когда к 8-пиновому разъему вы пытаетесь прикрутить 16-пиновый. На втором этапе Implementation будет предпринята попытка втиснуть плоды вашего творчества в ПЛИС. Если оно не помещается, Vivado скажет, какие именно ресурсы вы превысили. Следующий этап — Generation Bitstream, когда будет создаваться двоичный образ матрицы PL. Как ни странно, на этом этапе тоже могут возникнуть ошибки. Не расслабляйтесь!

И наконец если все прошло благополучно, открывайте Hardware Manager и если вы не напутали с подключением Zedboard по usb, получите возможность программирования платы. Для этого ее перемычки должны стоять именно так, как у меня на фото.

Файлы проекта

Пробежимся по модулям.

debounce.vhd это антидребезговая схема, которая запускается от кнопки платы и формирует сброс камеры. В принципе такой же сброс будет обеспечен в момент включения платы — но мало ли что. В процессе сброса на камеру отсылаются установки ее регистров. Поддержка последовательного интерфейса с камерой обеспечивает модуль i2_sender.vhd, хранение и логику формирования регистровых посылок — модуль ov7670_registers.vhd. В последний я внес соответствующие изменения, чтобы камера формировала последовательность YUV вместо RGB, чтобы получить градации серого Y.

Синхронную работу этих двух модулей обеспечивает кросс-плата нижнего уровня — модуль ov7670_controller.vhd.

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

Теперь вернемся к началу цепочки. Прием байтовой последовательности с камеры — задача модуля ov7670_capture.vhd. Синхронизация его работы с разверткой камеры выполняется с помощью сигналов VSYNC, HREF. Поскольку во входном потоке каждый второй байт кодирует цвет, эти байты отбрасываются и в первый блок памяти записываются только значения интенсивности Y. Таким образом, после каждого кадра в BRAM содержится байтовая картинка grayscale размером 640х480 байт.

Блоки памяти, сохраняя промежуточную информацию, также обеспечивают выравнивание работы модулей по скорости.

Модуль — заглушка cv_core.vhd читает первый блок BRAM и заполняет этими же данными второй блок, оставляя от исходных байтов только старшие четыре разряда — больше VGA не позволяет. Вот тут для вас самый простор заместить ленивую заглушку своим алгоритмом: фильтр подавления шумов Гаусса, выделение контуров, распознавания по шаблону и все что душа пожелает. Мы же в этой статье как договорились делаем упор на технику реализации, поэтому пойдем дальше.

Собственно, осталось всего ничего — модуль vga.vhd читает второй блок BRAM, устанавливает прочитанными 4 битами все каналы цветности и выдает результат на разъем VGA. В результате мы видим что снимает камера на дисплее, в черно — белом варианте.

Скачать все исходники разом можно здесь.

На ролике видно, как все это работает вживую. Главный персонаж — моя кружка, освещение — комнатное. Базовую конфигурацию мы создали, следующий шаг — обработка изображения.

До встречи в эфире!

Маркеры визуальной системы автоматической посадки БЛА

Визуальная автоматическая посадка БЛА может выполняться не только по характерным точкам местности, но и по специально подготовленным и известным изображениям — маркерам. Собственно сама стандартная разметка ВПП состоит из таких маркеров, только исторически они предназначались не для обработки компьютером, а для человека — пилота. Поэтому нет ничего удивительного в том, что искусственный интеллект дрона потребует учесть его интересы и установить те маркеры, с которыми ему удобнее работать )

Visual Based Automatic Landing System, VBLS, Marker, Marker, UAV, Drone, Автоматическая посадка БПЛА, runway, DinaPrim 2700

Стандартизированная разметка ВПП. Маркеры обозначают тип полосы, точку касания и отклонение от этой точки

Из рисунка видно — создатели разметки ВПП позаботились о том, чтобы четко были видны торцы полосы, причем они выполнены в виде вытянутых в сторону борта линий, чтобы обеспечить хорошее различение под низкими углами места — тот же принцип, что и в разметке пешеходного перехода. Возможно, для системы визуального зрения автоматической посадки VBLS этот набор маркеров не является оптимальным. Поэтому я поработал с разными классами изображений, характеристики которых такие как спектральные и корреляционные функции, инвариантность к изменению системы координат и возможности различения на фоне местности могут быть использованы для обнаружения и определения относительного положения маркера.

Регулярные маркеры

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

Visual Based Automatic Landing System, VBLS, Marker, Chessboard, UAV, Drone, Автоматическая посадка БПЛА, DinaPrim 2700

Регулярный маркер: шахматная доска

Visual Based Automatic Landing System, VBLS, Marker, Pseudorandom Marker, UAV, Drone, Автоматическая посадка БПЛА, Маркер

Псевдошумовой маркер

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

Еще один 1D псевдошумовой маркер, который может нести функцию опознавания торцов полосы, является изображением производным от М-последовательности. Эти последовательности имеют отличные автокорреляционные характеристики и поэтому используются в радиолокации для модуляции запросных импульсов.

Visual Based Automatic Landing System, VBLS, Marker, Maximum length sequence, M-sequence, UAV, Drone, Автоматическая посадка БПЛА, DinaPrim 2700

Псевдошумовой маркер: М-последовательность

Регулярная структура этих маркеров имеет один недостаток: при крене БЛА корреляционные характеристики существенно ухудшаются. Этот минус компенсируется размещением камеры на стабилизированном подвесе. Более существенный недостаток — изменение размера изображения в зависимости от дальности.

Фрактальные маркеры

Весьма интересными для изучения являются фрактальные изображения.

Visual Based Automatic Landing System, VBLS, Marker, Pythagoras tree, UAV, Drone, Автоматическая посадка БПЛА, DinaPrim 2700

Фрактальный маркер: дерево Пифагора

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

Так, в известном фрактальном изображении — дереве Пифагора один и тот же базовый элемент, состоящий из двух квадратов, углами поставленных на третий, воспроизводится с дискретом 45 градусов. При моделировании использовались восемь опорных изображений, соответствующих всем возможным углам поворота. Алгоритм показал устойчивость обнаружения в широком диапазоне дальностей.

Visual Based Automatic Landing System, VBLS, Marker, Pythagoras tree, UAV, Drone, Автоматическая посадка БПЛА, DinaPrim 2700

Фрактальный маркер: обдуваемое дерево Пифагора

С убыванием размеров обнаруженных  базовых элементов растет их количество, что примерно поддерживает на одинаковом уровне отношение сигнал/шум.

Другой фрактал — это модификация дерева, известная как обдуваемое дерево Пифагора. В данном варианте количество градаций углов поворота больше чем 8, соответственно больше отчетов дальности, которые может позволить себе алгоритм.

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

Кольцевой маркер

Visual Based Automatic Landing System, VBLS, Marker, Marker, UAV, Drone, Автоматическая посадка БПЛА, DinaPrim 2700

Маркер: концентрические окружности

Поскольку объем ограничен, я не стал приводить данные по моделированию для всех описанных маркеров. Мне по ряду причин нравится кольцевой маркер, состоящий из концентрических окружностей. Его полезные свойства — инвариантность к крену и частичная инвариантность к изменению дальности. Частичная — потому что переход окружности одного радиуса в другую окружность будет происходить только в определенном, периодическом диапазоне дальностей.

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

На рисунке показан простейший маркер. На самом деле, в силу различных причин, есть смысл делать переменный радиус и толщину колец. Это приводит нас к другой задаче — поиска оптимальной конфигурации маркера, которую предстоит исследовать более детально.

Для кольцевого маркера моделирование выполнялось в реальном времени: это как раз тот случай, когда я изменил Питону и написал приложения на C++. Кстати, раз мы коснулись быстродействия, следует отметить один существенный момент: каким бы хорошим не был алгоритм распознавания изображений, он ничего не стоит если он не будет работать на реальном железе в реальном масштабе времени. Еще один аспект, связанный с аппаратной платформой которая будет использоваться: скорее всего, без аппаратного препроцессора на ПЛИС вам не обойтись. А это значит, что алгоритм распознавания должен хорошо распараллеливаться.

Моделирование VBLS для кольцевого маркера

Как работает система. Маркер напечатан на обычном листе формата А4. Разрешение камеры всего 640х480, что даже лучше, поскольку с HD алгоритм будет работать гораздо эффективнее. Вывод приложения идет в три окна.

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

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

Клип демонстрирует, что центр маркера определяется с достаточно большой погрешностью. Но от этой части алгоритма высокая точность не требуется — требуется быстродействие. Зная небольшой фрагмент, в котором находится центр маркера — ROI, Region of Interest, будет работать точный алгоритм, основанный на анализе точек окружности. Поскольку размер поля изображения существенно снижается, производительность такой обработки не будет ухудшена.

Соображения производительности были на первом месте, по этому был сделан выбор в пользу C++. Кроме этого, в критичных местах я не использовал библиотеки OpenCV, поскольку опять таки следующий этап — параллелить операции и переносить их на FPGA. Вместо стандартных библиотек писал свои, в частности процедуру FHT, Fast Hough Transform, результат работы которой видно на аккумуляторе.

Каким быть военному радиопеленгатору

Эта история конечно имеет свои универсальные черты. Это означает, что разработка любой отечественной военной техники, не попадающей под непосредственное внимание первых лиц, идет примерно схожим образом. С другой стороны, в каждом проекте есть свои, отличающиеся от других особенности, и поэтому каждый волен выбирать, как ему воспринять эту историю: еще раз убедиться в том, как она

Читать дальше

STM32: добавляем Ethernet

В предыдущей статье я рассказывал о том, как хорошо работать с микроконтроллерами STM32 без операционной системы. Однако может наступить момент, когда вам понадобится наладить взаимодействие с вашим МК по сети. Например, что-нибудь типа умного дома или передача отладочной и диагностической информации на web страницу. Наличие Ethernet интерфейса — это конечно сильный аргумент для того, чтобы

Читать дальше

STM32: жизнь без операционной системы

Возможно, вы очень хотели заняться чем-нибудь, что связано с чипами, прошивками, возможно даже использовать новые знания для домашних поделок — мало ли вещей, которые можно автоматизировать, начиная от контроллера солнечной батареи и заканчивая автоматом запуска бензоагрегата? При этом, не сильно погружаясь в особенности операционных систем Linux / Windows и не используя сильно избыточные платы, такие

Читать дальше

ARM + DSP. Распределяем память

В процессе переноса алгоритма распознавания маркеров на OMAP платформу я обнаружил, что начисто забыл каким образом высчитывается память, которая распределяется между ARM и DSP. Восстанавливая крупицы ценной информации, которые щедро разбросаны по разным мануалам и форумам Texas Instruments, я решил зафиксировать с таким трудом добытые и упакованные в некоторое подобие осмысленной системы данные.

Мы будем

Читать дальше

Препарируем Blockchain

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

Читать дальше

Google Contacts API и авторизация OAuth2

Когда в адресной книге Google набирается несколько тысяч клиентов, становится тяжеловато ворочать этим объемным списком. Импорт/экспорт в странички Excel становится неудобным; кроме того появляются CRM-подобные приложения, в которых хотелось бы интегрировать самые разные базы данных, в том числе и контакты Google. Значит, пришло время доступиться к нашим контактам через консольные приложения, используя Google Contacts API.

Читать дальше

Согласованный фильтр 2D: поиск соответствия в изображении

Согласованную фильтрацию можно рассматривать как во временной, так и в частотной области.

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

Еще

Читать дальше