- PVSM.RU - https://www.pvsm.ru -

Сказ о том, как на хакатоне AR SDK искали, да свой собрали

В тридевятом царстве в тридесятом государстве… Свой рассказ о хакатоне в Wrike я начал так, потому что Хакатон — он как сказка: собираются энтузиасты, чтобы дать жизнь своим идеям. Выпускается идея, как стрела сказочная, а дальше может и на боярский двор упасть, а может и в болоте повседневности сгинуть. И, как в сказке, это всегда захватывающе. Не просто ведь за очень короткое время и команду собрать, и из идеи продукт сделать, да еще и показать его так, чтобы люд честной удивить.

Кирилл

А если серьезно, то хочется поделится опытом участия в хакатоне, где мы свою augmented reality (AR) разработали. Расскажу про то, как мы пытались найти готовую AR SDK под нашу задачу, но не смогли. В итоге решили сами написать AR и получилось.

Присказка

Я очень люблю хакатоны: поучаствовал в нескольких, приходилось самому проводить, и при возможности еще поучаствую.

В поисках счастья

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

Для участников это возможность познакомиться с компанией, ведь часто хакатон — это её отражение, и по нему можно делать выводы о внутренней кухне. Чтобы понять процессы в компании, можно смотреть на то, как она организует хакатон: какие ограничения для проектов, участвующих в хакатоне (объем задач, предметная область, технология, инструментарий и т.п.); уровень проведения мероприятия; критерии и прозрачность соревновательной части; судейство — состав и качество; какие установлены правила и методы формирования команд. В целом же, компании делятся на тех, кто проводит хакатоны (внутренние или публичные) и тех, кто нет. Мне больше нравятся те, кто проводит, т.к. это более открытые компании.

Сам я хожу на хакатоны не ради победы, а ради участия. Мне интересно:

  • Попробовать новые технологии. На одном «едовом» хакатоне мы взяли Flutter [1], и написали приложение под ios и android. Хотя до этого никто из нас не пробовал Flutter, правда Dart [2] мы умели.
  • Познакомиться и поработать с новыми людьми, так после одного из «городских» хакатонов, я позвал соучастника хакатоновского проекта работать в свою команду на основную работу, о чем ни разу не пожалел. Хакатон — это отличный способ проверить боевого товарища в деле.
  • Сделать, что-нибудь, что реально нужно мне самому. На внутреннем хакатоне запилили приложение, которое потом использовали в работе.
  • Просто получить позитивные эмоции от созидания. Мне очень нравится атмосфера хакатонов!

Поэтому я с радостью участвую в хакатонах wrike (в этом году был уже третий внутренний хакатон), где мы придумываем и делаем wrike еще лучше: часть предыдущих хакатоновских проектов уже живут в нашем продукте, а некоторые находятся в бэклогах команд. Вдохновляет и масштаб, несмотря на то, что хакатон внутренний, набирается около 30 команд (больше 100 человек) — все со свежими крутыми идеями.

На хакатоне 2018 я решил попробовать работу с AR [3]. В MVP [4] хотелось сделать отображение задач wrike (название, статус, исполнители и т.д.) на экране мобильного телефона при наведении на графический код с зашифрованным в нём идентификатором задачи, а также добавить возможность изменения статуса и назначение / снятия задачи с себя. Идея есть, хакатон есть, за командой дело тоже не встало. В назначенный день все завертелось.

Я спросил у ясеня

Я особо не готовлюсь к хакатонам в плане настройки окружения (поиск SDK и фреймворков; установка софта; конфигурирование и т.п.), написания кода зарание и т.д., а занимаюсь только проработкой идей, фичей, обдумыванием что в каком порядке делать и т.п. Поэтому посовещались мы с командой решили, что писать будем на Java (на ней же нативно под Android пишут), и была гипотеза, что наверняка полно готовых AR библиотек. Наш план: возьмем удобную SDK, приладим к ней API Wrike [5], а дальше сосредоточимся на написании логики нашего приложения. Таким образом первой нашей задачей стало найти удобную Java AR SDK, которая позволяет:

  • Рисовать что-нибудь на заданной виртуальной поверхности.
  • Интегрироваться / уже содержит сканер динамических графических элементов (barcode, QR, и т.п.).
  • Работать с низким порогом входа (мы же на хакатоне, нам надо быстро): есть демка, есть документация, есть бесплатная / триальная версия.

Выглядит как довольно простая задача. И мы начали перебирать варианты, основываясь на статьях типа "Top Augmented Reality SDK in 2018"

Солнце, Луна, Ветер

ARCore [6] от Google

Сперва свои взгляды мы обратили на Google. Открыли "Быстрый старт [7]", сделали всё по инструкции, запустили и, о чудо, всё работает: у меня на столе появляются Андроидики, которых можно еще и перемещать. Ощущение, что мы нашли «основу» для нашего приложения. Но дальше последовало разочарование, распознавание картинок [8] работает не так, как нам надо: картинка может быть только одна, она должна быть хорошо видна, и она должна быть из базы заранее известных картинок (а у нас для каждой задачи должен быть свой уникальный маркер). И что самое печальное, это невозможность управлять фокусом, из-за чего поймать для распознавания нужное нам изображение становится непростой задачей для пользователя. Правда сейчас с фокусом проблему решили [9], а нам пришлось продолжить поиски. В целом Google оказался хорош, но не для нашей задачи. А еще из-за специфики работы OpenGL на OSX, мы не смогли заставить работать демку в эмуляторе и всё делали на живом телефоне.

Vuforia [10]

Прочитали документацию, посмотрели ролики [11], выглядит впечатляюще. Фичей много, например, Image Targets [12]. Решили попробовать: зарегистрировались, скачали, собрали, запустили. Demo приложение запустилось, но ни на эмуляторе, ни на живом android-e не работало. Попытка проверить любую функцию приводила к краху всего приложения. Было решено не тратить время на поиск проблемы и её починку, и перейти к следующему SDK.

Wikitude [13]

Скачали SDK, пошли по туториалу [14], запустили демку. Тут куча всяких возможностей, демка сразу впечатляет, куча мини примеров, мы вдоволь наигрались (например, есть распознавание лиц [15]), и, о чудо, в демке уже есть распознавание QR. Но проблема в том, что мы получаем то, что зашифровано в коде, но не знаем, где он расположен. Стали разбираться, как устроен сканер QR. Оказалось, что он сделан как надстройка над ZBar [16] в виде плюсового плагина к SDK. Сперва посетила шальная мысль расчехлять gcc и допиливать плагин, чтобы он еще и координаты отдавал, но мы вовремя остановились.

И бились они 3 дня и 3 ночи

Осознав, что добрая четверть времени из отведенных суток позади, а мы все еще ищем свою SDK (были пробы и других решений, не только описанных выше, но и там тоже фиаско), решили больше не искать «серебряную пулю», а взять всё в свои руки. Созрел новый план: в качестве маркера задачи берем QR код, как простой и распространенный; для их распознавания берем ZXing [17], который умеет распознавать одновременно несколько кодов и помимо значения, библиотека еще отдает координаты 3 «поисковых» точек QR кода. А затем поверх считывалки кодов будем реализовать свой AR. Засучили рукава и вперед, у нас есть 3 точки, а значит при помощи аффинных преобразований можем получить всё, что нам потребуется.

Царевна лягушка

Искать библиотеку для математики не стали, благо задача у нас не сложная. Первым делом сделали свой класс для нужного нам перерасчета координат. Итоговый алгоритм работы с QR кодом получился довольно примитивным:

  • Изображение с камеры передаем в ZXing, получаем массив с координатами точек и значениями QR кода.
  • Из 3 координат рассчитываем 4-ый угол квадрата, квадрат увеличиваем в полтора раза, чтобы перекрыть исходный QR код, и получаем основу для карточки.
  • Делаем запрос в API Wrike, чтобы забрать данные о задаче.
  • Рисуем карточку, благодаря аффинным преобразованиям, сохраняем все искажения (угол обзора, поворот, масштаб).

Запилили алгоритм, он работает, тестируем, боремся с утечками памяти, дописываем визуальные эффекты, получаем удовольствие от хакатона.

И я там был, мёд-пиво пил

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

Wrike Hackathon

Поэтому в своей презентации помимо демонстрации полученного функционала, мы призвали силу воображения и описали ситуации, в которых подобная дополненная реальность (AR очки уже скоро станут обыденностью) может улучшать жизнь тем, кто работает не за компьютером, но чья работа связана с wrike. Например, для взаимодействия между дизайнером-архитектором, занимающимся ремонтом дома, и бригадой, которая непосредственно реализует проект в самом доме.
Мне кажется мы с честью продемонстрировали наш MVP, и словили свои лучики любви. Лето закончилось, и подходит к концу пора пикников и отпусков, и мы подумываем посвятить осенние вечера развитию нашей Wrike AR.

За иллюстрации спасибо Sai Kin [18]!

Автор: Dmitry Podkorytov

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/android/291200

Ссылки в тексте:

[1] Flutter: https://www.youtube.com/watch?v=UQy6HrUfa6I

[2] Dart: https://habr.com/company/wrike/blog/330832/

[3] AR: https://en.wikipedia.org/wiki/Augmented_reality

[4] MVP: https://en.wikipedia.org/wiki/Minimum_viable_product

[5] API Wrike: https://developers.wrike.com/

[6] ARCore: https://developers.google.com/ar/develop/

[7] Быстрый старт: https://developers.google.com/ar/develop/java/quickstart

[8] распознавание картинок: https://developers.google.com/ar/develop/java/augmented-images/

[9] проблему решили: https://github.com/google-ar/arcore-android-sdk/issues/200

[10] Vuforia: https://www.vuforia.com/

[11] ролики: https://youtu.be/jAmU0L_wfV0

[12] Image Targets: https://library.vuforia.com/content/vuforia-library/en/articles/Training/Image-Target-Guide.html

[13] Wikitude: https://www.wikitude.com/products/wikitude-sdk/

[14] туториалу: http://www.wikitude.com/external/doc/documentation/latest/androidnative/gettingstartedandroidnative.html#getting-started

[15] распознавание лиц: https://www.wikitude.com/external/doc/documentation/latest/androidnative/pluginsapi.html#face-detection

[16] ZBar: http://zbar.sourceforge.net/

[17] ZXing: https://github.com/zxing/zxing/wiki/Getting-Started-Developing

[18] Sai Kin: https://vk.com/sai_kinpub

[19] Источник: https://habr.com/post/421725/?utm_source=habrahabr&utm_medium=rss&utm_campaign=421725