Разработка VR-жилета для игры в Cyberpunk 2077

Разработка VR-жилета для игры в Cyberpunk 2077

Владислав Ефименко
Владислав Ефименко Главный редактор
21 декабря 2024

Показываем процесс создания VR-жилета на микроконтроллере Raspberry Pi Pico W.

Изображение записи

Летом 2023 года мне пришла странная идея. Захотелось чем-то занять руки и придумать нескучный пет-проект. Самым ближайшим развлечением — к сожалению или к счастью — оказались игры.

Интересно, что большинство людей слышали про очки виртуальной и дополненной реальности, в то время как VR-жилеты проходили мимо моего окружения. Хотя это довольно интересный девайс, который с виду напоминает не самую модную куртку-безрукавку, но позволяет перенести ощущения из игры в жизнь. А в случае с тем же Cyberpunk 2077 — имитацию боли, которую чувствует персонаж. Согласитесь, внутренний мазохист хочет попробовать?

В этой статье расскажу, как я сконструировал наколхозил жилет виртуальной реальности и что из этого получилось. Спойлер: я не утрирую. Это мой дипломный проект, поэтому весь фокус был на MVP — не более.

Что есть на рынке

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

Популярные гаптические жилеты.
Популярные гаптические жилеты.

Скажу честно: глубинный анализ рынка я не проводил. Сложно даже найти истоки некоторых жилетов. Пару раз встречалось, что один девайс продавали под разными логотипами разные бренды. Для меня это признак китайского производства, которое, впрочем, мало чем отличается от западного в контексте жилетов. Они все состоят примерно из одних материалов и компонентов: тканей, ниток, пластика и сервоприводных моторчиков.

Стоимость девайса зависит от того, насколько много моторчиков вам нужно. Если хотите погрузиться в игру от ушей до пят — берите bHaptics Suit в модели с 40+ моторчиками, в противном случае — с шестью. При этом цена будет варьироваться от 30 до 100+ тысяч рублей.

Явные различия между VR-жилетами начинаются на уровне подключения к компьютеру. Тут довольно забавная ситуация: есть типа «беспроводные» жилеты со встроенными аккумуляторами, но с проводами для передачи данных. Если не хотите путаться в проводах при игре в тот же Cyberpunk — обращайте на это внимание. Можно напороться даже на жилеты с полноценными косами из проводов, которые работают от сети 220 В. Но здесь все зависит от задачи и условий.

Мне кажется, что игроки покупают гаптические жилеты для ощущения динамики, которой нельзя добиться без должной подвижности. Но как можно спокойно бегать в жилете и с VR-шлемом, если есть риск упасть и сломать девайс? Противоударной защиты у популярных рыночных решений нет. Этот пункт я занес в свой чек-лист.

Принцип работы VR-жилета

Что выбрать: электричество или механику? По сути, энтузиастам известны несколько способов реализации гаптических жилетов. И сервоприводные моторчики — не единственное решение. Есть так называемые OWO Haptic Vest — жилеты, которые по виду больше напоминают футболки и функционируют на базе небольших токов. Как это работает — хорошо показано в видео.

OWO Haptic Vest.
OWO Haptic Vest.

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

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

Имитация продолжительного тянущего воздействия (сверху) и электрического разряда.

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

Схема работы гаптического жилета.
Схема работы гаптического жилета.

Для меня самым сложным этапом был сбор данных из игры. С этим помог @Firemon — он подготовил мод для Cyberpunk, который позволяет получать координаты персонажа и информацию об уроне. Кроме того, Вова написал питонячий скрипт, который собирает эти данные в UDP-датаграмму и отправляет по Wi-Fi на жилет. Получилось круто — рекомендую прочитать статью.

Все, что связано с электроникой

Но кто принимает данные на стороне жилета? Я не хотел уходить далеко от Python, поэтому в качестве платы для управления моторчиками взял Raspberry Pi Pico W. RP2040 позволяет запускать скрипты на MicroPython, у платы достаточно GP-контактов для подключения 16 сервоприводов и есть встроенный модуль Wi-Fi — для моего проекта этого более чем достаточно.

В качестве моторчиков я использовал MG90 — просто потому, что они остались после предыдущего проекта. Есть более удачные альтернативы, хотя и этот вариант неплох: каждый сервопривод подключается три пина, дополнительные драйверы не нужны, да и мощность более ощутимая. Если использовать моторчики вроде тех, что установлены в джойстиках PS5, эффект будет незаметен. Так что смело применяйте в похожих проектах, но будьте внимательны: сервоприводные механизмы довольно ненадежны, если шестерни сделаны из нейлона. Лучше отдать предпочтение металлу.

Получилась такая функциональная схема:

Функциональная схема гаптического жилета.
Функциональная схема гаптического жилета.

Все предельно просто: есть Raspberry Pi Pico W, которая запитывается от Li-ion батарейки, к ней подключены через мам и пап 16 моторчиков. По Wi-Fi приходит сигнал об уроне — скрипт на MicroPython «декодирует» его и дергает нужные сервоприводы. На правую часть схемы с модулем и индикатором заряда можете не смотреть — вместо всего этого можно просто купить пауэрбанк. И он будет болтаться в кармане, будто вы носите Apple Vision Pro.

Но если вы все же хотите «пересобрать пауэрбанк», вам еще понадобится кнопка и либо диод Шоттки, либо выпрямительный диод. Только учитывайте, что во втором случае важно учесть падение напряжения, которое может быть до 0,6 В. Хотя конкретно с Raspberry Pi Pico W, которая на порту VSYS принимает от 1,8 до 5,5 В, это некритично.

Принципиальная схема гаптического жилета.
Принципиальная схема гаптического жилета.

Принципиальная схема довольно простая, ее легко можно разместить на одной плате.

Разводка платы гаптического жилета.

Брутальный корпус жилета

Выше я говорил, что тканевая основа, из которой делают гаптические жилеты на продажу, — не самый надежный вариант. Но есть и другая причина, почему я не решился повторить этот опыт: я не ательер. Мне показалось, что гораздо проще сделать жилет из пластиковых накладок, которые можно смоделировать в программе CAD и распечатать на принтере. Да, это дороже, но выглядит брутально.

За дизайном далеко ходить не пришлось. С брутальностью всегда ассоциировались образы байкеров, поэтому за основу взял жилет-черепаху, которую я зареверсинженерил в КОМПАС 3D:

Передняя и задние накладки гаптического жилета в КОМПАС 3D.
Передняя и задние накладки гаптического жилета в КОМПАС 3D. 
В руках — покупная мотоциклетная черепаха, в CAD — модель. Делал самостоятельно, китайцы чертежей в интернете не оставили. Пробовал использовать мобильные 3D-сканеры объектов, но это решение оказалось неработоспособным.

По сути, жилет состоит из нескольких пластиковых накладок: передней, задней и отсека для платы, который крепится на спине. Между собой накладки соединены с помощью текстильных лент, а сервоприводы от туловища отделяет тканевое основание — никакого rocket science.

Перфорация нужна дизайна ради. Ее можно использовать для светодиодной индикации — но до этого у меня просто не дошли руки. Проект делал впопыхах, так что приходилось колхозить.

Ожидание и реальность

Забавно, как брутально жилет смотрится в 3D-визуализации и в жизни. Собирал за ночь до защиты диплома, так что не судите строго: оно хоть и держится на добром слове, но работает. Макетные платы выручили как никогда.

Утро, за несколько часов до защиты. Проверяю, работает ли вообще.

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

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