Привет geektimes. Head tracker, иногда его же называют инерционный трекер — устройство, которое отслеживает движение головы в пространстве, то есть в трёх осях — X,Y,Z.
Сегодня я вам поведаю, как можно двигать курсор мыши при помощи движений головы, хотя, всё не ограничивается одной только репой, можно использовать и любую другую подвижную часть тела, как, например руку.
Данное видео, по большей части, дублирует текст статьи.
Целевая аудитория у этого устройства, как я это вижу в данный момент, примерно будет такая:
- Геймеры, это решение отлично подходит для всякого рода авиасимуляторов, будь то War Thunder или космических симуляторов, как например Elite Dangerous(чуть ниже будет пример использования), да и симуляторов вообще, где мышь по большей части используется для обзора, хотя говорят, что в Arma 2 тоже неплохо играется. Я же в начале ролика продемонстрировал работу в GTA5 с включённым видом от третьего лица, и скажу вам, что это совсем другие ощущения от игры, хотя и целится сложно, и есть ещё кое какие нюансы конкретно в этой игре, как например — всё же приходится немного «подруливать» мышкой;
- Люди с ограниченными возможностями, я думаю если серьёзно развить эту тему, то можно облегчить пользование компьютером для людей, которым пользоваться им затруднительно;
- Разработчики устройство VR(виртуальной реальности);
- RC моделисты и коптероводы;
- Такие же технологические гики, как и я.
Для того чтобы повторить этот девайс нам понадобятся следующее железо:
— Arduino, лучшее решение в данном случае это Arduino Nano V3(стоит недорого, относительно небольшие размеры), обязательно чтобы плата была с микроконтроллером ATmega328 на борту. Так же было бы не плохо, чтобы в ардуинке был USB to UART преобразователь на чипе CH340:
Дабы не возникало проблем с нехваткой памяти у микроконтроллера или драйверами, как например с ардуинками на базе чипов FT232RL.
Код, как видно из скрина выше, занимает около 16-ти килобайт памяти микроконтроллера, чего точно не хватит, если ардуинка будет на базе ATmega168, хотя конечно можно и вырезать не совсем нужный функционал из прошивки и таким образом попытаться уместить. Правда, зачем?
Драйвера к чипу CH340G ищите в первых ссылках по запросу «ch340g driver» в гугле, или же в архиве к данной статье.
— Датчик GY-85, это трех осевой гироскоп MPU3200, акселерометр ADXL345 и магнитометр HMC5883L на одной плате. Этого более чем достаточно чтобы ориентироваться в пространстве в трёх осях.
Он лучше всего себя показал, не требует предварительных калибровок, подключили, прошили ардуинку и работает. Хотя AHRS(Курсовертикаль) прошивка и позволяет калибровку, но это отдельная тема, которая, как я считаю, раскрыта более чем полностью на форуме по игре WarThunder;
— Разная мелочь — провода, паяльник (без него не обойтись, потому, как Arduino Nano и GY-85 приходят из Китая в распаянном состоянии),USB удлинитель, Mini-USB кабель для Arduino Nano V3.
Сборка Head Tracker'а:
Подключаем Arduino и GY-85, в случае Arduino Nano это будет так:
- VCC_IN -> 5V;
- SCL -> A5;
- SDA -> A4;
- GND -> GND.
Подаём питание на ардуино — на датчике должен засветился светодиод.
В случае Head Tracker'а датчик идеально прикрепить на ободок наушников, вот так по «криворукому» это сделал я:
Уверен, что вы это сделаете куда аккуратнее, чем меня.
Arduino плату прикрутил обычным проводом от витой пары, дабы ничего не закоротить на плате изоляцию с провода не снимал, всё нормально держится, если её постоянно не теребить.
По поводу не теребить плату, я просто скрутил USB кабель и провод наушника тем же проводком от витой пары.
Так же сначала хотел поступить и с датчиком, но путём проб и ошибок выяснил, что это не вариант, я напишу ниже почему. Просто связал всё ниткой, получилось вот так:
Под датчик, как и под ардуинку, подложил кусочек вспененного полиэтилена, чтобы они не царапали мне наушники, да и так лучше держится всё это.
Правда тут есть кое-какие моменты, важно датчик располагать таким образом, чтобы стрелка Y указывала на монитор.
Так же надо датчик держать подальше от металлических предметов, рекомендуемое расстояние 5-10 см. В противном случае могут быть искажение показаний, глюки в работе датчика. Это актуально для тех, у кого металлический ободок наушников. Хотя искажать показания может не только металл, но и сама ардуинка или даже провода, что и было продемонстрировано на видео, так что постарайтесь отдалить всё это от датчика хотя бы на расстояние 5-10 см.
Самое простое решение с металлическим ободком наушников — губка для мытья посуды:
Так как у меня ободок пластиковый (было проверенно магнитом), я забил на всё это.
Прошивка:
Если у вас всё ещё не установлена последняя версия Arduino IDE — качаем и устанавливаем. На момент написания статьи это 1.6.8.
В нашем инерционном трекере будем использовать кастомную прошивку проекта AHRS Firmware for the SparkFun 9DOF Razor IMU and SparkFun 9DOF Sensor Stick. В Arduino IDE открываем файл Razor_AHRS.ino, который лежит в архиве по пути DIY headtracker\RazorAHRS_FaceTrack\Razor_AHRS:
И загружаем прошивку в ардуино:
Настройка OpenTrack:
OpenTrack — это бесплатная программа с открытым исходным кодом, предназначена для отслеживания движений головы пользователя и их преобразование в координаты. Умеет работать с разными устройствами ввода, включая ИК-рамку и Oculus Rift или же со смартфонами.
На видео, чувак играет в культовую игру Elite Dangerous, используя свой Android смартфон в качестве мыши:
Это позволило задействовать обе руки для игрового процесса. Согласитесь, выглядит очень круто. Правда мне в этой реализации не нравится несколько нюансов, а именно, смартфон относительно громоздкий и тяжёлый, GY-85 явно занимает места и весит меньше, к тому же от него не долбит в голову излучение от WiFi передатчика смартфона.
Подробнее можно почитать тут:
https://github.com/opentrack/opentrack/wiki/Smartphone-Headtracking
Но давайте вернёмся к нашим
Теперь нам надо настроить программу — в поле «Tracker» выбираем «Hatire Arduino» и нажимаем кнопку "..." и мы увидим что-то типа этого:
Здесь надо изменить «Serial port» на COM порт нашей ардуинки, в моём случае это COM42. Дальше переходим во вкладку «Command», прописываем там, в полях «Init» и «Start» 1000, затем выставляем «BaudRate» 115200, и напоследок жмём «Save» и «OK».
Дальше в главном окне программы нажимаем кнопку «Start», начинаем вращать датчик в разных осях и следить за осьминогом. Скорее всего, движения датчика и осьминога будут отличаться, по крайней мере, в моём случае так получилось, не останавливая трекинг жмём кнопку "..." в поле «Tracker». Здесь нам нужно настроить «Axis Configuration» таким образом, чтобы движения датчика совпадали с движениями осьминога в программе — выставляем для «Yaw», «Pich» и «Roll» значения RotX/RotY/RotZ в нужной последовательности, в этом нам поможет вот эта картинка:
Как получилось у меня, можете увидеть на скрине настроек «Hatire Arduino» что выше. Ось «Roll» пришлось инвертировать, потому что осьминог крутился в обратные стороны.
Так же программа позволяет настраивать чувствительность для каждой из осей — кнопка «Mapping» в главном окне программы:
Правой кнопкой мыши можно ставить и перемещать точки, левая кнопка мыши удаляет точки, можно ставить несколько точек, чтобы устранить нелинейность в показании датчика, если таковые имеются. У меня же всё оси настроены вот так:
Вкладка «Filter» в головном окне программы позволяет изменять тип фильтра, или же вообще его отключить, в этом случае показания будут очень нестабильными и резкими. У меня тип фильтра стоит «Accela» вот с такими настройками:
При желании можете поиграться с настройками.
Переходим к настройке эмуляции мыши, для этого во вкладке «Protocol» выбираем «mouse emulation» и нажимаем кнопку "...", там надо выставить «Yaw» и «Pich» для осей X, Y:
Нажимаем кнопку старт и вуаля — профилактика шейного остеохондроза. И напоследок добавлю, что перед нажатием кнопки старт надо ровно установить голову относительно монитора, потому что датчик в этот момент производит калибровку.
Итоги:
Плюсы перед вариантом с использованием веб камеры и ИК светодиодами:
- Скорость, данная прошивка выдаёт примерно 60 чтений на секунду, что примерно равно с веб камерой на 60 fps, но мне кажется, что вебка на 60 кадров на секунду стоит явно дороже GY-85 и Arduino платы;
- Нет зависимости от освещения;
- Так как почти всё вычисления производить ардуино, то разгружаются ресурсы процессора компа, то есть меньше глюков в играх;
- Можно использовать не только для игр, но и облегчить пользование ПК для людей с ограниченными возможностями.
Минусы:
- Проводное подключение, что в принципе решаемо при помощи Bluetooth модуля, например как HC-05/HC-06. Прошивка поддерживает такую возможность.
- Датчик относительно дорогой, я свой покупал за 8 долларов, что считаю завышенной ценой;
- Портиться эстетичный вид наушников, но я уверен, что вы сделаете лучше, чем я.
Наверняка у многих появится вопрос, какой смысл крутить голову вокруг монитора если тот стоит на месте? Как было мною сказано на видео, это всего лишь начало темы VR на на моём YouTube канале.
Полезные ссылки по теме:
Архив к статье, со всем необходимым;
Ветка форума по игре WarThunder, где есть много чего интересного по теме статьи;
Всегда свежая версия Arduino IDE;
Проект AHRS Firmware for the SparkFun 9DOF Razor IMU and SparkFun 9DOF Sensor Stick;
Кастомная прошивка проекта выше, заточенная под работу с программой OpenTrack;
Похожий проект с использованием смартфона в качестве датчика положения;
Всегда свежая и рабочая версия программы OpenTrack лежит тут;
Похожая публикация от товарища Сергей Новосёлов SergeNovo
Самодельный инерционный трекер для 3-D очков и не только;
Все мои публикации на geektimes.
P.S. Есть ещё вариант, когда OpenTrack не эмулирует движения мыши, а напрямую взаимодействует с игрой, но об этом я может, напишу как-нибудь в другой раз, или вы разберетесь в этом сами, вектор для развития этой темы я задал;
P.P.S. Если кому надо, вот схема GY-85:
Комментарии (27)
tesla254
04.05.2016 19:35+2Как вариант можно на затылок резинкой закрепить. И тогда пофигу есть металл в ободке или нет, главное чтоб в голове не было опилок… металлических.
MaxAlekseev
04.05.2016 19:50Шапочкой из фольги не воспользоваться… пичалька.
Zenitchik
04.05.2016 20:00Почему же? Датчик скорее всего только ферромагнетиков боится.
HWman
04.05.2016 20:19Датчик очень критично реагирует даже на медные провода, если смотрели видео то видели.
MaxAlekseev
04.05.2016 20:30+1Это проблема всех MEMS? И на каком расстоянии от чипа уже не ощущается наличие металла поблизости?
HWman
04.05.2016 20:22Rockerman
05.05.2016 07:28+1Если автор решит таки сделать очки виртуальной реальности своими руками, то подробное руководство
kharlashkin
05.05.2016 08:01Проволочки от витой пары и нитки вместо синей изоленты… А что, разве так можно?
mmMike
05.05.2016 08:36Ну а на практике как?
У всех этих «электронных» гироскопов и акселерометров весьма большой дрейф в покое. Отличить медленное движение от дрейфа фактически невозможно.
У меня пультик к телевизору (Smart TV) работает по этому же принципу.
Не сказал бы что очень удобно и точно позиционирует. С мышкой никакого сравнения.
mephy
05.05.2016 13:15Дрейфа на GY-85 вроде как быть не должно.
Я собирал такой для коптера, вот по этому гайду www.rcgroups.com/forums/showthread.php?t=1677559
Но никак не могу победить помехи. По схеме сборки на rcgroups GY-85 лежит прямо поверх ардуины.
У меня при таком конфиге жуткие глюки — поворачиваю голову вправо, сигнал идет как будто вправо и вниз и т.п.
После каллибровки получше, но все равно косячит. Возможно придется оставить одну ось.
Хотя на форуме жалоб мало, может у меня руки кривые.
Кстати, хоббикинг выпускал недорогие трекеры по этой схеме в хорошем корпусе. Назывались Quanum. Но почему-то перестали :-(
А другие трекеры уже дорогие.vasimv
05.05.2016 13:38Да сейчас проще купить полетный контроллер для коптера (если нравятся ардуинки — то на atmega328 или mega2560, совместимо полностью), оно там все собранное, с защитами от переполюсовки даже (диод на питании) и приличной разводкой. Заодно и барометры с компасами, зачастую.
mephy
05.05.2016 13:50У меня это трекер для головы :) На коптере Naza.
Камера на трехпозиционном подвесе, можно полное погружение устроить.
Вот только пока хорошо работает одна ось + вторая ось с пульта.
Может воспользуюсь «методом губки», но жалко — корпус распечатал, все там распаял красиво (там еще есть крайне удобная кнопка «обнулить положение»)
tonnchik
09.05.2016 17:43Приветствую, Сергей! Есть задача отследить положение одной части тела относительно другой с математической точностью, т.е. сделать MoCap для двух сегментов конечности (например, плеча и предплечья). Для этого планируется разместить два датчика GY85 на одном сегменте конечности, и два на другом. В связи с этим вопрос потянет ли это один модуль Nano V3? Хватит ли разъемов? Какие еще нужны компоненты для этого? В идеале бы сделать систему беспроводной. Хотелось бы услышать ваше мнение по этому поводу. Простите, если вопросы «ваапще» дилетантские)))
Спасибо.
berber
09.05.2016 19:54Проводное подключение, что в принципе решаемо при помощи Bluetooth модуля, например как HC-05/HC-06. Прошивка поддерживает такую возможность.
Как питать автономно такой вариант? Какое потребление тока будет?
PaulMaul
> хотя, всё не ограничивается одной только репой, можно использовать и любую другую подвижную часть тела, как, например руку.
Если голову называть репой, то руку нужно называть паклей. А то диссонанс выходит.
HWman
Просто не смог придумать синонима получше.