Оглавление:

Точный световой пистолет Wiimote для Raspberry PI: 9 шагов (с изображениями)
Точный световой пистолет Wiimote для Raspberry PI: 9 шагов (с изображениями)
Anonim
Точный световой пистолет Wiimote для Raspberry PI
Точный световой пистолет Wiimote для Raspberry PI
Точный световой пистолет Wiimote для Raspberry PI
Точный световой пистолет Wiimote для Raspberry PI

Обычно пульт Wii Remote, используемый в качестве светового пистолета, недостаточно точен для ретро-игр, таких как NES Duck Hunt, потому что пульт Wii Remote фактически не выбирает точку на телевизоре, на которую он направлен. Не может! На передней панели Wii Remote есть инфракрасная камера, которая видит линию инфракрасных светодиодов на сенсорной панели, но не может знать, как далеко (или в каком направлении) находится телевизор от планки или насколько велик телевизор. Эмуляторы и игры работают над этим, отображая перекрестие или другой индикатор прицеливания, но это не точный опыт стрельбы по цели.

Чтобы Wii Remote работал как точный световой пистолет, по которому вы можете прицеливаться, чтобы выбрать цель на телевизоре, требуются четыре инфракрасных светодиода, расположенных известным четырехугольным узором (а не прямой линией) в той же плоскости, что и телевизор. Затем Wii Remote видит четыре светодиода, и изображение с камеры можно использовать для расчета гомографии, которая позволяет нам определить, на что указывает камера.

Аппаратное обеспечение этого проекта простое. В простых корпусах, напечатанных на 3D-принтере, есть четыре инфракрасных светодиода, которые можно приклеить к верхней и нижней части корпуса телевизора и подключить к зарядному устройству USB. Кроме того, на случай, если у вас нет корпуса для пистолета Wii, у меня есть простая напечатанная на 3D-принтере ручка и прицел, которые вы можете прикрепить к Wii Remote (хотя для экономии пластика я сделал свой гибрид дерева и пластика, напечатанного на 3D-принтере).

Программное обеспечение на основе Python было сложнее создать, чем оборудование, и в настоящее время оно предназначено только для Linux. Он калибрует светодиоды и пульт Wii Remote, а затем использует вычисления гомографии для имитации абсолютной мыши, которая довольно хорошо работает в эмуляторе Fceumm NES от Retroarch (и, возможно, в некоторых других эмуляторах) на моем Raspberry PI 3B +.

Запасы

  • Пульт Wii
  • Четыре инфракрасных светодиода диаметром 940 нм и диаметром 5 мм
  • Старый USB-кабель с исправным штекером типа А
  • Raspberry PI 3 или другой компьютер Linux с поддержкой Bluetooth
  • 3D-принтер и нить (опционально)

Шаг 1: Инфракрасная светодиодная цепочка

Инфракрасная светодиодная цепочка
Инфракрасная светодиодная цепочка
Инфракрасная светодиодная цепочка
Инфракрасная светодиодная цепочка

Возьмите старый USB-кабель с рабочим гнездом типа A (обычно зарядные кабели моего телефона обрываются на конце micro USB, поэтому у меня остались оставшиеся кабели с рабочим гнездом типа A).. На самом деле, это даже нормально, если кабели для передачи данных есть сломаны, пока работают линии электропередач. Отрежьте другой конец. Теоретически красный кабель должен быть на +5 В, а черный должен быть заземлен, но проверьте его с помощью мультиметра (подключите его к зарядному устройству, а затем проверьте напряжение между красным и черным проводами).

Поскольку у инфракрасных светодиодов падение напряжения составляет около 1,2–1,3 В, я просто припаял четыре из них последовательно к USB-кабелю. Убедитесь, что провода, которые вы паяете, достаточно длинные, чтобы вы могли разместить светодиоды внизу телевизора и два вверху, с приличным количеством горизонтального пространства между светодиодами (около 10 дюймов).

Точнее сделать светодиодный шлейф:

  • припаиваем минусовую сторону (катод, более короткая ножка, с плоским краем) первого светодиода к проводу + 5V USB
  • соедините положительную сторону первого светодиода (анод, более длинная ножка, с закругленным краем) к отрицательной стороне второго светодиода
  • повторите, чтобы присоединить второй светодиод к третьему и третий к четвертому
  • затем подключите плюс четвертого светодиода проводом к заземляющему проводу USB.

Чтобы сделать вещи более аккуратными, при соединении можно использовать термоусадочную трубку. В противном случае используйте изоленту, чтобы избежать коротких замыканий.

Убедитесь, что у вас нет коротких замыканий. Затем подключите его к зарядному устройству USB и убедитесь, что он излучает инфракрасный свет, посмотрев на светодиоды с помощью камеры телефона. (Многие камеры телефонов чувствительны к инфракрасному излучению.)

Шаг 2. Подключите к телевизору

Прикрепить к ТВ
Прикрепить к ТВ
Прикрепить к ТВ
Прикрепить к ТВ
Прикрепить к ТВ
Прикрепить к ТВ

Теперь прикрепите два светодиода к нижней стороне телевизора и два к верхней стороне. Расстояние по горизонтали должно составлять около десяти дюймов. Если это слишком много, у вас могут возникнуть проблемы с полем обзора камеры Wii Remote, улавливающим их все. Но если они слишком близки, моя геометрическая интуиция подсказывает, что точность будет ниже.

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

Шаг 3: Установите программное обеспечение

В настоящее время программное обеспечение предназначено только для Linux. Следующая установка предназначена для Raspberry PI 3 с Raspbian Stretch. Другие системы Linux потребуют некоторых изменений. На более ранних моделях вам понадобится ключ Bluetooth, и вам также нужно будет запустить его из командной строки:

sudo get-apt установить bluetooth

Шаг A: udev

Затем создайте файл в /etc/udev/rules.d/wiimote.rules, содержащий единственную строку:

ЯДРО == "uinput", MODE = "0666"

Вы можете сделать это, например, с помощью текстового редактора или набрав в командной строке следующее:

sudo sh -c 'echo ЯДРО == / "uinput \", MODE = / "0666 \"> /etc/udev/rules.d/wiimote.rules'

А затем перезапустите udev:

sudo /etc/init.d/udev перезапуск

Шаг б: cwiid

Далее вам понадобится мой модифицированный пакет cwiid. Здесь это становится немного сложным, так как в идеале вам нужно было бы создать его на своем Raspberry PI, но я должен признаться, что я потерял представление о том, какие пакеты вам нужно установить, чтобы он работал. Для этого есть три варианта.

Вариант B1: построить себя

cd ~

git clone https://github.com/arpruss/cwiid-1 autoconf./configure make -C libcwiid sudo make -C libcwiid install make -C python sudo make -C python install

К сожалению, есть большая вероятность, что вам не хватает кучи вещей, необходимых для создания этого, и./configure будет жаловаться. Вы можете посмотреть на все, на что он жалуется, и запустить sudo apt install на всех из них.

Вариант B2: использовать мои двоичные файлы

cd ~

wget https://github.com/arpruss/cwiid-1/releases/download/0.0.1/cwiid-rpi.tar.gz tar zxvf cwiid-rpi.tar.gz cd cwiid sudo make install

Шаг c: библиотеки Python

Наконец, получите поддержку для моего скрипта python для светового оружия:

sudo pip3 установить uinput numpy pygame opencv-python

sudo apt-get install libatlas-base-dev sudo apt-get install libjasper-dev sudo apt-get install libqtgui4 sudo apt-get install python3-pyqt5

Шаг D: lightgun.py

Наконец, получите мой скрипт python для Lightgun:

cd ~

git clone

Если все прошло хорошо, теперь у вас есть ~ / lightgun.py, который вы можете использовать для калибровки светового оружия.

Шаг 4: Калибровка. Часть I: Центрирование камеры

Калибровка, часть I: центрирование камеры
Калибровка, часть I: центрирование камеры
Калибровка, часть I: центрирование камеры
Калибровка, часть I: центрирование камеры
Калибровка, часть I: центрирование камеры
Калибровка, часть I: центрирование камеры

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

Чтобы не нажимать кнопки, когда вы кладете пульт Wii Remote на его переднюю панель, и чтобы Wii Remote имел постоянную высоту, вы можете распечатать на 3D-принтере инструмент калибровки, который я здесь включил. Вам в основном нужны вещи толщиной 10,5 мм, которые можно положить под пульт Wii Remote, когда он лежит на передней панели. На самом деле я использовал обрезки фанеры, чтобы сэкономить на пластике.

Включите светодиоды и убедитесь, что ваш Raspberry PI или другой компьютер отображается на телевизоре. Подключите клавиатуру (по ssh это не сработает) или используйте VNC. Затем запустите:

python3 ~ / lightgun / lightgun.py -M

Если все пойдет хорошо, вы получите полноэкранный дисплей с просьбой нажать 1 + 2 на пульте Wii Remote. Сделай это. На пульте Wii Remote начнут мигать индикаторы, а затем индикаторы 1 и 4 продолжат гореть. Вы также увидите маленький зеленый прямоугольник в верхней части экрана с изображением с камеры Wii Remote. Направьте пульт Wii Remote на светодиоды, и если все пойдет хорошо, вы увидите четыре светодиода, пронумерованные от 1 до 4.

Теперь вам нужно найти твердую поверхность с острыми краями, например журнальный столик, на которую вы можете направить экран телевизора и которая позволит Wii Remote видеть все светодиоды, когда Wii Remote будет выровнен по краю. Начните с выравнивания пульта Wii Remote правой стороной вверх, чтобы сторона пульта была выровнена по краю поверхности, убедившись, что все четыре светодиода видны. Затем нажмите ПРОБЕЛ на клавиатуре (или прикрепите нунчак и нажмите C, если так удобнее). Затем вам будет предложено повернуть пульт Wii Remote. Теперь убедитесь, что он приподнят на 10,5 мм от вашей поверхности, используя калибровочный инструмент или что-то еще, и как можно ближе к тому же месту, что и раньше (например, выровнен по тому же краю вашей поверхности). Снова нажмите ПРОБЕЛ.

Если все пойдет хорошо, вы перейдете к этапу калибровки светодиода. Ага, это сложно! Но у вас будет очень точное легкое ружье. Это просто цена.

Примечание. Если, как и у меня, у вас есть Wii под телевизором, Wii необходимо выключить по двум причинам: во-первых, если Wii включен, он будет подключаться к Wiimote, а во-вторых, инфракрасные светодиоды на сенсорной панели будут мешать работе. этот проект. По тем же причинам, пока вы используете Wii, рекомендуется отключить светодиоды вокруг телевизора.

Шаг 5: Калибровка Шаг II: Светодиоды

Шаг калибровки II: светодиоды
Шаг калибровки II: светодиоды
Шаг калибровки II: светодиоды
Шаг калибровки II: светодиоды

Теперь вам нужно указать программе, где расположены светодиоды по краю телевизора. Вы увидите экран калибровки с четырьмя стрелками, одна из которых выбрана (яркая), а три неактивны, по краю телевизора. Вы используете +/- для переключения, чтобы изменить регулируемую стрелку.

Для каждой из четырех стрелок по краю сделайте следующее:

  1. нажимайте влево / вправо на Wiimote, чтобы перемещать стрелки, пока они не будут указывать как можно точнее в сторону соответствующего светодиода;
  2. нажмите на Wiimote вверх / вниз, чтобы изменить длину стрелки, пока длина стрелки не будет соответствовать расстоянию между светодиодом и краем экрана телевизора; другими словами, длина стрелки должна быть равна расстоянию от кончика стрелки до светодиода.

Как только ваши четыре стрелки будут правильными (а может быть, даже раньше), вы увидите красное перекрестие, когда направите Wiimote на экран. Вы можете проверить, что это именно то место, где оно должно быть. (Помните, что вам нужно находиться достаточно далеко, чтобы Wiimote мог видеть все светодиоды. Также важно, чтобы в поле зрения не было других источников инфракрасного излучения. Однажды у меня были проблемы из-за того, что солнечный свет отражался от головки винта на Тумба под ТВ.)

Наконец, есть пятая стрелка, которая появляется только тогда, когда вы нажимаете + с четвертой светодиодной стрелки или - с первой (и по умолчанию она имеет нулевую длину, поэтому это всего лишь пиксель). Эта стрелка регулирует, насколько высоко над камерой Wii Remote будет регистрироваться снимок. Проблема в следующем: вы будете прицеливаться по верхней поверхности Wii Remote. Но на самом деле камера расположена на некотором расстоянии ниже этой поверхности, в середине черного прямоугольника на передней панели Wii Remote. Если бы мы зарегистрировали снимки, на которые указывает камера, они будут зарегистрированы примерно на 8 мм ниже верхней поверхности Wii Remote. Вы можете проверить это, заметив, что когда вы смотрите вдоль верхней поверхности, центр перекрестия скрывается камерой.

Вы можете смириться с этим, или вы можете увеличить эту пятую стрелку, чтобы программное обеспечение выровняло снимки с верхней частью Wii Remote, или вы можете настроить файлы для 3D-печати для прицелов, чтобы компенсировать это (но компенсация будет работать только для одно конкретное расстояние до телевизора). Я сам пошел на согласование программного обеспечения.

Нажмите HOME на пульте Wii Remote, чтобы выйти из калибровки и сохранить все данные в каталоге ~ /.wiilightgun.

Шаг 6: Тестирование и использование

Тестирование и использование
Тестирование и использование
Тестирование и использование
Тестирование и использование
Тестирование и использование
Тестирование и использование

Вы, наверное, захотите сейчас опробовать свой световой пистолет. Просто запустите эмулятор терминала (или скрипт):

python3 ~ / lightgun / lightgun.py -t

Вам нужно будет одновременно нажать кнопки 1 + 2, и после этого, если все пойдет хорошо, пока работает lightgun.py, световое ружье будет имитировать двухкнопочную абсолютную мышь. Кнопка триггера - это кнопка мыши 1, а кнопка A - кнопка мыши 2. Для выхода нажмите ctrl-c.

Теперь вам нужно только настроить эмуляторы и / или игры для работы с абсолютной мышью. К сожалению, это не всегда будет так просто.

Одна забавная вещь, которую вы можете попробовать, - это мой мод iminurnamez's duck-duck-shoot:

cd ~

git clone https://github.com/arpruss/duck-duck-shoot cd duck-duck-shoot python play_game.py

Для игр NES я использую ядро libretro fceumm в Retroarch. Перейдите в меню параметров и настройте Zapper как сенсорный экран. (Настройка его как мыши на самом деле не работает, поскольку fceumm ожидает относительного движения, а не абсолютного положения мыши.)

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

python3 ~ / lightgun / lightgun.py -t -B 30 "команда для запуска игры"

Затем в течение первых 30 секунд выполнения игры (отсюда и опция -B 30) вы можете подключить свой световой пистолет, удерживая 1 + 2.

Кстати, скрипт lightgun.py также можно использовать для обычных игр Wii Remote с Retroarch. Просто добавьте параметр -o, и функции светового пистолета будут отключены, и вместо этого Wii Remote будет работать горизонтально, с тремя кнопками - 1, 2 и B соответственно. В сопоставлениях lightgun.py есть и другие функции, связанные с Retroarch, которые вы обнаружите, прочитав код. Например, клавиша «минус» действует как сдвиг и вместе с dpad управляет сохранением и загрузкой (вверх / вниз = изменить номер сохранения; влево = восстановить; вправо = сохранить).

Шаг 7. Рукоять и прицеливание

Рукоятка и прицеливание
Рукоятка и прицеливание
Рукоятка и прицеливание
Рукоятка и прицеливание
Рукоятка и прицеливание
Рукоятка и прицеливание

Вы можете использовать Wii Remote как пистолет, прицеливаясь сверху. Вы также можете купить для него одну из коммерческих гильз. Но поскольку оригинальный пульт Wii Remote не мог использоваться в качестве прицельного оружия, гильзы, как правило, не поставляются с прицельными приспособлениями, а прицельные приспособления значительно повышают точность.

Я разработал простую систему для 3D-печати, состоящую из трех частей: выдвижную рукоятку, которая находится сразу за спусковым крючком (так что она немного похожа на фазер Star Trek Original Series), и выдвижные прицелы. Файлы для печати здесь. Если вы хотите сэкономить на пластике за счет обрезков дерева, вы также можете сделать то же самое, что и я, и вместо печати всей ручки распечатать только ту часть, которая удерживает Wiimote, вырезать деревянную деталь и прикрутить ее.

Чтобы увидеть, сфокусируйте взгляд на достопримечательностях. Выровняйте выступ мушки между выступами целика так, чтобы воздушное пространство на каждой из них было одинаковым и все три выступа выступали одинаково высоко. Затем совместите середину мишени с вершиной выступов.

Примечание: высота выступов немного неравная, выступ мушки немного ниже, чтобы компенсировать высоту самих выступов прицела, когда вы смотрите вдоль них на расстоянии 2,5 метра (мое расстояние до телевизора). Если у вас значительно другое расстояние до телевизора, вы можете указать это в файлах OpenSCAD. В любом случае, эта регулировка может быть ниже допусков принтера. Кроме того, если вы не выполняли регулировку по вертикали в программном обеспечении, вы можете добавить дополнительную регулировку прицелов в программном обеспечении, установив для extraSightAdjust значение около -8 (в миллиметрах).

Шаг 8: Калибровка III (необязательно): точная настройка

Если вам нужна еще большая точность, вы можете запустить:

python3 ~ / lightgun / lightgun.py -d

(для демонстрации) и внимательно посмотрите, совпадают ли прицелы с перекрестием. Если это не так, выйдите и вручную отредактируйте ~ /.wiilightgun / wiimotecalibration, а также немного измените координаты x и y центра камеры, чтобы настроить прицеливание. Например, мой пистолет стрелял немного вправо, поэтому я изменил координату x с 529 на 525. У всех, вероятно, будут разные числа.

Шаг 9: Приложение: алгоритм

Приложение: Алгоритм
Приложение: Алгоритм

Код эмуляции мыши работает примерно следующим образом.

  • Нажатие кнопки процесса.
  • Получите данные с камеры и настройте калибровку центрирования камеры.
  • Если в камере видно менее трех светодиодов:

    Оставить последнюю позицию мыши

  • Если видны три или четыре светодиода:

    • Используйте данные акселерометра Wiimote, чтобы получить ориентацию Wiimote и определить, какое изображение светодиодной камеры соответствует какому физическому светодиоду.
    • Если видны четыре светодиода:

      • Рассчитайте гомографию между изображениями светодиодных камер и местоположениями светодиодов (в координатах экрана).
      • Используйте гомографию, чтобы вычислить, какое расположение экрана соответствует центру поля зрения камеры.
      • Выполните регулировку по оси Y, чтобы отрегулировать центр виртуального ствола пистолета ниже линии визирования. Это несколько неуклюжий алгоритм, но он работает.
      • Установите положение мыши в отрегулированное положение экрана.
    • Если видны три светодиода:

      • Используйте OpenCV для решения проблемы P3P между изображениями светодиодных камер и физическими местоположениями светодиодов. Это дает до четырех решений.
      • В случае успеха:

        • Если у нас есть предыдущий успешный расчет местоположения, выберите решение, при котором отсутствующий светодиод будет ближе всего к последнему наблюдаемому или вычисленному положению этого светодиода.
        • Если у нас нет предыдущего успешного расчета местоположения, выберите решение, которое лучше всего предсказывает направление акселерометра.
        • Используйте лучшее решение, чтобы рассчитать, куда должен идти четвертый светодиод.
        • Остальное сделайте так же, как в случае с четырьмя светодиодами.
      • В случае неудачи:

        Оставить последнюю позицию мыши

Рекомендуемые: