Вы, наверное, сталкивались с роботами, которые могут имитировать вашу осанку. В противном случае вы, возможно, видели программное обеспечение, которое может отслеживать ваши позиции и использовать их для анимации и игрового дизайна. Отслеживание позы — довольно распространенная технология. Но для большинства методов требуются мощные аппаратные и программные компоненты. Что, если бы существовал простой и наивный способ имитировать движения человека с помощью робота? Я хотел сделать что-то подобное для удовольствия, поэтому я попытался написать очень простой код с использованием JavaScript, для которого требуется только веб-камера (без других датчиков), а затем использовать его вместе с роботом-гуманоидом для имитации поз. Это просто очень наивный метод, предназначенный только для удовольствия от оценки осанки в JavaScript, поэтому, пожалуйста, не обращайте внимания на небольшие ошибки, которые возникают при выполнении того же самого 😉.

Коды для проекта

Все коды можно найти в этом репозитории GitHub.

Введение

Poser — простой и примитивный, но эффективный и дешевый робот для отслеживания осанки. Требуется просто веб-камера, чтобы отслеживать движения вашего тела и преобразовывать их в 2D-координаты, предсказывать угол поворота и, наконец, имитировать положение вашего тела.

Меня вдохновило сделать это, когда я наткнулся на модель Tensorflow.js PoseNet, которая выводит координаты конкретных ключевых точек тела человека из входного изображения. Я хотел использовать эти координаты для чего-то более интересного 😉. Тогда у меня возникла идея: если бы я просто соединил эти точки, то мог бы действительно предсказать степень поворота части тела, учитывая ее длину. Если мы считаем, что тело-мишень находится в плоскости, то, глядя на него перпендикулярно, чем больше расстояние между двумя соседними точками тела, тем больше мы можем предположить, что часть тела обращена к нам (точка обзора).

Учитывая два соседних сервопривода для соединений подвижной части тела, один сервопривод является основным сервоприводом, а другой - вторичным. Например. Сервопривод плечевого сустава является основным сервоприводом, а сервопривод локтевого сустава — вторичным сервоприводом. Вторичный сервопривод автоматически вращается, когда вращается основной сервопривод. Они закреплены в двух разных плоскостях, так что вторичный сервопривод движется с вращением основного сервопривода.

Используя концепцию перспективы, мы можем получить угол, на который должен вращаться первичный фиксированный сервопривод, чтобы линия, соединяющая оба сервопривода, достигла наклона целевой части тела. Вычисляется евклидово расстояние между любыми двумя ключевыми точками (двумя соединениями тела). Мы также отслеживаем максимальное евклидово расстояние, усредненное за фиксированное количество итераций для этой части тела. Затем длина отображается из диапазона [0, максимальное евклидово расстояние] в [0, 180] градусов. Затем мы сохраняем этот угол поворота вместе с углом поворота для других частей тела и, наконец, отправляем его в Arduino робота.

Поскольку я использовал Tensorflow.js, оценка позы происходит в браузере. Поэтому я написал простой интерфейс, который запускал модель PoseNet. Он принимает изображение с камеры (с целевым человеком), генерирует положения ключевых точек тела и прогнозирует угол поворота для каждого сервопривода. Затем он отправляется на простой бэкэнд Node JS, на котором работает сервер Express, а затем отправляется на Arduino через последовательный порт.

Строительство тела

Примечательно, что многие проблемы были поставлены и решены. Поскольку у меня не было доступа к сложному оборудованию или дорогим деталям, мне пришлось построить верхнюю часть тела гуманоида, расплавив и придав форму пластиковым трубам и коробкам. Я использовал Arduino Mega и 10 сервоприводов MG995 для сборки корпуса и два микросервопривода для ушей. Мне было лень проектировать печатную плату, поэтому я просто спаял компоненты на перфорированной плате, которая оказалась еще более громоздкой и успешно превратилась в джунгли проводов.

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

Наконец, мой робот имитировал мои позы в реальном времени. Было много ошибок. Это было действительно важно, потому что текущие методы отслеживания осанки полагаются на дорогие датчики и сложную обработку, в то время как Pose Imitator использует только веб-камеру, приличный ноутбук и функциональное роботизированное тело, чтобы делать то же самое, хотя и менее эффективно.

Запуск внешнего интерфейса

Просто скопируйте репозиторий. Введите npm install, чтобы установить необходимые пакеты. Затем запустите node backend.js Интерфейс будет доступен по следующему адресу: http://127.0.0.1:4040/file/poseImitatorFrontend.html