Satura rādītājs:

Precīza Wiimote gaismas pistole aveņu PI: 9 soļi (ar attēliem)
Precīza Wiimote gaismas pistole aveņu PI: 9 soļi (ar attēliem)

Video: Precīza Wiimote gaismas pistole aveņu PI: 9 soļi (ar attēliem)

Video: Precīza Wiimote gaismas pistole aveņu PI: 9 soļi (ar attēliem)
Video: 415. Kas ir cilvēks? - Precīza arhitektūra 2024, Novembris
Anonim
Precīza Wiimote gaismas pistole aveņu PI
Precīza Wiimote gaismas pistole aveņu PI
Precīza Wiimote gaismas pistole aveņu PI
Precīza Wiimote gaismas pistole aveņu PI

Parasti Wii tālvadības pults, ko izmanto kā vieglu pistoli, nav pietiekami precīza retro spēlēm, piemēram, NES Duck Hunt, jo Wii Remote faktiski neizvēlas punktu televizorā, uz kuru tas ir norādīts. Tā nevar! Wii Remote priekšpusē ir infrasarkanā kamera, kas sensora joslā redz infrasarkano gaismas diožu līniju, taču tā nevar zināt, cik tālu (vai kādā virzienā) televizors atrodas no joslas vai cik liels ir televizors. Emulatori un spēles to novērš, parādot krustu vai citu mērķauditorijas atlases indikatoru, taču tā nav precīza mērķa šaušanas pieredze.

Lai Wii tālvadības pults darbotos kā precīzs gaismas lielgabals, ko jūs varat redzēt, lai izvēlētos mērķi televizorā, ir vajadzīgas četras infrasarkanās gaismas diodes, kas izvietotas zināmā četrstūrī (nevis taisnā līnijā) vienā plaknē ar televizoru. Pēc tam Wii tālvadības pults redz četras gaismas diodes, un kameras attēlu var izmantot, lai aprēķinātu homogrāfiju, kas ļauj mums saprast, kur kamera ir vērsta.

Šī projekta aparatūra ir vienkārša. Vienkāršā 3D drukātā korpusā ir četras infrasarkanās gaismas diodes, kuras var pielīmēt televizora korpusa augšpusē un apakšā un pievienot USB lādētājam. Turklāt, ja jums nav Wii ieroču korpusa, man ir vienkāršs 3D drukāts rokturis un tēmēkļi, kurus varat piestiprināt pie Wii tālvadības pults (lai taupītu plastmasu, es izveidoju hibrīdu starp koku un 3D drukātu plastmasu).

Python balstītu programmatūru bija grūtāk izveidot nekā aparatūru, un tā pašlaik ir paredzēta tikai Linux. Tas kalibrē gaismas diodes un Wii tālvadības pulti un pēc tam izmanto homogrāfijas aprēķinus, lai atdarinātu absolūtu peli, kas diezgan labi darbojas Retroarch fceumm NES emulatorā (un, iespējams, arī dažos citos emulatoros) manā Raspberry PI 3B+.

Piegādes

  • Wii tālvadības pults
  • Četras 940 nm 5 mm infrasarkanās gaismas diodes
  • Vecs USB kabelis ar strādājošu A tipa kontaktdakšu
  • Raspberry PI 3 vai cits Linux dators ar Bluetooth atbalstu
  • 3D printeris un kvēldiegs (pēc izvēles)

1. darbība: infrasarkano staru LED ķēde

Infrasarkanā LED ķēde
Infrasarkanā LED ķēde
Infrasarkanā LED ķēde
Infrasarkanā LED ķēde

Iegūstiet vecu USB kabeli ar strādājošu A tipa vīriešu ligzdu (parasti tālruņa uzlādes kabeļi saplīst mikro USB galā, tāpēc man ir palikuši kabeļi ar A tipa vīriešu ligzdu). Patiesībā ir pat labi, ja datu kabeļi ir salauzts, kamēr darbojas elektrolīnijas. Nogrieziet otru galu. Teorētiski sarkanajam kabelim jābūt +5 V un melnam - zemē, bet pārbaudiet to ar multimetru (pievienojiet to lādētājam un pēc tam pārbaudiet spriegumu starp sarkano un melno vadu).

Tā kā infrasarkanajām gaismas diodēm ir aptuveni 1,2-1,3 V sprieguma kritums, es tikko četrus no tiem sērijveidā pielodēju pie USB kabeļa. Pārliecinieties, vai lodējamie vadi ir pietiekami gari, lai televizora apakšā un augšpusē varētu ievietot gaismas diodes, un starp gaismas diodēm jābūt pietiekami lielam horizontālajam attālumam (apmēram 10 collas).

Precīzāk, lai izveidotu LED cilpu:

  • pielīmējiet pirmās gaismas diodes mīnuspusi (katodu, īsāku kāju, ar plakanu malu) pie +5V USB vada
  • pievienojiet pirmās gaismas diodes pluspusi (anodu, garāku kāju, ar apaļu malu) otrās gaismas diodes mīnus pusē
  • atkārtojiet, lai pievienotu otro gaismas diodi trešajai un trešo - ceturtajai
  • pēc tam pievienojiet ceturtās gaismas diodes pluspusi ar vadu pie zemes USB vada.

Lai padarītu lietas kārtīgākas, veicot savienojumus, varat izmantot termiski saraušanās caurules. Pretējā gadījumā izmantojiet elektrisko lenti, lai izvairītos no šortiem.

Pārliecinieties, vai jums nav īssavienojumu. Pēc tam pievienojiet to USB lādētājam un pārbaudiet, vai tas izstaro infrasarkano gaismu, apskatot gaismas diodes ar tālruņa kameru. (Daudzas tālruņu kameras ir jutīgas pret infrasarkano staru.)

2. darbība: pievienojiet televizoram

Pievienojiet televizoram
Pievienojiet televizoram
Pievienojiet televizoram
Pievienojiet televizoram
Pievienojiet televizoram
Pievienojiet televizoram

Tagad pievienojiet divas gaismas diodes televizora apakšpusē un divas augšpusē. Horizontālajam attālumam jābūt apmēram desmit collas. Ja tas ir par daudz, jums var rasties problēmas ar Wii Remote kameras redzamības lauku, kas tos visus uztver. Bet, ja tie ir pārāk tuvu, mana ģeometriskā intuīcija saka, ka jums būs zemāka precizitāte.

Pārbaudei es līmēju gaismas diodes ar elektrisko lenti, un pēc tam pastāvīgam savienojumam es izveidoju un izdrukāju četrus glītus mazus LED klipus (faili ir šeit), kurus es karsti pielīmēju pie televizora. Gaismas diodēm jāatrodas pēc iespējas tuvāk televizora displeja plaknei, un to rāmis neaizklāj tos no vietas, kur fotografēsit.

3. darbība: instalējiet programmatūru

Pašlaik programmatūra ir paredzēta tikai Linux. Šī iestatīšana ir paredzēta Raspberry PI 3 ar Raspbian Stretch. Citām Linux sistēmām būs nepieciešamas dažas izmaiņas. Iepriekšējos modeļos jums būs nepieciešams Bluetooth dongle, un tas būs jāpalaiž arī no komandrindas:

sudo get-apt instalēt Bluetooth

A darbība: udev

Pēc tam izveidojiet failu failā /etc/udev/rules.d/wiimote.rules, kurā ir viena rinda:

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

To var izdarīt, piemēram, ar teksta redaktoru vai komandrindā ierakstot šo:

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

Un pēc tam restartējiet udev:

sudo /etc/init.d/udev restart

B solis: cwiid

Tālāk jums būs nepieciešama mana modificētā cwiid pakotne. Šeit tas kļūst mazliet matains, jo ideālā gadījumā tas būtu jāveido uz sava Raspberry PI, taču man jāatzīstas, ka esmu pazaudējis, kādas paketes jums jāinstalē, lai tas darbotos. Ir trīs iespējas, kā to izdarīt.

B1 variants: veidojiet sevi

cd ~

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

Diemžēl pastāv diezgan liela iespēja, ka jums pietrūkst daudz lietas, kas nepieciešamas tā izveidošanai, un./configure sūdzēsies. Jūs varat apskatīt visas lietas, par kurām tā sūdzas, un palaist uz tām visas sudo apt install.

B2 iespēja: izmantot manus bināros failus

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 solis: python bibliotēkas

Visbeidzot, saņemiet atbalstu manam Lightgun python skriptam:

sudo pip3 instalējiet 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 solis: lightgun.py

Visbeidzot, iegūstiet manu Lightgun python skriptu:

cd ~

git klons

Ja viss ir izdevies, tagad jums ir ~/lightgun.py, kuru varat izmantot, lai kalibrētu gaismas pistoli.

4. solis: Kalibrēšana I daļa: kameras centrēšana

Kalibrēšana I daļa: Kameras centrēšana
Kalibrēšana I daļa: Kameras centrēšana
Kalibrēšana I daļa: Kameras centrēšana
Kalibrēšana I daļa: Kameras centrēšana
Kalibrēšana I daļa: Kameras centrēšana
Kalibrēšana I daļa: Kameras centrēšana

Kalibrēšanai ir divi aspekti. Pirmais ir kalibrēt kameras centru katrā Wiimote. Lai to izdarītu, izmantojiet kameru, lai uzņemtu divus gaismas diodes attēlus ap televizora ekrānu, vienu ar tālvadības pulti labajā pusē uz augšu un otru otrādi.

Lai izvairītos no pogu nospiešanas, kad noliekat Wii tālvadības pulti tā priekšpusē, un lai Wii tālvadības pults būtu vienmērīgā augstumā, varat izdrukāt šeit iekļauto kalibrēšanas rīku. Būtībā jums ir nepieciešamas 10,5 mm biezas lietas, kuras varat ievietot zem Wii tālvadības pults, kad tā atrodas priekšpusē. Es faktiski izmantoju saplākšņa lūžņus, lai ietaupītu uz plastmasas.

Ieslēdziet gaismas diodes un pārliecinieties, vai televizorā tiek parādīts jūsu Raspberry PI vai cits dators. Pievienojiet tastatūru (tas nedarbosies, izmantojot ssh) vai izmantojiet VNC. Pēc tam palaidiet:

python3 ~/lightgun/lightgun.py -M

Ja viss iet labi, jūs saņemsiet pilnekrāna displeju, kurā tiks lūgts nospiest 1+2 uz Wii tālvadības pults. Izdari to. Wii tālvadības pultī mirgos gaismas, un tad 1. un 4. gaisma paliks ieslēgta. Ekrāna augšdaļā redzēsit arī nelielu zaļu taisnstūri ar skatu no Wii Remote kameras. Pavērsiet Wii tālvadības pulti pret gaismas diodēm, un, ja viss noritēs labi, jūs redzēsit četras gaismas diodes, kas numurētas no 1 līdz 4.

Tagad jums jāatrod cieta virsma ar asu malu, piemēram, kafijas galdiņš, kuru varat norādīt uz televizora ekrānu un kas ļauj Wii tālvadības pultī redzēt visas gaismas diodes ar Wii tālvadības pulti, kas ir izlīdzināta pret malu. Sāciet, izlīdzinot Wii tālvadības pulti ar labo pusi uz augšu, ar tālvadības pults malu pret virsmas malu, pārliecinoties, ka ir redzamas visas četras gaismas diodes. Pēc tam nospiediet tastatūras SPACE (vai pievienojiet Nunchuck un nospiediet C, ja tas ir ērtāk). Pēc tam jums tiks piedāvāts pagriezt Wii tālvadības pulti. Tagad, izmantojot kalibrēšanas rīku vai ko citu, pārliecinieties, ka tas ir pacelts no virsmas 10,5 mm uz augšu un tik tuvu tai pašai vietai kā iepriekš (piemēram, izlīdzināts pret tās pašas virsmas malu). Vēlreiz nospiediet SPACE.

Ja viss ir kārtībā, tagad jūs pārejat uz LED kalibrēšanas soli. Jā, tas ir sarežģīti! Bet jums būs ļoti precīzs gaismas lielgabals. Tā ir tikai cena.

Piezīme. Ja, tāpat kā man, jums ir Wii zem televizora, Wii ir jāizslēdz divu iemeslu dēļ: pirmkārt, ja Wii ir ieslēgts, tas izveidos savienojumu ar Wiimote, un, otrkārt, sensoru joslas infrasarkanās gaismas diodes traucēs šo projektu. Līdzīgu iemeslu dēļ, kamēr izmantojat Wii, ieteicams atvienot gaismas diodes no televizora.

5. darbība: kalibrēšana II darbība: gaismas diodes

II kalibrēšanas posms: gaismas diodes
II kalibrēšanas posms: gaismas diodes
II kalibrēšanas posms: gaismas diodes
II kalibrēšanas posms: gaismas diodes

Tagad jums jāinformē programmatūra, kur gaismas diodes atrodas ap televizora malu. Ap televizora malu redzēsit kalibrēšanas ekrānu, kurā redzamas četras bultiņas, no kurām viena ir atlasīta (spilgta) un trīs no tām ir pelēkotas. Jūs izmantojat +/-, lai pārslēgtos, lai mainītu pielāgojamo bultiņu.

Katrai no četrām bultiņām ap malu rīkojieties šādi:

  1. nospiediet Wiimote pa kreisi/pa labi, lai pārvietotu bultiņas, līdz tās pēc iespējas precīzāk norāda uz atbilstošo LED;
  2. nospiediet Wiimote uz augšu/uz leju, lai mainītu bultiņas garumu, līdz bultiņas garums atbilst attālumam starp gaismas diodi un televizora displeja malu; citiem vārdiem sakot, bultiņas garumam jābūt vienādam ar attālumu no bultiņas gala līdz gaismas diodei.

Kad četras bultiņas būs pareizas (un varbūt pat agrāk), norādot Wiimote uz ekrānu, redzēsit sarkanu krustu. Jūs varat pārbaudīt, vai tam vajadzētu būt tam. (Atcerieties, ka jums jābūt pietiekami tālu, lai Wiimote varētu redzēt visas gaismas diodes. Ir arī svarīgi, lai redzamības laukā nebūtu citu infrasarkano staru avotu. Man reiz bija problēmas, jo saules gaisma atstaroja skrūves galvu TV statīvs.)

Visbeidzot, ir piektā bultiņa, kas parādās tikai tad, kad no ceturtās gaismas diodes bultiņas nospiežat + vai - no pirmās (un tai pēc noklusējuma ir nulles garums, tāpēc tas ir tikai pikselis). Šī bultiņa pielāgo, cik tālu virs Wii Remote kameras uzņemtais attēls tiks reģistrēts. Jautājums ir šāds: jūs redzēsit gar Wii Remote augšējo virsmu. Bet kamera faktiski atrodas zināmā attālumā zem šīs virsmas, melnā taisnstūra vidū Wii tālvadības pults priekšpusē. Ja mēs reģistrētu kadrus, kur vērsta kamera, tie tiktu reģistrēti apmēram 8 mm zem Wii Remote augšējās virsmas. To var pārbaudīt, atzīmējot, ka, redzot gar augšējo virsmu, kamera atstāj krustu centru.

Jūs varat dzīvot ar to, vai arī audzēt šo piekto bultiņu, lai programmatūra saskaņotu attēlus ar Wii Remote augšdaļu, vai arī varat pielāgot 3D izdrukājamos failus dzelzs tēmēkļiem, lai to kompensētu (bet kompensācija derēs tikai viens konkrēts attālums līdz televizoram). Es pats devos uz programmatūras saskaņošanu.

Nospiediet HOME uz Wii Remote, lai izietu no kalibrēšanas un saglabātu visus datus direktorijā ~/.wiilightgun.

6. darbība: pārbaude un lietošana

Pārbaude un lietošana
Pārbaude un lietošana
Pārbaude un lietošana
Pārbaude un lietošana
Pārbaude un lietošana
Pārbaude un lietošana

Jūs, iespējams, vēlaties izmēģināt savu vieglo pistoli tagad. Vienkārši palaidiet termināļa emulatorā (vai skriptā):

python3 ~/lightgun/lightgun.py -t

Jums vienlaikus būs jānospiež pogas 1+2, un pēc tam, ja viss būs kārtībā, kamēr lightgun.py darbojas, gaismas pistole atdarinās divu pogu absolūto peli. Sprūda poga ir peles poga 1, un poga A ir peles poga 2. Lai izietu, nospiediet taustiņu kombināciju ctrl-c.

Tagad jums ir jākonfigurē tikai emulatori un/vai spēles, lai tās darbotos ar absolūtu peli. Diemžēl tas ne vienmēr būs tik vienkārši.

Viena jautra lieta, ko jūs varētu izmēģināt, ir mans iminurnameza pīles-pīles dzinuma veids:

cd ~

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

NES spēlēm Retroarch izmantoju libretro fceumm kodolu. Atveriet izvēlni Opcijas un konfigurējiet Zapper kā skārienekrānu. (Konfigurēšana kā pele faktiski nedarbojas, jo fceumm sagaida relatīvu kustību, nevis absolūtas pozīcijas peli.)

Ja sākat spēles ar skriptu, varat rediģēt daļu, kas sāk spēli vai emulatoru, lai teiktu:

python3 ~/lightgun/lightgun.py -t -B 30 "komanda, lai sāktu spēli"

Pēc tam spēles izpildes pirmajās 30 sekundēs (tātad opcija -B 30) varat savienot savu gaismas pistoli, turot nospiestu 1+2.

Starp citu, skriptu lightgun.py var izmantot arī vispārējām Wii Remote spēlēm ar Retroarch. Vienkārši pievienojiet opciju -o, un gaismas pistoles funkcijas tiks izslēgtas, un tā vietā Wii Remote darbosies horizontāli, un trīs pogas ir attiecīgi 1, 2 un B. Lightgun.py kartēs ir arī citas ar Retroarch saistītas funkcijas, kuras jūs atklāsit, izlasot kodu. Piemēram, mīnusa taustiņš darbojas kā nobīde, un kopā ar dpad kontrolē saglabāšanu un ielādi (augšup/lejup = mainīt saglabāšanas numuru; pa kreisi = atjaunot; pa labi = saglabāt).

7. solis: pistoles rokturis un mērķēšana

Pistoles rokturis un mērķis
Pistoles rokturis un mērķis
Pistoles rokturis un mērķis
Pistoles rokturis un mērķis
Pistoles rokturis un mērķis
Pistoles rokturis un mērķis

Jūs varat izmantot Wii tālvadības pulti kā ieroci, redzot augšpusē. Par to varat iegādāties arī kādu no komerciālajiem ieroču apvalkiem. Bet, tā kā oriģinālo Wii tālvadības pulti nevarēja izmantot kā nopūšamu pistoli, apvalkiem parasti nav dzelzs tēmēkļu, un dzelzs tēmēkļi ievērojami uzlabo precizitāti.

Es izveidoju vienkāršu trīsdaļīgu 3D izdrukājamu sistēmu: uzbīdāmu rokturi, kas atrodas tieši aiz sprūda (tātad tas izskatās mazliet kā Star Trek oriģinālās sērijas fāzeris), un bīdāmos tēmēkļus. Drukājami faili ir šeit. Ja vēlaties ietaupīt plastmasu uz koka lūžņu rēķina, varat arī darīt to, ko es darīju, un tā vietā, lai drukātu visu rokturi, izdrukājiet tikai to daļu, kurā ir Wiimote, un izgrieziet koka gabalu un pieskrūvējiet to.

Lai redzētu, koncentrējiet acis uz apskates objektiem. Izlīdziniet priekšējā skata izciļņus starp aizmugurējā skata izciļņiem tā, lai gaisa telpa abās pusēs būtu vienāda un visi trīs izciļņi izvirzītos vienādi augsti. Pēc tam izlīdziniet mērķa vidusdaļu ar izciļņu augšdaļu.

Piezīme: izciļņu augstums ir nedaudz nevienāds, un priekšējā skata izciļņi ir nedaudz zemāki, lai kompensētu redzes triecienu augstumu, kad redzat tos 2,5 metru attālumā (mans attālums līdz televizoram). Ja attālums līdz televizoram ir ievērojami atšķirīgs, varat to ievietot OpenSCAD failos. Tomēr šī korekcija var būt zemāka par printera pielaidēm. Turklāt, ja programmatūrā neveicāt vertikālo regulēšanu, varat pievienot vēl dažus pielāgojumus programmatūras apskates objektiem, iestatot extraSightAdjust kaut ko aptuveni -8 (milimetros).

8. darbība: III kalibrēšana (pēc izvēles): precīza regulēšana

Ja vēlaties vēl lielāku precizitāti, varat palaist:

python3 ~/lightgun/lightgun.py -d

(demonstrācijai) un uzmanīgi apskatiet, vai apskates objekti sakrīt ar krustiem. Ja tie nenotiek, izejiet un manuāli rediģējiet ~/.wiilightgun/wiimotecalibration un nedaudz izlabojiet kameras centra x un y koordinātas, lai pielāgotu redzamību. Piemēram, mans lielgabals šaudījās nedaudz pa labi, tāpēc es nomainīju x koordinātu no 529 uz 525. Iespējams, visi skaitļi būs atšķirīgi.

9. solis: Pielikums: algoritms

Pielikums: Algoritms
Pielikums: Algoritms

Peles emulācijas kods darbojas aptuveni šādi.

  • Nospiež procesa pogu.
  • Iegūstiet datus no kameras un pielāgojiet kameras centrēšanas kalibrēšanai.
  • Ja kamerā ir redzamas mazāk nekā trīs gaismas diodes:

    Saglabājiet pēdējo peles pozīciju

  • Ja ir redzamas trīs vai četras gaismas diodes:

    • Izmantojiet Wiimote akselerometra datus, lai iegūtu Wiimote orientāciju un noteiktu, kurš LED kameras attēls atbilst kādam fiziskajam LED.
    • Ja ir redzamas četras gaismas diodes:

      • Aprēķiniet homogrāfiju starp LED kameru attēliem un LED atrašanās vietām (ekrāna koordinātās).
      • Izmantojiet homogrāfiju, lai aprēķinātu, kāda ekrāna atrašanās vieta atbilst kameras redzamības lauka centram.
      • Veiciet Y regulēšanu, lai pielāgotos virtuālā lielgabala stobra centram zem redzamības līnijas. Šis ir nedaudz viltīgs algoritms, taču tas darbojas.
      • Iestatiet peles pozīciju uz pielāgoto ekrāna atrašanās vietu.
    • Ja ir redzamas trīs gaismas diodes:

      • Izmantojiet OpenCV, lai atrisinātu P3P problēmu starp LED kameru attēliem un gaismas diožu fiziskajām atrašanās vietām. Tas rada līdz četriem risinājumiem.
      • Ja izdodas:

        • Ja mums ir iepriekš veikts veiksmīgs atrašanās vietas aprēķins, izvēlieties risinājumu, kura dēļ trūkstošā gaismas diode ir vistuvāk pēdējai novērotajai vai aprēķinātajai šīs gaismas diodes pozīcijai.
        • Ja mums iepriekš nav bijis veiksmīgs atrašanās vietas aprēķins, izvēlieties risinājumu, kas vislabāk paredz akselerometra virzienu.
        • Izmantojiet labāko risinājumu, lai aprēķinātu, kur jāiet ceturtajai gaismas diodei.
        • Pārējo dariet tāpat kā četru LED korpusā.
      • Ja neizdodas:

        Saglabājiet pēdējo peles pozīciju

Ieteicams: