Магические жесты как вызов для электронщика
Волшебная палочка — это круто, но куда круче творить волшебство просто движением рук. Чтобы это стало возможным, в 2014 году мы занялись распознаванием жестов и сделали перчатку на акселерометрах для ролевой игры. Проект получился сложным и с далеко идущими последствиями.
Итак, игра «Есть такое ремесло» по миру Анджея Сапковского. Большинство персонажей — подростки с задатками ведьмаков, которые учатся в замке Каэр-Морхен. Им приходится потрошить монстров, варить эликсиры, фехтовать по особым правилам — и отрабатывать магические жесты. Кто-то гибнет, кто-то раскачивается до взрослого ведьмака.
Знаки Аард и Ирден в компьютерных играх по миру Анджея Сапковского.
Логично надеть на левую руку игрока (в правой-то меч) какое-то устройство для считывания движений пальцев — например, перчатку. Самым простым решением было бы использовать в ней тензорезисторы. Но в 2013–2014 годах тензорезистор стоил 110 рублей. Эта сумма, помноженная на пять пальцев и на 25 устройств, давала неподъёмные расходы. К сожалению, среднесерийное производство учит хорошо считать: мы должны были потратить не более 2 тысяч рублей на одну перчатку, и не могли позволить себе четверть этой суммы спустить на датчики.
Подбор компонентов и создание языка жестов
Мы обратились к акселерометрам. Акселерометр стоил вполне реалистичные 30 рублей.
Для первых экспериментов использовался всего один датчик, закреплённый на мече — и скоро стало понятно, что работать с динамическим движением, как хотелось изначально, не получается. Фактически, акселерометр давал только сведения о наличии-отсутствии взмаха.
Работа со статическими положениями вместо динамики была выбрана потому, что в статике мы могли чётко провести границу между тем, где нужное нам положение, а где — нет. В динамике же ускорения, которые возникают при вращении акселерометра могли оказаться похожими на что угодно.
Итак, стало понятно, что работать надо со статическими положениями.
Но какими? Человеческая рука обладает более чем 20 степенями свободы, стоит ли налепить акселерометр на каждую фалангу? Датчик стоит денег, да и пальцы у всех разной длины и гибкости…
Посредством акселерометра мы, говоря языком авиамоделистов, можем определить только два типа движений — крен (качание влево-вправо) и тангаж (вверх-вниз головой). А рысканье (повороты влево-вправо) — уже нет, ведь сила тяжести остаётся неизменной.
Акселерометр не видит разницы между двумя этими жестами. Проблема!
В итоге решили поставить по одному датчику на тыльную сторону ладони и по одному — на каждый палец, в районе третьей фаланги. Это давало некоторый простор для придумывания жестов.
Первый прототип выглядел как плата Discovery с подключёнными датчиками. Скрипт на питоне, который обрабатывал данные (шесть трёхстепенных датчиков — каждому положению перчатки соответствовал вектор из 18 чисел), мы никому не покажем — он не то чтобы совершенен, с 2014 года мы многому научились.
Тот самый первый прототип — он прекрасно воспринимает жесты Владимира Яшунского, своего главного разработчика.
Серийное производство и неожиданный поворот сюжета
Было записано эталонное значение, его сравнивали с получаемыми данными.
Ничего не предвещало беды.
За два месяца до игры была готова серия — 25 распаянных на проводах датчиков, наклеенных на строительные перчатки, подключаемые к 25 платам с аккумуляторами и светодиодами.
Рабочий процесс — припаивание светодиодов.
Каждый акселерометр был посажен на термоклей. А значит, занимал чуть-чуть другое положение. Новые перчатки с грехом пополам соглашались воспринимать жесты Владимира, но только его.
Прототип и серия.
Что делать? До игры два месяца, перчатки анонсированы, игроки учат жесты.
Теоретически, можно было под каждую перчатку сделать свою прошивку. Практически — ужасно не хотелось. Расширять допустимый диапазон движений тоже не хотелось, иначе жесты начали бы путаться друг с другом. Пришлось организовывать сбор статистики
Мы пригласили 10 человек (с разной длиной и гибкостью пальцев) и попросили каждого в каждой печатке сделать все жесты.
Волонтёр делал жест. Владимир убеждался, что система верно его распознала, подтверждал, что жест сделан допустимо и записывал значение в папку. Надо ли говорить, что усреднённые значения были мало похожи на те, которые выдавал сам Владимир?
Набрав статистику, для каждого жеста посчитали математическое ожидание и дисперсию.
Перчатка глазами пользователя
Жестов было придумано десять. Но одиночный жест, приводящий к положительному результату, чреват казусами. Довольно обидно поднять руку, чтобы поприветствовать человека, и нечаянно его испепелить.
Было принято решение отступить от текста Сапковского и в каждый Знак включить три жеста.
Первый жест — это инициирующий жест Знака, он уникален. На втором набирается сила, этот жест один и тот же. И завершается всё третьим — исполнительным — жестом. Таких было три вида.
Отступление. Человек и электроника
Есть такое правило — во всех своих неудачах человек склонен винить кого-то другого. И если неудача кажется связанной с электроникой — обвинят в проблеме электронику.
Для нас это означает вот что: если можно истолковать действие в пользу игрока, надо это делать. Но на пути доброты стоят ложно-положительные срабатывания, а их тоже не простят.
Для контроля правильности выполнения Знака сначала хотели написать кольцевой буфер. Но нельзя было допустить большое количество ложных срабатываний или, наоборот, несрабатываний. Поэтому пошли другим путём, через машину состояний. Если перчатку только включили, первым жестом может быть только один из пяти инициирующих жестов. Именно они вызывают слабую вибрацию, а «набор силы», сделанный первым, игнорируется.
Максимальная лояльность к пользователю проявлялась так:
После первого правильного жеста у пользователя есть 10 секунд, чтобы сделать второй правильный жест. В промежутке он может делать руками любую бессмыслицу.
Не засчитывается за ошибку вот что:
Смотрите, пользователь верно инициировал Аард (раскрытая ладонь), перешёл на набор силы, но замешкался и произвёл неправильный жест спуска. При кольцевой буферизации это прервало бы исполнение знака, пользователь был бы расстроен. Машина состояний игнорирует эту мелкую помарку. Пользователь вспоминает правильный жест спуска и перчатка срабатывает.
А где-то перчатка всё же могла подкинуть пакость.
Хотели оттолкнуть товарища знаком Аард, а ненароком сожгли похожим знаком Игни?
Между правильными исполнениями Аарда (раскрытая ладонь) и Ирдена (щепоть) есть ещё несколько неряшливых вариантов — 5 акселерометров направлены вверх, а тот, что на тыльной стороне ладони — нет. Это-то и чревато сюрпризами для ведьмачонка.
Решено было, что перчатка должна общаться с пользователем, и общаться она будет вибрацией (вибрацию мы используем часто, она позволяет создавать устройства без техногенных экранов, без демаскирующего звука и света —, но всё же умеющие общаться с пользователями).
При выполнении инициирующего жеста перчатка слабо вибрирует, на втором жесте вибрирует сильнее. Пользователям объясняли: это потому, что ты чувствуешь, как сгусток силы наполняет твою ладонь. Верно выполненный знак обозначался вспышкой соответствующего цвета, все на игре знали, как следует на такую реагировать.
Все игротехники — монстры, с которыми ведьмачата сражались — знали, как реагировать на свет перчатки. А сталкиваться приходилось, например, с такой мантикорой на джолли-джамперах.
Фото Лилии Барладян
Мерзкую болотную тварь ведьмачонок подпустил близко, чтобы наверняка отбросить знаком Аард.
Фото Лилии Барладян
Большая часть магии с перчаткой должна была происходить в ночное время, но на всякий случай на ней использовались обычные выводные светодиоды (более яркие, чем RGB). Кроме того, на выводных светодиодах нет риска перепутать цвета (те, кто работал с RGB, замечали, что в определённых ракурсах видно, что жёлтый свет — это комбинация красного и зелёного, и так далее).
У ведьмачки не получается жест. Под армированным скотчем видно аккумулятор от мобильного телефона, выше — вибромотор.
Фото Екатерины Григоровой
Лирическое отступление
Хорошо, когда у системы одна входная точка, после которой она что-то начинает распознавать. Окей, гугл. А что делать, когда таких точек пять? Пользователи регулярно чувствовали лёгкую вибрацию, сила бурлила в них.
Ведьмачонок в перчатке. На груди медальон — это простая электроника, цветовая индикация выпитых зелий.
Фото Елены Маврикиди
Потом мы приехали в лес. Там вылезло несколько проблем. Во-первых, никто не носил верхние — кожаные — перчатки, в них было неудобно. Так что на фотографиях можно наблюдать форменный киберпанк, но что гораздо неприятнее — провода из-за этого гибли. Несколько вибромоторов погибло, их перепаивали прямо на полигоне. Возможно, главной проблемой перчатки был год её создания. 3D-принтера у нас ещё не было, ничего не корпусировалось, всё держалось на термоклее.
Ведьмачка.
Фото Елены Маврикиди
Тем не менее, игра прошла без глобальных косяков.
Что дальше?
Вернувшись в Москву, постирав перчатки в стиральной машине (с отключённым контроллером и аккумулятором, конечно), придя в себя и посчитав убытки, мы задумались о модернизации.
Можно было бы использовать не шлейф IDE (он для носимой электроники вообще не предназначен и использовался от горькой бедности), а телефонный «рыжий шлейф».
И пускать его по кулиске в перчатке, так бы проблема со стиркой вообще не вставала бы.
И подключить ИК-светодиод, чтобы совместить перчатку с лазертагом.
И…
И тут в продаже появился миобраслет. Мы поиграли с ним и поняли, что дальше развивать перчатку не будем. Бесперспективно. Считывание сигнала с мышц куда удобнее сигнала с пальцев.
(Правда, для ролевого использования миобраслет не подходит из-за цены).
Перчатки съездили ещё на одну игру в Приморье и постоянно гастролируют по выставкам.
Считаем, что опыт был полезным, хотя местами и болезненным — он пригодился при создании браслета для распознавания динамического жеста, это наш свежий проект. Памятуя о том, как мы намучились с датчиками, припаянными на провода и распределёнными по ткани, в браслете обошлись двумя, напаянными на обычную надёжную плату. Перчатка работала в статике с большим количеством исходных данных (18 чисел с 6 датчиков), положение браслета описывается 2 числами (через алгоритм Махони преобразуем 9 значений, полученных с датчиков).
Тем не менее, есть те, кому экспериментировать с перчаткой интересно.
В 2015 перчатку показали участникам проектной школы, и некоторые посчитали её вызовом. Даниил Веловатый (тогда школьник, сейчас студент МФТИ) собрал свой вариант. В отличие от нас, он реализовал передачу данных с устройства и удивлял посетителей выставок тем, что дистанционно включал чайник знаком. Жестовый язык у Даниила тоже свой собственный.