Kazalo:

Natančna svetlobna pištola Wiimote za Raspberry PI: 9 korakov (s slikami)
Natančna svetlobna pištola Wiimote za Raspberry PI: 9 korakov (s slikami)

Video: Natančna svetlobna pištola Wiimote za Raspberry PI: 9 korakov (s slikami)

Video: Natančna svetlobna pištola Wiimote za Raspberry PI: 9 korakov (s slikami)
Video: 897-IT Mariella, MAGMA - Ipnosi Esoterica ∞ Lucio Carsi 2024, Julij
Anonim
Natančna svetlobna pištola Wiimote za Raspberry PI
Natančna svetlobna pištola Wiimote za Raspberry PI
Natančna svetlobna pištola Wiimote za Raspberry PI
Natančna svetlobna pištola Wiimote za Raspberry PI

Običajno daljinski upravljalnik Wii, ki se uporablja kot svetlobna pištola, ni dovolj natančen za retro igre, kot je NES Duck Hunt, ker daljinski upravljalnik Wii dejansko ne izbere točke na televizorju, na katero je usmerjen. Ne more! Daljinski upravljalnik Wii ima spredaj infrardečo kamero, ki vidi črto infrardečih LED v vrstici senzorjev, vendar ne more vedeti, kako daleč (ali v katero smer) je televizor od palice ali kako velik je televizor. Emulatorji in igre se izogibajo temu, da prikažejo križanec ali drug kazalnik ciljanja, vendar to ni natančna izkušnja pri streljanju na tarčo.

Če želite, da daljinski upravljalnik Wii deluje kot natančna svetlobna pištola, ki jo lahko opazujete pri izbiri cilja na televizorju, potrebujete štiri infrardeče LED, razporejene v znanem štirikotniku (ne ravni črti) v isti ravnini kot televizor. Daljinski upravljalnik Wii nato vidi štiri LED diode, s sliko kamere pa lahko izračunate homografijo, ki nam omogoča, da ugotovimo, kam kaže kamera.

Strojna oprema za ta projekt je preprosta. V enostavnih ohišjih s 3D-tiskanjem so štiri infrardeče LED, ki jih je mogoče prilepiti na zgornji in spodnji del ohišja televizorja in priključiti na polnilnik USB. Poleg tega, če nimate ohišja za pištolo Wii, imam preprost ročaj s 3D tiskanjem in znamenitosti, ki jih lahko pritrdite na daljinski upravljalnik Wii (čeprav sem zaradi varčevanja s plastiko naredil svojega hibrida med lesom in 3D tiskano plastiko).

Programsko opremo, ki temelji na pythonu, je bilo težje izdelati kot strojno opremo in je trenutno samo za Linux. Kalibrira LED in daljinski upravljalnik Wii, nato pa z izračuni homografije posnema absolutno miško, ki zelo dobro deluje v emulatorju Retroarch's fceumm NES (in verjetno še v nekaterih drugih emulatorjih) na mojem Raspberry PI 3B+.

Zaloge

  • Wii Remote
  • Štiri 940nm 5 mm infrardeče LED
  • Stari kabel USB z delujočim vtičem tipa A.
  • Raspberry PI 3 ali drug računalnik Linux s podporo Bluetooth
  • 3D tiskalnik in filament (neobvezno)

Korak: Infrardeča LED veriga

Infrardeča LED veriga
Infrardeča LED veriga
Infrardeča LED veriga
Infrardeča LED veriga

Pridobite star kabel USB z delujočo vtičnico tipa A (običajno se mi polnilni kabli telefona zlomijo na koncu mikro USB, zato imam preostale kable z delujočo vtičnico tipa A). Pravzaprav je v redu, če so podatkovni kabli pokvarjen, dokler delujejo daljnovodi. Odrežite drugi konec. Teoretično mora biti rdeči kabel +5V, črni pa ozemljen, vendar to preverite z multimetrom (priključite ga v polnilnik in nato preverite napetost med rdečo in črno žico).

Ker imajo infrardeče LED diode padec napetosti za 1,2-1,3 V, sem jih kar štiri zaporedno spajkal v kabel USB. Prepričajte se, da so žice, ki jih spajkate, dovolj dolge, da lahko LED -diode postavite na dno televizorja in dve na vrh, s primerno količino vodoravnega prostora med LED -diodami (približno 10 palcev ali več).

Natančneje za izdelavo LED zanke:

  • spajkajte minus stran (katoda, krajša noga, s ploskim robom) prve LED diode na +5V USB žico
  • priključite plus stran prve LED (anode, daljše noge, z okroglim robom) na minus stran druge LED
  • ponovite, da priključite drugo LED na tretjo in tretjo na četrto
  • nato priključite plus stran četrte LED z žico na ozemljeno žico USB.

Če želite stvari narediti bolj čiste, lahko pri povezovanju uporabite toplotno skrčljivo cev. V nasprotnem primeru uporabite električni trak, da se izognete kratkim hlačam.

Prepričajte se, da nimate kratkega stika. Nato ga priključite v polnilnik USB in preverite, ali oddaja infrardečo svetlobo, tako da pogledate LED -diode s kamero telefona. (Mnoge kamere v telefonu so občutljive na infrardeče žarke.)

2. korak: Priključite na televizor

Pritrdite na televizor
Pritrdite na televizor
Pritrdite na televizor
Pritrdite na televizor
Pritrdite na televizor
Pritrdite na televizor

Zdaj pritrdite dve LED diodi na spodnjo stran televizorja in dve na zgornjo stran. Vodoravni razmik mora biti približno deset centimetrov. Če je preveč, imate lahko težave z vidnim poljem kamere Wii Remote, ki jih vse zajame. Če pa sta preblizu, potem moja geometrijska intuicija pravi, da boste imeli manjšo natančnost.

Za preskušanje sem LED zalepil z električnim trakom, nato pa za trajno povezavo oblikoval in natisnil štiri čedne majhne LED sponke (datoteke so tukaj), ki sem jih vroče prilepil na televizor. Svetleče diode bi morale biti čim bližje ravnini televizijskega zaslona, ne da bi jih okvir zakrival z mesta, kjer boste snemali.

3. korak: Namestite programsko opremo

Trenutno je programska oprema samo za Linux. Naslednja nastavitev je zasnovana za Raspberry PI 3 z Raspbian Stretch. Drugi sistemi Linuxa bodo zahtevali nekatere spremembe. Pri starejših modelih boste potrebovali ključ Bluetooth in to boste morali zagnati tudi iz ukazne vrstice:

sudo get-apt namestite bluetooth

Korak A: udev

Nato ustvarite datoteko v /etc/udev/rules.d/wiimote.rules, ki vsebuje eno vrstico:

KERNEL == "uinput", MODE = "0666"

To lahko na primer naredite z urejevalnikom besedila ali v ukazno vrstico vnesete naslednje:

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

Nato znova zaženite udev:

sudo /etc/init.d/udev znova zaženite

Korak B: cwiid

Nato boste potrebovali moj spremenjeni paket cwiid. Tukaj postane nekoliko dlakavo, saj bi ga v idealnem primeru morali zgraditi na svojem Raspberry PI, vendar moram priznati, da sem izgubil sled, katere pakete morate namestiti, da bo deloval. Za to obstajajo tri možnosti.

Možnost B1: Zgradite se sami

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

Na žalost obstaja velika verjetnost, da pri gradnji tega manjka kup stvari, in./configure se bo pritožil. Ogledate si lahko vse stvari, na katere se pritožuje, in na vseh zaženete sudo apt install.

Možnost B2: Uporabi moje binarne datoteke

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

Korak C: knjižnice python

Končno dobite podporo za moj skript python lightgun:

sudo pip3 namestite 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

Korak D: lightgun.py

Končno dobite moj skript python lightgun:

cd ~

git clone

Če je vse v redu, imate zdaj ~/lightgun.py, s katerim lahko umerite svetlobno pištolo.

4. korak: Umerjanje I. del: Centriranje kamere

Kalibracija I. del: Centriranje kamere
Kalibracija I. del: Centriranje kamere
Kalibracija I. del: Centriranje kamere
Kalibracija I. del: Centriranje kamere
Kalibracija I. del: Centriranje kamere
Kalibracija I. del: Centriranje kamere

Kalibracija ima dva vidika. Prvi je umerjanje središča kamere na vsakem Wiimoteju. To zahteva, da s kamero posnamete dve sliki LED-diod okoli zaslona televizorja, eno z desno stranjo daljinskega upravljalnika navzgor, drugo pa z glavo navzdol.

Da ne bi pritisnili gumbov, ko daljinski upravljalnik Wii postavite na sprednjo stran, in da bi imel daljinski upravljalnik Wii enakomerno višino, lahko 3D -orodje za umerjanje, ki sem ga vključil, natisnem 3D. V bistvu potrebujete stvari debeline 10,5 mm, ki jih lahko položite pod daljinski upravljalnik Wii, ko leži na sprednji strani. Pravzaprav sem uporabil nekaj odpadne vezane plošče, da sem prihranil pri plastiki.

Vklopite LED -diode in se prepričajte, da je vaš Raspberry PI ali drug računalnik prikazan na televizorju. Priključite tipkovnico (to ne bo delovalo prek ssh) ali uporabite VNC. Nato zaženite:

python3 ~/lightgun/lightgun.py -M

Če je vse v redu, se prikaže celozaslonski zaslon, ki vas prosi, da pritisnete 1+2 na daljinskem upravljalniku Wii. Naredi to. Na daljinskem upravljalniku Wii bodo utripale luči, luči 1 in 4 pa ostaneta prižgani. Na vrhu zaslona boste videli tudi mali zeleni pravokotnik s pogledom iz kamere Wii Remote. Usmerite daljinski upravljalnik Wii na LED in če bo vse v redu, boste videli štiri LED diode, oštevilčene od 1 do 4.

Zdaj morate najti trdno površino z ostrim robom, kot je mizica za kavo, ki jo lahko pokažete na televizijski zaslon in ki omogoča daljinskemu upravljalniku Wii, da vidi vse LED z daljinskim upravljalnikom Wii, poravnanim ob robu. Začnite tako, da poravnate Wii Remote desno stran navzgor, stran daljinskega upravljalnika pa poravnajte s površinskim robom, tako da so vidne vse štiri LED diode. Nato pritisnite SPACE na tipkovnici (ali pritrdite Nunchuck in pritisnite C, če je to bolj primerno). Nato boste pozvani, da zavrtite daljinski upravljalnik Wii. Zdaj se prepričajte, da je z orodjem za umerjanje ali kaj drugega dvignjen za 10,5 mm od vaše površine in čim bližje istemu mestu kot prej (npr. Poravnano z istim robom vaše površine). Ponovno pritisnite SPACE.

Če je vse v redu, pojdite na korak umerjanja LED. Ja, to je zapleteno! Imeli pa boste zelo natančno pištolo. To je samo cena.

Opomba: Če imate podobno kot jaz Wii pod televizorjem, je treba Wii izklopiti iz dveh razlogov: prvič, če je Wii vklopljen, se bo povezal z Wiimotejem in drugič, infrardeče LED diode senzorja bodo motile ta projekt. Iz podobnih razlogov je med uporabo Wii dobro odklopiti LED diode okoli televizorja.

5. korak: Umerjanje 2. korak: LED

2. korak umerjanja: LED
2. korak umerjanja: LED
2. korak umerjanja: LED
2. korak umerjanja: LED

Zdaj morate programski opremi povedati, kje so LED diode okoli roba televizorja. Videli boste zaslon za umerjanje, ki prikazuje štiri puščice, od katerih je ena izbrana (svetla), tri pa sivo obrobljene okoli roba televizorja. Uporabite +/- za preklop, da spremenite, katero puščico prilagajate.

Za vsako od štirih puščic okoli roba naredite to:

  1. pritisnite levo/desno na Wiimoteju, da puščice premaknete tako natančno, kot lahko proti ustrezni LED;
  2. pritiskajte gor/dol na Wiimoteju, da spremenite dolžino puščice, dokler se dolžina puščice ne ujema z razdaljo med LED in robom televizijskega zaslona; z drugimi besedami, dolžina puščice mora biti enaka razdalji od konice puščice do LED.

Ko bodo vaše štiri puščice pravilne (in morda celo prej), boste ob vklopu Wiimote na zaslon videli rdeč križ. Lahko preverite, ali bi moralo biti tukaj. (Ne pozabite, da morate biti dovolj oddaljeni, da lahko Wiimote vidi vse LED. Pomembno je tudi, da v vidnem polju ni drugih virov infrardeče svetlobe. Nekoč sem imel težave zaradi sončne svetlobe, ki se odbija od glave vijaka na TV stojalo.)

Nazadnje je še peta puščica, ki se prikaže le, ko pritisnete + iz četrte puščice LED ali - iz prve (in ima privzeto dolžino nič, zato je le pikslov). Ta puščica prilagodi, kako daleč od kamere daljinskega upravljalnika Wii bo posnetek posnet. Vprašanje je naslednje: opazovali boste vzdolž zgornje površine daljinskega upravljalnika Wii. Toda kamera se dejansko nahaja nekaj razdalje pod to površino, sredi črnega pravokotnika na sprednji strani daljinskega upravljalnika Wii. Če bi posneli posnetke, kamor kaže kamera, bi bili zabeleženi približno 8 mm pod zgornjo površino daljinskega upravljalnika Wii. To lahko preverite tako, da opazite, da fotoaparat med gledanjem vzdolž zgornje površine skriva sredino križnih las.

Lahko živite s tem ali pa povečate to peto puščico, da programsko opremo poravnate posnetke z vrhom daljinskega upravljalnika Wii, ali pa prilagodite datoteke, ki jih je mogoče natisniti v 3D, za železne znamenitosti, da to nadomestite (vendar bo kompenzacija delovala le za eno posebno razdaljo do televizorja). Sam sem šel na poravnavo programske opreme.

Pritisnite HOME na daljinskem upravljalniku Wii, da zaprete kalibracijo in shranite vse podatke v imenik ~/.wiilightgun.

6. korak: Preizkusite in uporabite

Preizkusite in uporabite
Preizkusite in uporabite
Preizkusite in uporabite
Preizkusite in uporabite
Preizkusite in uporabite
Preizkusite in uporabite

Verjetno bi zdaj želeli preizkusiti svojo svetlobno pištolo. Samo zaženite v terminalskem emulatorju (ali skriptu):

python3 ~/lightgun/lightgun.py -t

Hkrati boste morali pritisniti gumba 1+2, po tem pa bo, če bo vse v redu, dokler bo deloval lightgun.py, svetlobna pištola posnema absolutno miško z dvema gumboma. Gumb za sprožitev je gumb miške 1, gumb A pa gumb miške 2. Pritisnite ctrl-c za izhod.

Zdaj morate samo emulatorje in/ali igre konfigurirati za delo z absolutno miško. Na žalost to ne bo vedno tako enostavno.

Ena zabavna stvar, ki jo lahko poskusite, je moj način iminurnamezove racice-race:

cd ~

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

Za igre NES uporabljam jedro libretro fceumm v Retroarchu. Pojdite v meni Možnosti in konfigurirajte Zapper za zaslon na dotik. (Konfiguriranje kot miška dejansko ne deluje, saj fceumm pričakuje relativno premikanje in ne absolutno pozicijo miške.)

Če začnete igre s skriptom, lahko del, ki zažene igro ali emulator, uredite tako:

python3 ~/lightgun/lightgun.py -t -B 30 "ukaz za začetek igre"

Nato lahko v prvih 30 sekundah izvajanja igre (torej možnost -B 30) svojo svetlobno pištolo povežete tako, da držite 1+2.

Mimogrede, lahko skript lightgun.py uporabite tudi za splošne igre Wii Remote z Retroarch. Samo dodajte možnost -o in funkcije svetlobne pištole bodo izklopljene, namesto tega bo daljinski upravljalnik Wii deloval vodoravno, pri čemer bodo trije gumbi 1, 2 oziroma B. V preslikavah lightgun.py so še druge funkcije, povezane z Retroarchom, ki jih boste odkrili, ko boste prebrali kodo. Tipka minus na primer deluje kot premik in skupaj z dpadom nadzoruje shranjevanje in nalaganje (gor/dol = spremeni številko shranjevanja; levo = obnovi; desno = shrani).

7. korak: Ročaj pištole in usmerjanje

Ročaj pištole in usmerjanje
Ročaj pištole in usmerjanje
Ročaj pištole in usmerjanje
Ročaj pištole in usmerjanje
Ročaj pištole in usmerjanje
Ročaj pištole in usmerjanje

Wii Remote lahko uporabljate kot pištolo in gledate po vrhu. Zanj lahko kupite tudi eno od komercialnih pušk. Ker pa prvotnega daljinskega upravljalnika Wii Remote ni bilo mogoče uporabiti kot pištolo za opazovanje, ohišja ponavadi niso opremljena z železnimi merilniki, železne znamenitosti pa močno izboljšajo natančnost.

Oblikoval sem preprost tridelni sistem za 3D tiskanje: drsni ročaj, ki sedi tik za sprožilcem (zato je nekoliko podoben fazerski napravi Star Trek Original Series), in drsne znamenitosti. Tiskane datoteke so tukaj. Če želite prihraniti pri plastiki na račun ostankov lesa, lahko storite tudi to, kar sem storil jaz in namesto, da natisnem celoten ročaj, natisnem samo del, ki drži Wiimote, in izrežem lesen kos in ga privijem.

Za ogled se osredotočite na znamenitosti. Poravnajte izboklino sprednjega pogleda med udarci zadnjega pogleda, tako da je zračni prostor na obeh enak in vse tri izbokline štrlijo enako visoko. Nato poravnajte sredino tarče z vrhom izboklin.

Opomba: Višina izboklin je nekoliko neenaka, pri čemer je izboklina sprednjega pogleda nekoliko nižja, da bi nadomestili višino samih vidnih izboklin, ko gledate vzdolž njih na razdalji 2,5 metra (moja razdalja do televizorja). Če imate do televizorja bistveno drugačno razdaljo, jo lahko vnesete v datoteke OpenSCAD. Ta prilagoditev je morda vseeno pod tolerancami tiskalnika. Če v programski opremi niste naredili navpične nastavitve, lahko dodate še nekaj prilagoditev znamenitosti v programski opremi, tako da nastavite extraSightAdjust na nekaj okoli -8 (v milimetrih).

8. korak: Umerjanje III (izbirno): Fina nastavitev

Če želite še večjo natančnost, lahko zaženete:

python3 ~/lightgun/lightgun.py -d

(za predstavitev) in pozorno poglejte, ali so znamenitosti usklajene s prečkami. Če ne, zapustite in ročno uredite ~/.wiilightgun/wiimotecalibration ter rahlo prilagodite koordinate x in y središča kamere, da prilagodite opazovanje. Na primer, moja pištola je rahlo streljala v desno, zato sem na koncu spremenil koordinato x s 529 na 525. Številke vseh bodo verjetno drugačne.

9. korak: Dodatek: Algoritem

Dodatek: Algoritem
Dodatek: Algoritem

Koda emulacije miške deluje približno na naslednji način.

  • Pritisni gumb za proces.
  • Pridobite podatke iz fotoaparata in prilagodite kalibracijo centriranja kamere.
  • Če so v fotoaparatu vidne manj kot tri LED diode:

    Zadržite zadnji položaj miške

  • Če so vidne tri ali štiri LED diode:

    • Uporabite podatke merilnika pospeška Wiimote, da določite usmerjenost Wiimote in ugotovite, katera slika LED kamere ustreza kateri fizični LED.
    • Če so vidne štiri LED diode:

      • Izračunajte homografijo med slikami LED fotoaparatov in lokacijami LED (v koordinatah zaslona).
      • S pomočjo homografije izračunajte, katera lokacija zaslona ustreza središču vidnega polja kamere.
      • Prilagodite Y, da nastavite središče navidezne cevi pištole pod vidno črto. To je nekoliko neroden algoritem, vendar deluje.
      • Nastavite položaj miške na prilagojeno mesto zaslona.
    • Če so vidne tri LED diode:

      • Z OpenCV rešite težavo P3P med slikami LED kamere in fizičnimi lokacijami LED. Tako nastanejo do štiri rešitve.
      • Če bo uspelo:

        • Če imamo prejšnji uspešen izračun lokacije, izberite rešitev, zaradi katere bo manjkajoča LED najbližja zadnji opazovani ali izračunani legi te LED.
        • Če prejšnjega uspešnega izračuna lokacije nimamo, izberite rešitev, ki najbolje predvideva naslov merilnika pospeška.
        • Uporabite najboljšo rešitev za izračun, kam naj bi šla četrta LED.
        • Ostalo naredite kot v ohišju s štirimi LED diodami.
      • Če ne uspe:

        Zadržite zadnji položaj miške

Priporočena: