image

Привет geektimes. Head tracker, иногда его же называют инерционный трекер — устройство, которое отслеживает движение головы в пространстве, то есть в трёх осях — X,Y,Z.

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


Данное видео, по большей части, дублирует текст статьи.

Целевая аудитория у этого устройства, как я это вижу в данный момент, примерно будет такая:
  • Геймеры, это решение отлично подходит для всякого рода авиасимуляторов, будь то War Thunder или космических симуляторов, как например Elite Dangerous(чуть ниже будет пример использования), да и симуляторов вообще, где мышь по большей части используется для обзора, хотя говорят, что в Arma 2 тоже неплохо играется. Я же в начале ролика продемонстрировал работу в GTA5 с включённым видом от третьего лица, и скажу вам, что это совсем другие ощущения от игры, хотя и целится сложно, и есть ещё кое какие нюансы конкретно в этой игре, как например — всё же приходится немного «подруливать» мышкой;
  • Люди с ограниченными возможностями, я думаю если серьёзно развить эту тему, то можно облегчить пользование компьютером для людей, которым пользоваться им затруднительно;
  • Разработчики устройство VR(виртуальной реальности);
  • RC моделисты и коптероводы;
  • Такие же технологические гики, как и я.

Для того чтобы повторить этот девайс нам понадобятся следующее железо:

— Arduino, лучшее решение в данном случае это Arduino Nano V3(стоит недорого, относительно небольшие размеры), обязательно чтобы плата была с микроконтроллером ATmega328 на борту. Так же было бы не плохо, чтобы в ардуинке был USB to UART преобразователь на чипе CH340:

image

Дабы не возникало проблем с нехваткой памяти у микроконтроллера или драйверами, как например с ардуинками на базе чипов FT232RL.

Аргумент в пользу ATmega328
image

Код, как видно из скрина выше, занимает около 16-ти килобайт памяти микроконтроллера, чего точно не хватит, если ардуинка будет на базе ATmega168, хотя конечно можно и вырезать не совсем нужный функционал из прошивки и таким образом попытаться уместить. Правда, зачем?

Драйвера к чипу CH340G ищите в первых ссылках по запросу «ch340g driver» в гугле, или же в архиве к данной статье.

— Датчик GY-85, это трех осевой гироскоп MPU3200, акселерометр ADXL345 и магнитометр HMC5883L на одной плате. Этого более чем достаточно чтобы ориентироваться в пространстве в трёх осях.

image

Он лучше всего себя показал, не требует предварительных калибровок, подключили, прошили ардуинку и работает. Хотя AHRS(Курсовертикаль) прошивка и позволяет калибровку, но это отдельная тема, которая, как я считаю, раскрыта более чем полностью на форуме по игре WarThunder;

— Разная мелочь — провода, паяльник (без него не обойтись, потому, как Arduino Nano и GY-85 приходят из Китая в распаянном состоянии),USB удлинитель, Mini-USB кабель для Arduino Nano V3.

Сборка Head Tracker'а:

Подключаем Arduino и GY-85, в случае Arduino Nano это будет так:

image

  • VCC_IN -> 5V;
  • SCL -> A5;
  • SDA -> A4;
  • GND -> GND.


Подаём питание на ардуино — на датчике должен засветился светодиод.

В случае Head Tracker'а датчик идеально прикрепить на ободок наушников, вот так по «криворукому» это сделал я:

image

Уверен, что вы это сделаете куда аккуратнее, чем меня.

Arduino плату прикрутил обычным проводом от витой пары, дабы ничего не закоротить на плате изоляцию с провода не снимал, всё нормально держится, если её постоянно не теребить.

image

По поводу не теребить плату, я просто скрутил USB кабель и провод наушника тем же проводком от витой пары.

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

image

Под датчик, как и под ардуинку, подложил кусочек вспененного полиэтилена, чтобы они не царапали мне наушники, да и так лучше держится всё это.

Правда тут есть кое-какие моменты, важно датчик располагать таким образом, чтобы стрелка Y указывала на монитор.

image

Так же надо датчик держать подальше от металлических предметов, рекомендуемое расстояние 5-10 см. В противном случае могут быть искажение показаний, глюки в работе датчика. Это актуально для тех, у кого металлический ободок наушников. Хотя искажать показания может не только металл, но и сама ардуинка или даже провода, что и было продемонстрировано на видео, так что постарайтесь отдалить всё это от датчика хотя бы на расстояние 5-10 см.

Самое простое решение с металлическим ободком наушников — губка для мытья посуды:

image

Так как у меня ободок пластиковый (было проверенно магнитом), я забил на всё это.

Прошивка:
Если у вас всё ещё не установлена последняя версия 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:

image

И загружаем прошивку в ардуино:

image

Настройка 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), запускаем:

image

Теперь нам надо настроить программу — в поле «Tracker» выбираем «Hatire Arduino» и нажимаем кнопку "..." и мы увидим что-то типа этого:

Окно настроек Hatire Arduino
image

Здесь надо изменить «Serial port» на COM порт нашей ардуинки, в моём случае это COM42. Дальше переходим во вкладку «Command», прописываем там, в полях «Init» и «Start» 1000, затем выставляем «BaudRate» 115200, и напоследок жмём «Save» и «OK».

Дальше в главном окне программы нажимаем кнопку «Start», начинаем вращать датчик в разных осях и следить за осьминогом. Скорее всего, движения датчика и осьминога будут отличаться, по крайней мере, в моём случае так получилось, не останавливая трекинг жмём кнопку "..." в поле «Tracker». Здесь нам нужно настроить «Axis Configuration» таким образом, чтобы движения датчика совпадали с движениями осьминога в программе — выставляем для «Yaw», «Pich» и «Roll» значения RotX/RotY/RotZ в нужной последовательности, в этом нам поможет вот эта картинка:

image

Как получилось у меня, можете увидеть на скрине настроек «Hatire Arduino» что выше. Ось «Roll» пришлось инвертировать, потому что осьминог крутился в обратные стороны.

Так же программа позволяет настраивать чувствительность для каждой из осей — кнопка «Mapping» в главном окне программы:

image

Правой кнопкой мыши можно ставить и перемещать точки, левая кнопка мыши удаляет точки, можно ставить несколько точек, чтобы устранить нелинейность в показании датчика, если таковые имеются. У меня же всё оси настроены вот так:

image

Вкладка «Filter» в головном окне программы позволяет изменять тип фильтра, или же вообще его отключить, в этом случае показания будут очень нестабильными и резкими. У меня тип фильтра стоит «Accela» вот с такими настройками:

image

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

Переходим к настройке эмуляции мыши, для этого во вкладке «Protocol» выбираем «mouse emulation» и нажимаем кнопку "...", там надо выставить «Yaw» и «Pich» для осей X, Y:

image

Нажимаем кнопку старт и вуаля — профилактика шейного остеохондроза. И напоследок добавлю, что перед нажатием кнопки старт надо ровно установить голову относительно монитора, потому что датчик в этот момент производит калибровку.

Итоги:

Плюсы перед вариантом с использованием веб камеры и ИК светодиодами:
  • Скорость, данная прошивка выдаёт примерно 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:
GY-85-SCH.jpg
image

Комментарии (27)


  1. PaulMaul
    04.05.2016 17:32
    +4

    > хотя, всё не ограничивается одной только репой, можно использовать и любую другую подвижную часть тела, как, например руку.

    Если голову называть репой, то руку нужно называть паклей. А то диссонанс выходит.


    1. HWman
      04.05.2016 20:17

      Просто не смог придумать синонима получше.


  1. tesla254
    04.05.2016 19:35
    +2

    Как вариант можно на затылок резинкой закрепить. И тогда пофигу есть металл в ободке или нет, главное чтоб в голове не было опилок… металлических.


    1. MaxAlekseev
      04.05.2016 19:50

      Шапочкой из фольги не воспользоваться… пичалька.


      1. Zenitchik
        04.05.2016 20:00

        Почему же? Датчик скорее всего только ферромагнетиков боится.


        1. MaxAlekseev
          04.05.2016 20:02

          Я для надежности использую стальную фольгу… так что без вариантов!


        1. HWman
          04.05.2016 20:19

          Датчик очень критично реагирует даже на медные провода, если смотрели видео то видели.


          1. MaxAlekseev
            04.05.2016 20:30
            +1

            Это проблема всех MEMS? И на каком расстоянии от чипа уже не ощущается наличие металла поблизости?


            1. HWman
              04.05.2016 21:13

              MaxAlekseev Так чтобы явно от 2-3 см.


            1. Izy125
              05.05.2016 04:04

              всех… еще есть проблема со стабильностью значений.


              1. HWman
                05.05.2016 04:05

                Прошивка поддерживает калибровку.


                1. Izy125
                  05.05.2016 09:04
                  +1

                  вопрос в частоте калибровки:)
                  в принципе, под ширпотреб пойдет… мы возились с мемсами, под что-то серьезное найти очень трудно. сейчас у микрочипа появился модуль, его пока не успели изучить



  1. Rockerman
    05.05.2016 07:28
    +1

    Если автор решит таки сделать очки виртуальной реальности своими руками, то подробное руководство


    1. HWman
      05.05.2016 14:03

      Видел. Экран + трекер дороговато в сумме, но статья конечно же интересная.


  1. GennPen
    05.05.2016 07:37

    к тому же от него не долбит в голову излучение от WiFi передатчика смартфона
    разве излучение от WiFi на столько сильное? =)


    1. HWman
      05.05.2016 14:05

      Какое никакое, но оно есть.


  1. kharlashkin
    05.05.2016 08:01

    Проволочки от витой пары и нитки вместо синей изоленты… А что, разве так можно?


    1. HWman
      05.05.2016 14:06

      Изоленту пожалел.


  1. mmMike
    05.05.2016 08:36

    Ну а на практике как?

    У всех этих «электронных» гироскопов и акселерометров весьма большой дрейф в покое. Отличить медленное движение от дрейфа фактически невозможно.

    У меня пультик к телевизору (Smart TV) работает по этому же принципу.
    Не сказал бы что очень удобно и точно позиционирует. С мышкой никакого сравнения.


  1. mephy
    05.05.2016 13:15

    Дрейфа на GY-85 вроде как быть не должно.
    Я собирал такой для коптера, вот по этому гайду www.rcgroups.com/forums/showthread.php?t=1677559

    Но никак не могу победить помехи. По схеме сборки на rcgroups GY-85 лежит прямо поверх ардуины.
    У меня при таком конфиге жуткие глюки — поворачиваю голову вправо, сигнал идет как будто вправо и вниз и т.п.

    После каллибровки получше, но все равно косячит. Возможно придется оставить одну ось.
    Хотя на форуме жалоб мало, может у меня руки кривые.

    Кстати, хоббикинг выпускал недорогие трекеры по этой схеме в хорошем корпусе. Назывались Quanum. Но почему-то перестали :-(
    А другие трекеры уже дорогие.


    1. vasimv
      05.05.2016 13:38

      Да сейчас проще купить полетный контроллер для коптера (если нравятся ардуинки — то на atmega328 или mega2560, совместимо полностью), оно там все собранное, с защитами от переполюсовки даже (диод на питании) и приличной разводкой. Заодно и барометры с компасами, зачастую.


      1. mephy
        05.05.2016 13:50

        У меня это трекер для головы :) На коптере Naza.
        Камера на трехпозиционном подвесе, можно полное погружение устроить.

        Вот только пока хорошо работает одна ось + вторая ось с пульта.
        Может воспользуюсь «методом губки», но жалко — корпус распечатал, все там распаял красиво (там еще есть крайне удобная кнопка «обнулить положение»)


  1. tonnchik
    09.05.2016 17:43

    Приветствую, Сергей! Есть задача отследить положение одной части тела относительно другой с математической точностью, т.е. сделать MoCap для двух сегментов конечности (например, плеча и предплечья). Для этого планируется разместить два датчика GY85 на одном сегменте конечности, и два на другом. В связи с этим вопрос потянет ли это один модуль Nano V3? Хватит ли разъемов? Какие еще нужны компоненты для этого? В идеале бы сделать систему беспроводной. Хотелось бы услышать ваше мнение по этому поводу. Простите, если вопросы «ваапще» дилетантские)))
    Спасибо.


    1. ObelardO
      11.05.2016 22:36

  1. berber
    09.05.2016 19:54

    Проводное подключение, что в принципе решаемо при помощи Bluetooth модуля, например как HC-05/HC-06. Прошивка поддерживает такую возможность.

    Как питать автономно такой вариант? Какое потребление тока будет?


  1. ObelardO
    11.05.2016 22:40

    Автор, спасибо за статью!
    Вопрос по теме — что там с дрейфом, что дает тестирование?

    P.S. Моя схожая статейка о разработке мокап-костюма, клац