×Закрыть

DOU Labs: как в Plarium научили говорить 800-килограммового робота

В рубрике DOU Labs мы приглашаем IT-компании делиться опытом собственных интересных разработок и внутренних технологических инициатив. Вопросы и заявки на участие присылайте на editors@dou.ua.

Гостей нашего офиса встречает 3-метровый робот из металла — точная копия стратегического юнита Молот из игры «Правила войны». Собирали его профессиональные кузнецы, о чем написана отдельная статья. Я же расскажу, как мы научили его говорить.

Робота установили в офисе в феврале 2016-го, но идея подарить ему голос возникла лишь через год. За реализацию взялся я и еще четыре сотрудника. Сразу скажу, что задача была довольно простой и никаких хитрых решений не понадобилось. На обсуждение, кодинг и тестирование ушло около двух недель.

260 фраз на трех языках подготовила команда копирайтеров и локализаторов. На английском Молота озвучил актер Эзра Найт, на русском и украинском — Дмитрий Петров, актер театра им. Шевченко и «Березиль» в Харькове. Затем голоса роботизировали с помощью программы Ableton.



После непродолжительного обсуждения мы решили, что Молот должен случайным образом произносить одну из заранее подготовленных фраз, когда кто-то проходит мимо по лестнице. Чтобы он не мешал сотрудникам, мы задали временные промежутки работы — с 9:00 до 10:00 утром и с 18:30 до 20:00 вечером.

Хотя в Молоте уже была плата Arduino Uno, которая отвечала за повороты головы, там не хватало дополнительной периферии, и мы нашли другое решение. Выбрали миникомпьютер 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 задачи:

  1. REST API.
    Взаимодействие с web-интерфейсом (отправка/получение настроек сервера, загрузка файлов).
  2. Работа с датчиком расстояния.
    Работа с датчиком расстояния выполняется с помощью Python-модуля для Raspberry Pi — RPi.GPIO. Опрос датчика выполняется в бесконечном цикле с интервалом, который задан в настройках сервера. Для корректной работы Web API цикл опроса датчика запускается в отдельном потоке сразу после запуска Flask.
  3. Воспроизведение голосовых файлов.
    Из-за сжатых сроков разработки для воспроизведения аудио на Python была выбрана библиотека Pygame, поскольку опыт работы был только с ней. Для небольших аудиофайлов (до 2 MB в формате mp3) эта библиотека отлично подошла, никаких заиканий или задержек при воспроизведении нет. Трек для воспроизведения выбирается случайным образом из загруженных.

Создатели Молота предусмотрели возможность поворота головы и поставили туда сервопривод, поэтому в планах также подключить голову к Raspberry, чтобы робот поворачивал ее в сторону лестницы, когда говорит фразу.

LinkedIn

29 комментариев

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.
микроконтроллер Arduino

не буває мікроконтроллерів Arduino!!!
Arduino це плата з AVR (в більшості випадків), або STM32 мікроконтроллером.

Звичайно не буває!!! Всередені стандартна Arduino UNO з atmega328 :)

Тоді відредагуйте фразу в тексті не

микроконтроллер Arduino

, а плата

Arduino UNO

.

SR-04? Да он уже с полутора метров человека через раз видит!
Блин, да это просто антиреклама компании: столько денег заплатили за железо, а по софту — заинтересованный школьник за пару месяцев сделал бы больше.
Веб-интерфейс сделали — а камеру не поставили?
Камера + простейшее распознавание движения -> будет следить взглядом за проходящим мимо.
Лидар за $90 плюс шаговый движок — и будет точно знать всю обстановку в радиусе 40 метров, можно менять фразы в зависимости от поведения людей.
Светодиоды в глаза плюс несколько дополнительных фраз — удвоит интерактивность.
Это все не требует ни знаний, ни умений, ни времени — только желание.

Если чуток постараться, то можно навесить на него много комп. зрения (стерео, лидар, если есть деньги то тепловизор, объединить данные, визуализировать детекцию объектов, людей, лиц и прочего), поставить рядом монитор куда это выводится, сделать движения головы внятными — и будет действительно интересно и мотивирующе. А так — НИОЧ

цей лідар саме те що треба для проекту: www.kickstarter.com/...​anse/sweep-scanning-lidar

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

Датчик вполне себе справился с задачей, так как перекрывает лестницу. Когда никого нет, показывает 3 метра, когда кто-то проходит, 1.2, на это значение и захардкодили, работает отлично. Заплатили около 0$ так как делали just for fun в свободное время. Лидар, тепловизор, лазерная туррель ;) зачем все это? RGB-светодиоды в глазах уже есть, цвет меняют. Публикацию действительно стоит рассматривать как дополнение к основной статье о создании робота. Всем добра.

зачем все это?

А зачем робота вообще делать было? ))

Отлично! Но тогда зачем было ему такую грустную электронику ставить?

Малина — очень даже веселая электроника для такой задачи. И usb-камеру с распознаванием образов она тоже вытянет без проблем, и с OpenCV небольшой опыт имеется, но зачем все усложнять.

Малина такое, odroid по всем параметрам лучше, но ее тоже на многое хватит. Если ее использовать конечно — тут она не используется практически.

но зачем все усложнять

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

Судя по статье робот год стоял просто так. Ребята захотели его озвучить и сделали это, потратив столько времени, сколько хотели. При чем тут уважение к кузнецам? Захотят еще что-то сделать, сделают. В конце концов кузнецам за это заплатили, а озвучка была фаном судя по всему.

озвучка была фаном судя по всему.

Исходя из текста статьи, не похоже:

260 фраз на трех языках подготовила команда копирайтеров и локализаторов

Сделать модель огромного стального робота — супер круто, фан, респект, невероятная работа.
Придумать и озвучить 260 фраз для него — отлично, круто, фан, респект, много работы.
Добавить к первым двум простейший дальномер и веб-интерфейс чтобы включать/выключать записи — не круто, не фан, несущественное количество работы.

не та ли эта компания , которую в интересном сайте несколько раз высвечивали?

Та, любая контора может попасть на дружелюбное.айти, в зависимости от буйности фантазии автора.

Боже! И не стыдно школьными поделками хвастаться? Ну добавьте один из 3 опенсурсных движков распозавания речи, добавьте камеру, сделайте распознвание лиц, добавьте тот же фестиваль.

Ну как бы автор написал
«Сразу скажу, что задача была довольно простой и никаких хитрых решений не понадобилось. На обсуждение, кодинг и тестирование ушло около двух недель.»

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

а що казатиме ? слава азімову ! першому закону слава ! :)
пфф, та звичайно по українські , в майбутньому московії нема :)

На укр языке вообще ржака))))

Ем...робот каже, що «він на запобіжнику». З чого тут сміятися?

Є така, нажаль, форма невігластва, коли будь-яка україньска лексика складніше слів з абетки для дошкілят здається ржачною.
Але можливо, пан Решетніченко знайшов якийсь інший привід для гумору.

Ой слишком плоско и агрессивно

Коментар Dany дійсно такий, як ви кажете. Тут я з вами згоден.

Я чомусь так і подумав, дякую, що підтвердили мої думки.

Подписаться на комментарии