Привет 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 headtrackerRazorAHRS_FaceTrackRazor_AHRS:
И загружаем прошивку в ардуино:
Настройка OpenTrack:
OpenTrack — это бесплатная программа с открытым исходным кодом, предназначена для отслеживания движений головы пользователя и их преобразование в координаты. Умеет работать с разными устройствами ввода, включая ИК-рамку и Oculus Rift или же со смартфонами.
На видео, чувак играет в культовую игру Elite Dangerous, используя свой Android смартфон в качестве мыши:
Это позволило задействовать обе руки для игрового процесса. Согласитесь, выглядит очень круто. Правда мне в этой реализации не нравится несколько нюансов, а именно, смартфон относительно громоздкий и тяжёлый, GY-85 явно занимает места и весит меньше, к тому же от него не долбит в голову излучение от WiFi передатчика смартфона.
Подробнее можно почитать тут:
https://github.com/opentrack/opentrack/wiki/Smartphone-Headtracking
Но давайте вернёмся к нашим баранам Arduino и GY-85. Для начала нужно скачать и установить последнюю версию программы(на данный момент это opentrack-2.3 rc21p11), запускаем:
Теперь нам надо настроить программу — в поле «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:
Автор: HWman