Технический челлендж ETSIIT: от студентов к предпринимателям с Locaviewer
Год назад мы начали IV технический челлендж ETSIIT (видео). Кто мы? Мы — четверо студентов электротехники и информатики в Университете Гранады, Испания.
Наша команда Prometheus одержала победу в Tech Challenge, спонсируемом RTI. Команды из четырех-пяти студентов должны были создать продукт, решающий реальную проблему, поставленную внешним партнером. Тема этого года — «Мульти-агентная распределенная видеосистема».
Мы участвовали, чтобы получить практический опыт. Год спустя, все еще обучаясь, мы выявили коммерческую возможность, спроектировали конкурентный продукт Locaviewer, разработали рыночную стратегию и построили работающий прототип — всё это параллельно с учебой.
Locaviewer
Многие родители беспокоятся о здоровье и прогрессе своих детей в детских садах. Locaviewer дает родителям видимость их ребенка в реальном времени. Мы выпустили промо-видео для демонстрации решения, а исходный код доступен под лицензией MIT на GitHub.
Организация команды и график
Проект потребовал примерно 250 часов. Мы встречались еженедельно минимум на четыре часа, увеличивая до 20 часов в неделю в последний месяц. Для максимальной эффективности мы разделились на две подкоманды: одна фокусировалась на алгоритме внутренней Bluetooth-локализации, другая — на видеозахвате, кодировании/декодировании и распространении через RTI Connext DDS.
Алгоритм локализации
Ключевым элементом нашего решения было определение местоположения каждого ребенка внутри детского сада. Каждый ребенок носил браслет с Bluetooth-сенсором, который постоянно сообщал индикатор мощности принятого сигнала (RSSI) к стационарным донглам на стенах комнаты. Мы сопоставили значения RSSI с расстоянием, установив надежную зависимость.
Показания RSSI передавались на мини-компьютер (Raspberry Pi или MK802 III) с алгоритмом триангуляции для определения местоположения каждого ребенка. Зная позиции камер, мы могли выбирать оптимальную камеру для каждого ребенка.
Приложение видеозаписи
Мы использовали GStreamer для Java для обработки видеозахвата, кодирования, декодирования и отображения в реальном времени. Альтернативы вроде vlcj не поддерживали Raspberry Pi или не соответствовали нашим требованиям по задержке. После обширного исследования GStreamer оказался подходящим, позволяя получать доступ к закодированным видеобуферам через элементы AppSink и AppSource и публиковать их в DDS-топик.
Мы выбрали кодировщик VP8 (WebM). Из-за совместимости Java-обертки с GStreamer 0.10 нам пришлось снизить разрешение под ограничения платформы. Наша тестовая конфигурация использовала Raspberry Pi, с планами миграции на MK802 III для большей вычислительной мощности при сохранении стоимости.
Следующий фрагмент Java создает кодировщик VP8:
Element codec = ElementFactory.make("vp8enc", null); codec.set("threads", 5); codec.set("max-keyframe-distance", 20); codec.set("speed", 5); Element capsDst = ElementFactory.make("capsfilter", null); capsDst.setCaps(Caps.fromString("video/x-vp8 profile=(string)2"));
На стороне клиента мы настроили конвейер следующим образом:
Java-код для декодера VP8:
String caps = "video/x-vp8, width=(int)320, height=(int)240, framerate=15/1"; Element capsSrc = ElementFactory.make("capsfilter", null); capsSrc.setCaps(Caps.fromString(caps)); Element queue = ElementFactory.make("queue2", null); Element codec = ElementFactory.make("vp8dec", null); Element convert = ElementFactory.make("ffmpegcolorspace", null);
Мы экспериментировали с JPEG-кодированием, но его больший размер пакетов делал потоковую передачу в реальном времени непрактичной.
Архитектура DDS
Модель publish-subscribe была центральна для нашего решения, устраняя необходимость управлять сокет-соединениями вручную. Мы абстрагировали взаимодействие с DDS через собственную обертку DDStheus.
Наша итоговая система состояла из шести программ, использующих три топика, реализованных на трех языках:
- Python для низкоуровневой работы с Bluetooth.
- MATLAB/Octave для скриптов триангуляции.
- Java для интеграции с RTI Connext DDS и разработки GUI.
Нам требовались все значения RSSI из комнаты, поэтому мы написали скрипт для настройки донглов и сбора данных RSSI. Эти значения передавались в Java-программу через локальный сокет. Java-приложение публиковало данные в топик Sensor Data, включая ID ребенка (MAC сенсора), ID донгла, позицию, текущую комнату (как ключ для фильтрации), значение RSSI и время истечения.
После видеозахвата и кодирования Java-программа Gava передавала поток через топик Video Data, помечая каждый пакет ID камеры и информации о комнате. Мы использовали ContentFilteredTopic для фильтрации потоков по позиции камеры и комнате.
Метаданные камеры — ID, комната и позиция — хранились в поле USER_DATA QoS каждого издателя. Мини-компьютер триангуляции мог обнаруживать все камеры в комнате, определять новые или оффлайн-камеры в реальном времени и корректировать алгоритм выбора камеры соответственно.
Финальный этап включал агрегацию сенсорных и видеоданных в топик Child Data. Комнатный сервер — реализованный на Raspberry Pi или MK802 III — триангулировал местоположение ребенка и выбирал лучшую камеру. Он фильтровал сенсоры по комнате, получал информацию о камерах, запускал Octave-скрипт для вычисления позиции ребенка и оптимальной камеры, и публиковал результат в облако. ID ребенка и качество видео использовались как ключи фильтра для эффективной подписки.
Для оптимизации ресурсов комнатный сервер запускал скрипт триангуляции только когда подписчик запрашивал данные для конкретного ребенка, определенного через обнаружение подписчиков и фильтры ContentFilteredTopic.
Мы также реализовали механизм отказоустойчивости: каждый мини-компьютер публиковал приоритетный ID в USER_DATA. Узел с наименьшим ID становился активным сервером до присоединения нового узла с еще меньшим ID.
Интернет вещей
- FAQ вебинара по удаленному доступу — Полные ответы
- GBCC запускает утренние занятия по композитам для сменных работников
- Ливанский клиент проходит обучение на ЧПУ, плазменном и лазерном оборудовании на нашем заводе
- Клиенты из Иордании посетили завод для знакомства с 3-осевыми деревообрабатывающими станками
- Канадские клиенты на заводе Blue Elephant: инспекция 1530 пневматического 3-шпиндельного фрезера
- Эксперт-инженер проводит передовое обучение в Дубае на ATC-фрезере ELE2140 с карусельным магазином
- Катарский клиент посетил завод: демонстрация 1530 двухшпиндельного ЧПУ-фрезера
- Клиент из Бенгалии посетил завод для приемки нового ЧПУ-деревообрабатывающего фрезера
- Индийские клиенты инспектировали завод и заказали кастомный ELE1325 ЧПУ-фрезер
- Корейский промышленный посетитель осмотрел производство ЧПУ-фрезеров на нашем заводе