Pull to refresh

Личный опыт использования бесконтактных сенсоров в разработке

Reading time 6 min
Views 4.5K
Всем доброго времени суток! Меня зовут Максим, я являюсь ведущим разработчиком в компании Habilect.

В жизни каждого программиста наступает момент, когда хочется поделиться тем, на что тратится 2/3 жизни – описанием работы и проектов :)

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

За почти 7 лет были перепробованы множество вариантов – Microsoft Kinect (как версия для XBOX 360, так и Kinect One for Windows), Intel RealSense (начиная с первой доступной на рынке версии – F200, продолжая SR300 и, на данный момент, последней из выпущенных – D435), Orbbec (Astra и Persee), Leap Motion (о котором даже когда-то здесь писал про обработку custom-жестов). Естественно, не обошлось и без обычных веб-камер – анализ изображений, OpenCV и т.д.

Тех, кого заинтересовало — прошу под кат.

На всякий случай, краткий ликбез на эту тему бесконтактных сенсоров:

Представим ситуацию, что необходимо программно отследить действия определенного человека.

Конечно же, можно воспользоваться обычной веб-камерой, которую можно купить в любом магазине. Но при таком варианте использования нужно анализировать изображения, что ресурсоемко, и, честно говоря, бажно (проблема выделения памяти в том же самом OpenCV до сих пор актуальна).

Поэтому оптимальнее распознавать людей не как часть изображения с камеры, а как «скелет», полученный специализированным сенсором с использованием активных дальномеров. Это позволяет как отслеживать человека (или несколько человек), так и работать с отдельными частями «скелета».

В терминологии Microsoft Kinect SDK эти отдельные части называются «Joints». В случае работы сенсора по умолчанию их состояние обновляется каждые 30мсек.

Каждый Joint содержит:

  • данные о положении соответствующей точки скелета в пространстве (X-, Y- и Z-координаты) относительно оптической оси сенсора,
  • cостоянии видимости точки (определяется, не определяется, положение рассчитывается сенсором),
  • кватернион вращения относительно предыдущей точки

На рисунке представлены Joint’ы, обрабатываемые Kinect v2 на примере картины Леонардо Да Винчи «Витрувианский человек».

KinectV2Joints

Таким образом, работая с бесконтактным сенсором, разработчик получает возможность анализа действий человека или группы людей (например, у Kinect возможно одновременно отслеживать 6 человек в кадре). А что делать с полученным массивом данных – зависит от конкретной прикладной задачи.

Области применения таких сенсоров – бесконечны. Основными направлениями моей работы являются реклама и медицина.

Рассмотрим рекламное направление. Сейчас, для работы интерактивных рекламных стендов, необходимо несколько основных модулей, а именно:

  1. Сами рекламные материалы
  2. Сбор статистики по степени привлечения внимания посетителей на показ той или иной рекламы, что интересно рекламодателю
  3. Возможность удаленной конфигурации рекламного стенда
  4. Привлекающий эффект, который отличает интерактивный стенд от обычных ТВ с роликами и печатных баннеров

Если с самими рекламными материалами все понятно, то для сбора статистики как раз и используются сенсоры. Например, любому рекламодателю интересно, сколько человек обратили внимание на его рекламу? Мужчины, женщины или дети? В какой время они чаще всего останавливаются? Сколько времени они смотрят на рекламу, а не просто стоят рядом со стендом, копаясь в телефоне? С помощью сенсора это можно отследить и сделать отчет в удобной для рекламодателя форме.

Для удаленной конфигурации используется самая, наверно, простая и очевидная модель – Google Calendar. Каждый календарь привязан к определенному стенду, и, будучи в Санкт-Петербурге, можно управлять стендами в любой точке мира.

А привлекающий эффект – это тот самый функционал, из-за которого стенд и называется интерактивным. Можно сделать игру, управляемую человеком, с логотипом спонсора, реализовать приветственный звук при появлении человека в поле зрения сенсора, сделать QR-код со скидочным купоном в магазине рекламодателя если, например, человек минуту стоял и смотрел рекламу. Варианты ограничиваются в основном фантазией, а не техникой.

Зачем использование сенсоров в медицине? Ответ на этот вопрос банален и прост – удешевление стоимости обследований и реабилитации при сохранении точности.

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

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

  1. Удаленное составление программ реабилитации врачом для удаленного же контроля за выполнением. Например, врач из Санкт-Петербурга может удаленно контролировать выполнение прописанного пациенту из Владивостока курса упражнений, а при необходимости – изменять упражнения, увеличивать или уменьшать сложность и интенсивность занятий, изучать статистику в реальном времени и т.д.
  2. Геймифицированный процесс выполнения упражнений. Если современные тренажеры в основном ориентированы на выполнения базовых движений для разработки поврежденных мышц и суставов, то интерактивная система реабилитации позволяет выполнять упражнения, в буквальном смысле, играючи. Например, с помощью всем известного тетриса, который вместо нажатия кнопок управляется назначенными врачом движениями (поднятием левой руки, отведением правой ноги, наклоном головы вперед и так далее).
  3. Реализация критериев выполнения упражнений. При работе вместе с пациентом врач контролирует выполнение упражнения с помощью подсказок и тактильной помощи (например, нельзя сгибать руку в локте при отведении руки – это влияет на работу плечевого сустава). Интерактивная система оценивает относительные углы между Joint’ами и, в случае выхода за допустимый диапазон, делает предупреждение пользователю и не засчитывает неправильное выполнение упражнения.

Такая система позволяет сократить как время (и врача, и пациента – на поездки друг к другу), и сохранить необходимую для прогресса точность выполнения упражнений.

Для реализации проектов используется стек технологий .NET. Работаю Windows-only :). Да, из-за этого приходилось несколько раз писать wrapper’ы для native SDK (как яркий пример, я делал адаптеры для Intel RealSense SDK, так как на тот момент это был только unmanaged код). Это стоило немалого количества времени, нервов и седых волос, но позволило подключать библиотеку к разным проектам, разработанным на платформе Windows.

Стоит обратить внимание, что основные сенсоры (Kinect и RealSense) требуют для разработки разрядность x64.

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

KinectMultiSensorModel
Диаграмма в упрощенном виде показывает преимущества использования нескольких сенсоров для слежения за объектом. Синие точки (joints) устойчиво определяются первым и вторым сенсором, зеленые – только вторым. Естественно, разработанное решение реализовано под «N-сенсорную модель».

KinectMultiSensorWorkflow
Детальный процесс обработки данных с нескольких сенсоров представлен на диаграмме выше.

При практически любой разработке один из главных критериев для исполнителя – интерес. После так как несколько лет подряд я реализовывал однотипные веб-приложения на ASP.NET и PHP, хотелось чего-то нового и более, скажем так, умного. В веб-разработке (за редким исключением) все уже придумано. Ну сайт, ну сервис, ну база данных. В случае работы с сенсорами всегда возникают интересные и неоднозначные задачи, например, «а как бы передавать hd-video с сенсора по TCP, чтобы это не вешало систему?» (пример из жизни, хоть и было сделано очень давно). И сложно предугадать, что для улучшения и развития системы понадобится следующим. Понятно, что есть основной спринт разработки, где расписаны глобальные и заранее запланированные улучшения. Но такие локальные подзадачи – это одно из самых интересных в ремесле программиста.

Такую работу точно не назвать рутинной. Если кому-то стало интересно узнать более подробно, или кто-то захочет узнать, с чего начать в этой сфере – я открыт для общения. Готов ответить на любые вопросы :) And may the force be with you!
Only registered users can participate in poll. Log in, please.
Хотели бы Вы работать с бесконтактными сенсорами?
17.5% Да, есть опыт 7
65% Да, нет опыта, но интересно 26
7.5% Нет, пробовал, не интересно 3
10% Нет, не пробовал, и не собираюсь 4
40 users voted. 4 users abstained.
Tags:
Hubs:
+9
Comments 6
Comments Comments 6

Articles