Windows'ta DualShock 4 hareket sensörüne erişim (ideal olarak Unity)


10

Windows 7 altında Unity'de bir hareket denetleyicisi olarak DualShock 4'ün IMU'sunu kullanmaya çalışıyorum .

Şimdiye kadar denedim:

  • DS4Windows (1.5.11): hareket sensörü verilerini okur, ancak sol ve sağ çubuklarla eşlemediğim sürece bunları eksen olarak Unity'ye maruz bırakmaz. Bu, çubuk kullanımını kaybettiğim için yeterli değil, 6 veri kanalından sadece 4'ünü sığabiliyorum ve gelen değerler dar bir aralığa kırpılıyor.
  • Motioninjoy (0.7.1001): DS4'ü bir denetleyici olarak algılamaz (en son dokümanlar yalnızca DS3 ve önceki sürümleri ifade eder)
  • GlovePIE (0.43): DualShock 3'ü LibUSB-Win32 (uzun bir atış) ile kullanma talimatlarını uyguladıktan sonra , SixAxis özelliklerinin tümü boştur.

Geçmişte Wii uzaktan hareket sensörü verilerini yakalamak ve OSC mesajları aracılığıyla Unity'ye aktarmak için GlovePIE gibi harici programlar kullandım , bu yüzden kontrol ünitesinin sensörlerini okumak için Unity'yi alamazsam böyle bir yaklaşıma açık olurdum doğrudan Giriş sistemi üzerinden .

Bununla şansı olan var mıydı?

Yanıtlar:


8

Uygulanabilir bir yaklaşım buldum. Yakalanarak DS4Tool kaynağını ve doğrudan cihazdan raporları okuması için benim Birlik projeye gerekli bitleri kopyalandı.

(Bu , HidDevices'in cihaz numaralandırması ve HidDevice sınıfından raporun okunması Kernel32.dll ile arabirim oluşturmak için NativeMethods sınıfıdır . Verileri olabildiğince hızlı.)

Bu kılavuz bana 64 baytlık raporda hareket sensörü verilerini nerede bulacağımı anlattı. Biraz ampirik test ve bu veri gs ve radyan / sn içine alır gibi görünüyor:

accel = new Vector3(
            System.BitConverter.ToInt16(_inputBuffer, 19),
            System.BitConverter.ToInt16(_inputBuffer, 21),
            System.BitConverter.ToInt16(_inputBuffer, 23)
            )/8192f;

gyro = new Vector3(
            System.BitConverter.ToInt16(_inputBuffer, 13),
            System.BitConverter.ToInt16(_inputBuffer, 15),
            System.BitConverter.ToInt16(_inputBuffer, 17)
            )/1024f;

Bu, x + sağ, y + yukarı ve z + işaretinin oynatıcıya doğru baktığı sağ elini kullanan bir koordinat sistemidir.

Verileri bu şekilde getirmek, standart olmayan sürücüleri indirmeye veya arka planda ekstra yazılım çalıştırmaya gerek kalmadan, düğmeleri ve çubukları beklendiği gibi toplayacak olan Unity'nin InputManager'ına müdahale etmez.


Güncelleme: Kablosuz (Bluetooth)

Bunu kablosuz olarak çalışacak şekilde genişleten iki sorun buldum (ve iki çözüm):

  1. DualShock 4s, Windows ile eşleştirilmiş kalmayı sevmez (Windows 8'den önce). Bu aptalca prosedür Windows 7'de bunun etrafında çalışıyor gibi görünüyor.

  2. Bluetooth ile bağlandığında hareket sensörü verisi yok . Hareket verileri gönderme işlemine dahil etmek için cihaza bir Çıktı Raporu yazmanız gerektiğini keşfettim (yöntem için HidDevice ve sihirli numaralar için DS4Device'e bakın). Bu yapıldıktan sonra, geri aldığınız girdi raporları 2 bayt kaydırılacaktır.


Bu gönderi başına bu cevabı açıklığa kavuşturmak mümkün mü ?

Şu anda seyahat ediyorum, ama wifi ile kesinti yaşadığımda bunu alacağım. Teşekkürler @JoshPetrie!
DMGregory

Bu konuya baktığımda, üzerinde çalıştığım hareket algılama projesi için kaynak kodum yok ve DS4Tool'a geri dönmek neden sadece ihtiyacım olan bitleri söktüğümü hatırlattı! Bu çok ayrıntılı olur ve StackExchange yanıtı için makul bir sürenin ötesine geçebilir. Elimden geldiğince basitleştirmeye çalışacağım ama biraz zaman alacak.
DMGregory

1
@DMGregory - Bu veri sayfası, sanırım, DualShock 4'ün kullandığı IMU için: mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf - ve Short.MaxValue karşılık geliyor saniyede 2000 dereceye kadar. Benim hesaplama ile, saniyede yaklaşık 1833 derece elde edersiniz, bu da yakındır (ve test sonucu için makul), ancak belki de hesaplamanızı buna göre ayarlamak size biraz daha doğruluk sağlar?
Jibb Smart

(Şu anda kendimi gyro şeyler yapıyorum ve standart birim dönüşümlerini kendimi test ederek anlamaya çalışacaktım ve bir arkadaşım bu bağlantıyı benim için buldu)
Jibb Smart

1

Buna kendim bir çözüm yarattım. Buna JoyShockLibrary denir ve DualShock 4, Switch Pro Controller ve Joy- Cons'tan okur. Açık kaynak, MIT lisansı ve iyi çalışıyor, ancak DS4 için Bluetooth desteği sadece son zamanlarda eklendi ve hala gelişiyor.

Bu içinde kullanılan JoyShockMapper bir giriş-haritalama aracı, ve henüz herkese açık JoyShockOverlay, ama eylem görebilirsiniz burada (Gfycat) ve burada (YouTube).

JoyShockLibrary, XInput'u güzel bir şekilde tamamlar - IMU raporlarının yanı sıra XInput'a çok benzer - böylece onu destekleyen tüm jiroskop ve ivmeölçer girişinin faydasıyla mevcut tüm gen konsolu denetleyicilerini kolayca kapsayabilirsiniz.

Unity ile kullanımı oldukça kolaydır, ancak diğerleri için daha kolay hale getirmek için bir .cs dosyası eklemeliyim.


0

Bunların hepsi DirectInput'u XInput'a saran araçlar gibi görünüyor. Unity'nin DirectInput için desteği vardır ve bu nedenle üçüncü taraf araçları olmadan çalışmasını sağlamanız gerekir. Anahtar, IMU'nun DirectInput'taki herhangi bir şeyle eşlenmiş olması ve zaten kullanılabilir durumda olup olmamasıdır. Değilse, ham verilerle başa çıkmak için kendi DirectInput işleyicinizi yazmanız gerekebilir.

Tüm bu denetleyici sıkıntıları için xbox'a teşekkür edebilirsiniz.


Ne yazık ki IMU 20 "joystick ekseni" Unity okuyor ne de Input.gyro vb eşlenmiş gibi görünmüyor Ham veri kazmak sona erdi; çözümün ayrıntılarını içeren bir cevap ekledi.
DMGregory
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.