Zugriff auf den DualShock 4-Bewegungssensor unter Windows (idealerweise Unity)

10

Ich versuche, die IMU eines DualShock 4 unter Windows 7 als Motion Controller in Unity zu verwenden.

Bisher habe ich versucht:

  • DS4Windows (1.5.11): Liest Bewegungssensordaten, setzt sie jedoch nicht als Achsen Unity aus, es sei denn, ich ordne sie den linken und rechten Sticks zu. Dies ist nicht genug, da ich die Verwendung der Sticks verliere, nur 4 der 6 Datenkanäle anpassen kann und die durchkommenden Werte in einen engen Bereich begrenzt werden.
  • Motioninjoy (0.7.1001): Der DS4 scheint nicht als Controller erkannt zu werden (die neuesten Dokumente beziehen sich nur auf DS3 und frühere Versionen).
  • GlovePIE (0.43): Nachdem Sie die Anweisungen zur Verwendung von DualShock 3 mit LibUSB-Win32 (eine lange Einstellung) befolgt haben, sind alle SixAxis-Eigenschaften leer.

In der Vergangenheit habe ich externe Programme wie GlovePIE verwendet, um Wii-Remote-Bewegungssensordaten zu erfassen und über OSC-Nachrichten an Unity weiterzuleiten. Daher wäre ich für einen solchen Ansatz offen, wenn ich Unity nicht dazu bringen kann, die Sensoren des Controllers zu lesen direkt über sein Eingabesystem .

Hat jemand Glück damit gehabt?

DMGregory
quelle

Antworten:

8

Ich habe einen praktikablen Ansatz gefunden. Ich griff nach der DS4Tool-Quelle und kopierte die benötigten Bits in mein Unity-Projekt, damit ich die Berichte direkt vom Gerät lesen konnte.

(Das ist die NativeMethods- Klasse für die Schnittstelle mit Kernel32.dll, die Geräteaufzählung von HidDevices und das Lesen des Berichts aus der HidDevice- Klasse. Ich habe den Rest ausgeschnitten, um die Dinge so einfach wie möglich zu halten - ich habe gerade eine Thread-Abfrage für neue Daten so schnell wie möglich.)

In diesem Handbuch wurde mir mitgeteilt, wo sich die Bewegungssensordaten im 64-Byte-Bericht befinden. Ein wenig empirische Tests und es sieht so aus, als würden die Daten in gs und Radiant / Sek. Angegeben:

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;

Es ist ein rechtshändiges Koordinatensystem, bei dem x + rechts, y + oben und z + auf den Spieler zeigen.

Das Abrufen der Daten auf diese Weise beeinträchtigt nicht den InputManager von Unity, der die Schaltflächen und Sticks wie erwartet aufnimmt, ohne dass nicht standardmäßige Treiber heruntergeladen oder zusätzliche Software im Hintergrund ausgeführt werden müssen.


Update: Drahtlos (Bluetooth)

Ich habe zwei Probleme gefunden, die dies auf drahtloses Arbeiten erweitern (und zwei Lösungen):

  1. DualShock 4s bleiben nicht gerne mit Windows gekoppelt (vor Windows 8). Diese dumme Prozedur scheint das unter Windows 7 zu umgehen.

  2. Keine Bewegungssensordaten bei Verbindung über Bluetooth . Ich habe festgestellt, dass Sie einen Ausgabebericht an das Gerät schreiben müssen (siehe HidDevice für die Methode und DS4Device für die magischen Zahlen), um es zum Senden von Bewegungsdaten zu überreden. Sobald dies erledigt ist, werden die Eingabemeldungen, die Sie zurückerhalten, um 2 Bytes verschoben.

DMGregory
quelle
Ist es Ihnen möglich, diese Antwort in diesem Beitrag zu klären ?
Ich bin gerade auf Reisen, aber ich werde das übernehmen, wenn ich Ausfallzeiten mit WLAN habe. Danke @JoshPetrie!
DMGregory
Wenn ich mich damit beschäftige, habe ich nicht mehr den Quellcode für das Bewegungserkennungsprojekt, an dem ich gearbeitet habe, und die Rückkehr zu DS4Tool hat mich daran erinnert, warum ich nur die Teile herausgerissen habe, die ich brauche! Dies wird sehr ausführlich und kann für eine StackExchange-Antwort eine angemessene Länge überschreiten. Ich werde versuchen, so viel wie möglich zu vereinfachen, aber es wird einige Zeit dauern.
DMGregory
1
@DMGregory - Dieses Datenblatt ist meiner Meinung nach für die IMU, die DualShock 4 verwendet: mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf - und es heißt, Short.MaxValue entspricht bis 2000 Grad pro Sekunde. Nach meiner Berechnung erhalten Sie ungefähr 1833 Grad pro Sekunde, was nahe (und für das Testergebnis angemessen) liegt. Wenn Sie Ihre Berechnung jedoch entsprechend anpassen, erhalten Sie möglicherweise etwas mehr Genauigkeit?
Jibb Smart
(Ich mache gerade selbst Gyro-Sachen und wollte versuchen, die Standard-Einheitenumrechnungen herauszufinden, indem ich mich selbst testete, und dann fand ein Freund diesen Link für mich)
Jibb Smart
1

Ich habe selbst eine Lösung dafür gefunden. Es heißt JoyShockLibrary und liest von DualShock 4, Switch Pro Controller und Joy-Cons. Es ist Open Source, MIT-Lizenz und funktioniert gut, obwohl die Bluetooth-Unterstützung für den DS4 erst kürzlich hinzugefügt wurde und sich immer noch verbessert.

Es wird in JoyShockMapper , einem Eingabe-Mapping-Tool, und JoyShockOverlay verwendet, das noch nicht öffentlich ist, aber Sie können es hier (Gfycat) und hier (YouTube) in Aktion sehen .

JoyShockLibrary ergänzt XInput sehr gut - neben seinen IMU-Berichten sieht es XInput sehr ähnlich -, sodass Sie alle aktuellen Konsolencontroller der Generation problemlos abdecken können, mit dem Vorteil der Kreisel- und Beschleunigungsmessereingabe von denen, die es unterstützen.

Es ist ziemlich einfach mit Unity zu verwenden, obwohl ich eine CS-Datei erstellen sollte, um es für andere einfacher zu machen.

Jibb Smart
quelle
0

Dies scheinen alle Tools zu sein, die DirectInput in XInput umschließen. Unity unterstützt DirectInput. Daher sollten Sie versuchen, es ohne Tools von Drittanbietern zum Laufen zu bringen. Der Schlüssel ist, ob die IMU einem beliebigen Element in DirectInput zugeordnet ist und sich bereits in einem verwendbaren Zustand befindet. Wenn nicht, müssen Sie möglicherweise Ihren eigenen DirectInput-Handler schreiben, um mit den Rohdaten umgehen zu können.

Sie können der Xbox für all diese Probleme mit dem Controller danken.

user54892
quelle
Leider scheint die IMU weder einer der 20 "Joystick-Achsen", die Unity liest, noch Input.gyro usw. zugeordnet zu sein. Am Ende habe ich mich mit den Rohdaten befasst. fügte eine Antwort mit Details der Lösung hinzu.
DMGregory