Obsah:

Přesná Wiimote Light Gun pro Raspberry PI: 9 kroků (s obrázky)
Přesná Wiimote Light Gun pro Raspberry PI: 9 kroků (s obrázky)

Video: Přesná Wiimote Light Gun pro Raspberry PI: 9 kroků (s obrázky)

Video: Přesná Wiimote Light Gun pro Raspberry PI: 9 kroků (s obrázky)
Video: Flotte Beinfreiheit nähen / Pumphose mit kostenlosem Schnittmuster 2024, Červenec
Anonim
Přesná lehká pistole Wiimote pro Raspberry PI
Přesná lehká pistole Wiimote pro Raspberry PI
Přesná lehká pistole Wiimote pro Raspberry PI
Přesná lehká pistole Wiimote pro Raspberry PI

Wii Remote používaný jako lehká zbraň obvykle není dostatečně přesný pro retro hry jako NES Duck Hunt, protože Wii Remote ve skutečnosti nevybírá bod na televizi, na který ukazuje. To nemůže! Wii Remote má vepředu infračervenou kameru, která vidí řadu infračervených LED diod v senzorové liště, ale nemůže vědět, jak daleko (nebo v jakém směru) je televizor od lišty nebo jak velký je televizor. Emulátory a hry to obcházejí tak, že ukazují křížky nebo jiný indikátor cílení, ale to není přesný zážitek ze střelby na cíl.

Aby Wii Remote fungoval jako přesná světelná zbraň, kterou můžete sledovat a vybrat cíl na televizoru, vyžaduje čtyři infračervené LED uspořádané ve známém čtyřúhelníkovém vzoru (nikoli přímce) ve stejné rovině jako televizor. Wii Remote poté vidí čtyři LED diody a obraz z kamery lze použít k výpočtu homografie, která nám umožní zjistit, kam kamera míří.

Hardware pro tento projekt je jednoduchý. K dispozici jsou čtyři infračervené LED diody v jednoduchých 3D tištěných pouzdrech, které lze nalepit na horní a spodní část pouzdra televizoru a zapojit do USB nabíječky. Navíc v případě, že nemáte pouzdro na zbraň Wii, mám jednoduchou 3D tištěnou rukojeť a mířidla, která můžete připojit k Wii Remote (i když kvůli úspoře plastu jsem z mého vyrobil hybrid mezi dřevem a 3D potištěným plastem).

Software založený na pythonu byl těžší na výrobu než hardware a v současné době je pouze pro Linux. Kalibruje diody LED a ovladač Wii Remote a poté pomocí homografických výpočtů emuluje absolutní myš, která funguje docela dobře v emulátoru NCE (a pravděpodobně některých dalších emulátorech) Retroarchu na mém Raspberry PI 3B+.

Zásoby

  • Wii Remote
  • Čtyři 940nm 5mm infračervené LED diody
  • Starý USB kabel s funkční zástrčkou typu A.
  • Raspberry PI 3 nebo jiný počítač s Linuxem s podporou Bluetooth
  • 3D tiskárna a filament (volitelně)

Krok 1: Infračervený LED řetěz

Infračervený LED řetěz
Infračervený LED řetěz
Infračervený LED řetěz
Infračervený LED řetěz

Pořiďte si starý USB kabel s fungující zástrčkou typu A (obvykle se mi nabíjecí kabely telefonu lámou na konci micro USB, takže mi zbyly kabely s fungující zástrčkou typu A). Vlastně je to dokonce v pořádku, pokud jsou datové kabely přerušeno, dokud funguje elektrické vedení. Odřízněte druhý konec. Teoreticky by měl být červený kabel +5 V a černý by měl být uzemněn, ale zkontrolujte jej pomocí multimetru (zapojte jej do nabíječky a poté zkontrolujte napětí mezi červeným a černým vodičem).

Vzhledem k tomu, že infračervené LED diody mají pokles napětí přibližně 1,2-1,3 V, připájel jsem čtyři z nich do sériové smyčky na USB kabel. Ujistěte se, že kabely, které pájíte, jsou dostatečně dlouhé, abyste mohli umístit LED diody na spodní část televizoru a dvě na horní, se slušným horizontálním prostorem mezi LED (asi 10 palců).

Přesněji pro vytvoření smyčky LED:

  • pájet minusovou stranu (katoda, kratší noha, s plochým okrajem) první LED na +5V USB vodič
  • připojte kladnou stranu první LED (anoda, delší noha, s kulatým okrajem) k mínusové straně druhé LED
  • opakováním připojte druhou LED k třetí a třetí ke čtvrté
  • potom připojte kladnou stranu čtvrté LED pomocí vodiče k uzemňovacímu vodiči USB.

Aby byly věci úhlednější, můžete při spojování použít smršťovací bužírky. Jinak použijte elektrickou pásku, abyste se vyhnuli zkratům.

Zajistěte, aby nedošlo ke zkratu. Poté jej zapojte do USB nabíječky a zkontrolujte, zda vyzařuje infračervené světlo, a to pomocí pohledu na diody LED pomocí kamery telefonu. (Mnoho telefonních kamer je citlivých na infračervené záření.)

Krok 2: Připojte k televizi

Připojit k televizi
Připojit k televizi
Připojit k televizi
Připojit k televizi
Připojit k televizi
Připojit k televizi

Nyní připevněte dvě LED diody na spodní stranu televizoru a dvě na horní stranu. Horizontální rozteč by měla být asi deset palců. Pokud je to příliš mnoho, můžete mít problémy se zorným polem kamery Wii Remote, které je všechny zachycuje. Ale pokud jsou příliš blízko, pak moje geometrická intuice říká, že budete mít nižší přesnost.

Pro testování jsem LED diody přelepil elektrickou páskou a poté pro trvalé připojení navrhl a vytiskl čtyři úhledné malé LED klipy (soubory jsou zde), které jsem za horka nalepil na televizi. LED diody byste měli nastavit tak, aby byly co nejblíže rovině televizního displeje, aniž by je rámeček zakrýval z místa, kde budete střílet.

Krok 3: Nainstalujte software

Aktuálně je software pouze pro Linux. Následující nastavení je určeno pro Raspberry PI 3 s Raspbian Stretch. Jiné systémy Linux budou vyžadovat určité změny. U dřívějších modelů budete potřebovat Bluetooth dongle a budete ho muset spustit také z příkazového řádku:

sudo get-apt nainstalovat bluetooth

Krok A: udev

Dále vytvořte soubor v /etc/udev/rules.d/wiimote.rules, který obsahuje jeden řádek:

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

Můžete to udělat například pomocí textového editoru nebo zadáním následujícího příkazu na příkazový řádek:

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

A pak restartujte udev:

sudo /etc/init.d/udev restart

Krok B: cwiid

Dále budete potřebovat můj upravený balíček cwiid. Tady to začíná být trochu chlupaté, protože v ideálním případě byste to museli postavit na svém Raspberry PI, ale musím se přiznat, že jsem ztratil přehled o tom, jaké balíčky musíte nainstalovat, aby to fungovalo. Existují tři možnosti, jak to provést.

Možnost B1: Postavte se

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

Bohužel je docela pravděpodobné, že vám chybí spousta věcí potřebných k jeho vytvoření, a./configure si bude stěžovat. Můžete se podívat na všechny věci, na které si stěžuje, a na všech spustit sudo apt install.

Možnost B2: Použít mé binární soubory

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

Krok C: knihovny pythonu

Nakonec získejte podporu pro můj skript lightgun python:

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

Krok D: lightgun.py

Nakonec si pořiďte můj python skript lightgun:

cd ~

klon git

Pokud vše proběhlo dobře, nyní máte ~/lightgun.py, který můžete použít ke kalibraci světelné zbraně.

Krok 4: Kalibrace Část I: Vycentrování kamery

Kalibrace Část I: Vycentrování kamery
Kalibrace Část I: Vycentrování kamery
Kalibrace Část I: Vycentrování kamery
Kalibrace Část I: Vycentrování kamery
Kalibrace Část I: Vycentrování kamery
Kalibrace Část I: Vycentrování kamery

Kalibrace má dva aspekty. První je kalibrovat střed kamery na každém Wiimote. To vyžaduje, aby fotoaparát pořídil dva obrazy LED diod kolem vaší televizní obrazovky, jeden dálkovým ovladačem nahoru a druhý obráceně.

Abyste se vyhnuli stisknutí tlačítek, když položíte Wii Remote na jeho přední stranu, a aby měl Wii Remote konzistentní nadmořskou výšku, můžete si zde vytisknout kalibrační nástroj, který jsem zde zahrnoval, 3D. V zásadě potřebujete věci o tloušťce 10,5 mm, které můžete umístit pod Wii Remote, když leží na přední straně. Vlastně jsem použil šrotovou překližku, abych ušetřil na plastu.

Zapněte LED diody a ujistěte se, že se na televizi zobrazuje váš Raspberry PI nebo jiný počítač. Připojte klávesnici (to nebude fungovat přes ssh) nebo použijte VNC. Poté spusťte:

python3 ~/lightgun/lightgun.py -M

Pokud vše půjde dobře, zobrazí se obrazovka na celou obrazovku s žádostí o stisknutí 1+2 na Wii Remote. Udělej to. Na Wii Remote budou blikat kontrolky a poté kontrolky 1 a 4 zůstanou rozsvícené. V horní části obrazovky uvidíte také malý zelený obdélník s pohledem z kamery Wii Remote. Namiřte Wii Remote na LED diody a pokud vše půjde dobře, uvidíte čtyři LED diody očíslované od 1 do 4.

Nyní musíte najít pevný povrch s ostrými hranami, například konferenční stolek, na který můžete ukazovat na televizní obrazovku a který umožní Wii Remote vidět všechny LED diody s Wii Remote zarovnaným s okrajem. Začněte zarovnáním ovladače Wii Remote pravou stranou nahoru tak, aby strana ovladače byla zarovnána s hranou povrchu a ujistěte se, že jsou vidět všechny čtyři LED diody. Poté stiskněte klávesu SPACE na klávesnici (nebo připojte Nunchuck a stiskněte C, pokud je to pohodlnější). Poté budete vyzváni k otočení ovladače Wii Remote. Nyní se ujistěte, že je vyvýšen o 10,5 mm výše od vašeho povrchu, pomocí kalibračního nástroje nebo něčeho jiného, a ve stejné blízkosti jako dříve (např. Zarovnán se stejným okrajem vašeho povrchu). Stiskněte znovu SPACE.

Pokud je vše v pořádku, přejdete nyní ke kroku kalibrace LED. Ano, je to složité! Ale budete mít velmi přesnou světelnou zbraň. To je jen cena.

Poznámka: Pokud máte jako já Wii pod televizorem, je třeba Wii vypnout ze dvou důvodů: za prvé, pokud je Wii zapnuté, připojí se k Wiimote a za druhé, infračervené LED diody na senzorové liště budou rušit tento projekt. Z podobných důvodů, když používáte Wii, je dobré odpojit LED diody kolem televize.

Krok 5: Kalibrace Krok II: LED diody

Kalibrační krok II: LED diody
Kalibrační krok II: LED diody
Kalibrační krok II: LED diody
Kalibrační krok II: LED diody

Nyní musíte softwaru sdělit, kde jsou diody LED umístěny kolem okraje televizoru. Kolem okraje televizoru uvidíte kalibrační obrazovku se čtyřmi šipkami, z nichž jedna je vybraná (jasná) a tři jsou zašedlé. Pomocí +/- přepínáte a měníte šipku, kterou upravujete.

U každé ze čtyř šipek kolem okraje proveďte toto:

  1. stiskněte doleva/doprava na Wiimote, abyste posunuli šipky, dokud neukazují tak přesně, jak můžete směrem k odpovídající LED;
  2. stisknutím nahoru/dolů na Wiimote změňte délku šipky, dokud se délka šipky neshoduje se vzdáleností mezi LED a okrajem televizního displeje; jinými slovy, délka šipky se musí rovnat vzdálenosti od špičky šipky k LED.

Jakmile jsou vaše čtyři šipky správné (a možná ještě dříve), uvidíte červený zaměřovací kříž, když namíříte Wiimote na obrazovku. Můžete zkontrolovat, zda by to mělo být tam. (Pamatujte, že musíte být dostatečně daleko, aby Wiimote viděl všechny LED diody. Je také důležité, aby v zorném poli nebyly žádné jiné zdroje infračerveného záření. Kdysi jsem měl potíže kvůli slunečnímu záření odrážejícímu se od hlavy šroubu na TV stojan.)

Konečně je tu pátá šipka, která se zobrazí, pouze když stisknete + ze čtvrté šipky LED nebo - z první (a ve výchozím nastavení má nulovou délku, takže je to jen pixel). Tato šipka upravuje, jak vysoko nad kamerou Wii Remote bude snímek zaregistrován. Problém je následující: budete pozorovat horní povrch Wii Remote. Fotoaparát je však ve skutečnosti umístěn v určité vzdálenosti pod tímto povrchem, uprostřed černého obdélníku v přední části ovladače Wii Remote. Pokud bychom zaregistrovali záběry, kam kamera míří, byly by zaregistrovány asi 8 mm pod horním povrchem Wii Remote. Můžete to zkontrolovat tím, že při pohledu na horní povrch je střed nitkových křížů skrytý kamerou.

Můžete s tím žít, nebo můžete pěstovat tuto pátou šipku tak, aby záběry byly zarovnány s horní částí Wii Remote, nebo můžete upravit 3D tisknutelné soubory pro mířidla tak, aby to kompenzovaly (ale kompenzace bude fungovat pouze pro jedna konkrétní vzdálenost od televize). Sám jsem šel na softwarové vyrovnání.

Stisknutím tlačítka HOME na Wii Remote ukončíte kalibraci a uložíte všechna data do adresáře ~/.wiilightgun.

Krok 6: Test a použití

Test a použití
Test a použití
Test a použití
Test a použití
Test a použití
Test a použití

Pravděpodobně budete chtít nyní vyzkoušet svou lehkou zbraň. Stačí spustit v emulátoru terminálu (nebo skriptu):

python3 ~/lightgun/lightgun.py -t

Budete muset stisknout současně tlačítka 1+2 a poté, pokud vše půjde dobře, dokud běží lightgun.py, bude lightgun emulovat absolutní myš se dvěma tlačítky. Tlačítko spouště je tlačítko myši 1 a tlačítko A je tlačítko myši 2. Ukončete stisknutím ctrl-c.

Nyní stačí pouze nakonfigurovat emulátory a/nebo hry, aby fungovaly s absolutní myší. Bohužel ne vždy to bude tak snadné.

Jedna zábavná věc, kterou byste mohli zkusit, je můj mod iminurnamez's duck-duck-shoot:

cd ~

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

U her NES používám jádro libretro fceumm v Retroarchu. Přejděte do nabídky Možnosti a nakonfigurujte Zapper jako dotykovou obrazovku. (Konfigurace jako myš ve skutečnosti nefunguje, protože fceumm očekává spíše relativní pohyb než absolutní polohu myši.)

Pokud své hry spustíte pomocí skriptu, můžete upravit část, která hru nebo emulátor spouští, a říci:

python3 ~/lightgun/lightgun.py -t -B 30 "příkaz ke spuštění hry"

Poté během prvních 30 sekund provádění hry (odtud možnost -B 30) můžete svoji světelnou zbraň připojit podržením 1+2.

Mimochodem, skript lightgun.py lze také použít pro obecné hraní Wii Remote s Retroarch. Stačí přidat možnost -o a funkce světelné pistole se vypnou a místo toho bude Wii Remote pracovat horizontálně, přičemž tři tlačítka budou 1, 2 a B. V mapování lightgun.py existují další funkce související s Retroarchem, které zjistíte čtením kódu. Klávesa minus například funguje jako posun a společně s dpadem ovládá ukládání a načítání (nahoru/dolů = změna čísla uložení; vlevo = obnovení; vpravo = uložení).

Krok 7: Rukojeť a zaměření zbraně

Rukojeť zbraně a míření
Rukojeť zbraně a míření
Rukojeť zbraně a míření
Rukojeť zbraně a míření
Rukojeť zbraně a míření
Rukojeť zbraně a míření

Dálkové ovládání Wii můžete použít jako zbraň a pozorovat ho nahoře. Můžete si k němu také koupit jeden z komerčních nábojů. Ale protože původní Wii Remote nemohl být použit jako pozorovatelná zbraň, pouzdra obvykle nepřicházela s železnými mířidly a železné mířidla výrazně zlepšovaly přesnost.

Navrhl jsem jednoduchý třídílný systém pro 3D tisk: nasouvací rukojeť, která sedí těsně za spouští (takže vypadá trochu jako phaser Star Trek Original Series), a nasouvací mířidla. Soubory k tisku jsou zde. Pokud chcete ušetřit na plastu na úkor šrotu, můžete také udělat to, co jsem udělal, a místo tisku celé rukojeti vytisknout jen část, která drží Wiimote, a vystřihnout dřevěný kus a přišroubovat ho.

Chcete -li vidět, zaměřte své oči na památky. Zarovnejte hrbol předního mířidla mezi nerovnosti zadního mířidla tak, aby vzduchový prostor na obou byl stejný a všechny tři nerovnosti trčely stejně vysoko. Poté zarovnejte střed cíle s horní částí nerovností.

Poznámka: Výška nerovností je mírně nerovnoměrná, přičemž hrbol předního mířidla je o něco nižší, aby se vyrovnala výška samotných hrbolů, když je vidíte po vzdálenosti 2,5 metru (moje vzdálenost od televize). Pokud máte k televizi výrazně odlišnou vzdálenost, můžete ji vložit do souborů OpenSCAD. Tato úprava však může být pod tolerancemi tiskárny. Pokud jste v softwaru neprovedli vertikální úpravu, můžete přidat další úpravy zaměřovačů v softwaru nastavením extraSightAdjust na hodnotu kolem -8 (v milimetrech).

Krok 8: Kalibrace III (volitelně): Jemné nastavení

Pokud chcete ještě větší přesnost, můžete spustit:

python3 ~/lightgun/lightgun.py -d

(pro ukázku) a pečlivě se podívejte, zda jsou mířidla v souladu s nitkovými kříži. Pokud tomu tak není, ukončete a ručně upravte ~/.wiilightgun/wiimotecalibration a mírně upravte souřadnice x a y středu kamery, abyste upravili pozorování. Například moje zbraň střílela mírně doprava, takže jsem nakonec změnil souřadnici x z 529 na 525. Čísla každého budou pravděpodobně jiná.

Krok 9: Dodatek: Algoritmus

Dodatek: Algoritmus
Dodatek: Algoritmus

Emulační kód myši funguje zhruba následovně.

  • Stiskněte tlačítko procesu.
  • Získejte data z kamery a upravte kalibraci centrování kamery.
  • Pokud jsou ve fotoaparátu viditelné méně než tři diody LED:

    Udržujte poslední pozici myši

  • Pokud jsou vidět tři nebo čtyři LED diody:

    • Pomocí údajů akcelerometru Wiimote získáte orientaci Wiimote a identifikujete, který obraz LED kamery odpovídá které fyzické LED.
    • Pokud jsou vidět čtyři LED diody:

      • Vypočítejte homografii mezi snímky LED kamery a umístěním LED (v souřadnicích obrazovky).
      • Pomocí homografie vypočítejte, jaké umístění obrazovky odpovídá středu zorného pole kamery.
      • Proveďte nastavení Y a upravte střed virtuální hlaveň pod zaměřovací čárou. Je to poněkud kludgy algoritmus, ale funguje to.
      • Nastavte polohu myši na upravené umístění obrazovky.
    • Pokud jsou vidět tři LED diody:

      • Použijte OpenCV k vyřešení problému P3P mezi obrazy LED kamery a fyzickými umístěními LED. To generuje až čtyři řešení.
      • V případě úspěchu:

        • Pokud máme předchozí úspěšný výpočet polohy, zvolte řešení, díky kterému bude chybějící LED nejblíže k poslední pozorované nebo vypočítané poloze dané LED.
        • Pokud nemáme předchozí úspěšný výpočet polohy, zvolte řešení, které nejlépe předpovídá směr akcelerometru.
        • Použijte nejlepší řešení k výpočtu, kam by měla jít čtvrtá LED.
        • Zbytek proveďte stejně jako v případě čtyř LED diod.
      • Pokud není úspěšný:

        Udržujte poslední pozici myši

Doporučuje: