DOU Labs: как в Plarium научили говорить 800-килограммового робота
В рубрике DOU Labs мы приглашаем IT-компании делиться опытом собственных интересных разработок и внутренних технологических инициатив. Вопросы и заявки на участие присылайте на Данный адрес e-mail защищен от спам-ботов, Вам необходимо включить Javascript для его просмотра. .
Гостей нашего офиса встречает
Робота установили в офисе в феврале
260 фраз на трех языках подготовила команда копирайтеров и локализаторов. На английском Молота озвучил актер Эзра Найт, на русском и украинском — Дмитрий Петров, актер театра им. Шевченко и «Березиль» в Харькове. Затем голоса роботизировали с помощью программы Ableton.
После непродолжительного обсуждения мы решили, что Молот должен случайным образом произносить одну из заранее подготовленных фраз, когда кто-то проходит мимо по лестнице. Чтобы он не мешал сотрудникам, мы задали временные промежутки работы — с 9:00 до 10:00 утром и с 18:30 до 20:00 вечером.
Хотя в Молоте уже был микроконтроллер Arduino, который отвечал за повороты головы, там не хватало дополнительной периферии, и мы нашли другое решение. Выбрали миникомпьютер Raspberry Pi. Во-первых, там уже есть Wi-Fi и аудиовыход, во-вторых, к нему можно подключить нужные датчики. Для детектирования проходящих людей отлично подошел ультразвуковой датчик расстояния HC-SR04.
Схема подключения стандартная:
Для датчика изготовили подходящий кожух и закрепили его на стволе пушки жидкими гвоздями. Подключение сделали черной витой парой. Raspberry Pi расположен под металлической крышкой в основании робота. Были опасения, что крышка будет экранировать сигнал Wi-Fi, но они не подтвердились — соединение с сетью стабильное. Еще на этапе сборки в основание робота установили два динамика и усилитель, что в какой-то мере упростило нашу задачу.
Сначала мы хотели, чтобы за файлы, которые нужно выливать на сервер, отвечали админы. Но решили возложить управление роботом на офис-менеджеров, так как они находятся непосредственно рядом с ним. Для удобства управления мы настроили web-сервер, позволяющий обновлять голосовые файлы и изменять расписание работы Молота.
Чтобы ускорить разработку UI, нашли готовый шаблон, который включает нужные компоненты. В нем уже подключена библиотека Bootstrap и реализована базовая архитектура, что позволило не тратить время на рутинные задачи. Сам веб-сайт — это так называемое одностраничное приложение, клиентская часть которого выполнена с использованием библиотеки AngularJS. Серверная часть представляет собой Web API с набором методов и реализована с использованием микрофреймворка Flask. Взаимодействие между клиентом и сервером происходит в формате JSON.
Управление расписанием работы датчиков осуществляется через специальное окно, где есть возможность выбрать датчик и задать ему время включения/отключения. При необходимости можно отключить все датчики, сняв флажок Enabled.
После нажатия на кнопку Save конфигурация отправляется на сервер. Структура отправляемых данных:
Для реализации выгрузки файлов на сервер был использован проект angular-file-upload с последующей доработкой.
После выгрузки файлов на сервер в отдельном окне их можно включать либо отключать из списка воспроизведения.
После нажатия на кнопку Save плейлист сохраняется на сервере.
Пример структуры данных, отправляемых на сервер:
Специально была добавлена страница с кратким руководством.
Все настройки хранятся в текстовых файлах и включают в себя расписание (когда роботу можно разговаривать) и список файлов для воспроизведения (на английском, украинском и русском языках). Серверная часть реализована на Python. В основе реализации Web API лежит библиотека Flask, так как она содержит удобные аннотации для описания URL-адресов и HTTP-методов.
Серверная часть выполняет 3 задачи:
- REST API.
Взаимодействие с web-интерфейсом (отправка/получение настроек сервера, загрузка файлов). - Работа с датчиком расстояния.
Работа с датчиком расстояния выполняется с помощью Python-модуля для Raspberry Pi — RPi.GPIO. Опрос датчика выполняется в бесконечном цикле с интервалом, который задан в настройках сервера. Для корректной работы Web API цикл опроса датчика запускается в отдельном потоке сразу после запуска Flask. - Воспроизведение голосовых файлов.
Из-за сжатых сроков разработки для воспроизведения аудио на Python была выбрана библиотека Pygame, поскольку опыт работы был только с ней. Для небольших аудиофайлов (до 2 MB в формате mp3) эта библиотека отлично подошла, никаких заиканий или задержек при воспроизведении нет. Трек для воспроизведения выбирается случайным образом из загруженных.
Создатели Молота предусмотрели возможность поворота головы и поставили туда сервопривод, поэтому в планах также подключить голову к Raspberry, чтобы робот поворачивал ее в сторону лестницы, когда говорит фразу.