Riktiga vapen som kontrollörer: Hur man tar med allt i VR

Jag är Christopher O’Hagan, mjukvaruingenjör på @KainosSoftware och jag arbetar i avdelningen Applied Innovation. Fokusera på fördjupande tekniker. Den här bloggen handlar om hur vi nyligen förvandlade en nästan helt fungerande gevär till en Virtual Reality-controller och hur vi övervann de problem som följde med den.

Vi har nyligen kontaktats av en kanadensisk kund som letar efter hjälp med att bygga en realistisk shooter som en attraktion för deras arkad. Detta är en del av en växande trend som vi har observerat där fördjupande teknik som VR används för underhållningsföretag på plats som flygresor och berg-och dalbanor. Även om utrustningen och installationen kan vara dyr är den livskraftig på grund av det stora fotfallet och nya miljöer som dessa företag erbjuder. Ett bra exempel på underhållning på plats är virtuell paintball som företag som "The Void" har lyckats göra.

Vår främsta utmaning för den uppslukande skytten vi hjälpte till var att bygga och använda ett verkligt skjutvapen ... eller åtminstone något som såg ut och kändes som en.

Skaffa styrenheten

Ursprungligen trodde vi att det skulle vara svårt att köpa en controller. Vi nådde ut till en lokal leverantör av luftmjuk pistol, Gear of War. Våra krav var:

  • En replik luftmjuk gevär som såg ut, kände och vägdes som en riktig gevär
  • En pistol som, när den avfyras skulle ge realistisk rekyl
  • En avtryckare och säkerhet som anslutits så att vi kunde använda dem för insignaler i vår simulering

Vi trodde att detta skulle fråga mycket men blev förvånade över att detta verkade normalt för dem. De har gjort en hel del rekvisita för TV och filmer, så de hade fått skrikande förfrågningar. Vi använde sedan en monterad Vive-tracker för att spåra pistolen i VR.

Ställa in regulatorn

Det var här vi upplevde vårt huvudsakliga problem, vibrationer: Frågan orsakades av den realistiska rekylen av vår pistol. Eftersom Vive Tracker använder IMU: er (Tröghetsrörelseenheter) för spårning med en hög frekvens, och Vive fyrsystem för spårning med en jämförelsevis lägre frekvens och för driftkorrigering. IMU: er fungerar genom att mäta acceleration i varje axel och sedan beräkna förskjutning från den mätningen. När IMU: er vibreras aggressivt, till exempel när de monteras på ett realistiskt skjutvapen, kan de inte spåra exakt. Detta var ett problem.

Eftersom vi inte är experter på vibrationer gjorde vi några försök att lösa problemet men gjorde inte mycket framsteg. Vi bestämde oss sedan för att göra ett reddit-inlägg till r / Vive. Gemenskapens svar var till hjälp och korrigerade några enkla saker vi missade, till exempel att spåraren var för långt upp på järnvägen. Till vår överraskning kontaktade HTC oss om projektet som visar intresse för vad vi försökte göra. De hade en beta-version av Vive Tracker-firmware som kunde hjälpa, ett lågpassfilter för IMU, som de gav oss.

Graf över normal ingång kontra ingång efter användning av lågpassfilter

Lågpassfiltret kan konfigureras via USB HID-gränssnittet. Vi kunde skicka "0xB3" -rapporter, som skickar grundläggande information om enheten som används samt lågpasskonfigurationen, från en MacBook till Tracker med rätt inställningar för att dämpa vibrationerna tillräckligt. Nästa steg var att skicka funktionsrapporten, som gör att vi kan kommunicera ändringar i inställningar såväl som att styra HID-enheter, till Tracker från en hallonpi eftersom vi behövde något som kunde passa in i pistolens patron så att användaren inte kunde se ledningarna.

Lågpassfilter

Det här är stegen för att ställa in Raspberry Pi för den här typen av projekt

  • Installera hallon på hallonpi
  • Uppdatera pis version av 'Node.js'
  • Installera biblioteket med "nod-dolda" i ditt projekt för specifik instruktion för att göra det på pi-serien här
  • Lägg till en fil i udev som heter `60-HTC-Vive-perms.rules` med den här raden i den
KERNEL == "hidraw *", SUBSYSTEM == "hidraw", ATTRS {idVendor} == "28de", ATTRS {idProduct} == "2022", TAG + = "uaccess"

Ett problem som du kan ha är att fel wIndex-värde används av nod-dölj, i detta fall används wIndex för att ange gränssnittet eller vart rapporten skickas. Här är något som hjälper dig att ta dig runt USB-förfrågningar. "Nod-dold" tillåter dig inte att ange gränssnittet. Lyckligtvis när jag tittade tillbaka på 'show-device.js', som kommer med biblioteket 'node-hid' och matar ut alla anslutna HID-enheter, hade det olika vägar för varje gränssnitt.

Med hjälp av show-devices.js, som levereras med noden-dolda biblioteket. Du kan hitta vilken sökväg du ska använda i koden om den verkar annorlunda

Om du har några andra problem med skriptet kommer 'usbmon' med Raspbian och låter dig se alla usb-förfrågningar som görs. Här är en användbar länk som hjälper dig att avkoda dessa begäranden. (Börjar på sidan 15)

Slutsats

Att använda en pistol som VR-kontroller var inte alls enkelt. Vibrationerna i pistolskytningen är tillräckligt starka för att störa IMU: s förmåga att exakt spåra sig själv. Med hjälp av Tracker's lågpassfilterfunktion och en hallonpi ombord kunde vi övervinna detta problem utan att kompromissa med spårningen eller kraften där pistolen vibrerar.

Tack för att du läser
@ cohagan154