Доступ до датчика руху DualShock 4 у Windows (в ідеалі Unity)


10

Я намагаюся використовувати IMU DualShock 4 як контролер руху в Unity, під Windows 7.

Поки я намагався:

  • DS4Windows (1.5.11): зчитує дані датчиків руху, але не піддає їх об'єднанню як осі, якщо я не відображаю їх на лівій та правій палиці. Цього недостатньо, оскільки я втрачаю використання паличок, я можу вмістити лише 4 з 6 каналів даних, а значення, що надходять через, вирізаються у вузький діапазон.
  • Motioninjoy (0.7.1001): не виявляє DS4 як контролер (останні документи стосуються лише DS3 та попереднього)
  • GlovePIE (0,43): після дотримання інструкцій по використанню DualShock 3 з LibUSB-Win32 (дальний постріл) властивості SixAxis залишаються порожніми.

Раніше я використовував зовнішні програми на зразок GlovePIE для збору даних віддаленого датчика руху Wii та передавання їх Unity за допомогою повідомлень OSC , тому я був би відкритий для такого підходу, якщо не можу змусити Unity прочитати датчики контролера безпосередньо через систему введення .

Хтось мав удачу з цим?

Відповіді:


8

Я знайшов дієвий підхід. Я схопив джерело DS4Tool і скопіював потрібні мені біти в проект Unity, щоб я міг читати звіти безпосередньо з пристрою.

(Це клас NativeMethods для інтерфейсу з Kernel32.dll, перерахуванням пристроїв від HidDevices і зчитуванням звіту з класу HidDevice . Я вирізав решту, щоб зробити речі максимально простими - я щойно отримав нитку для опитування нових дані якнайшвидше.)

Цей посібник розповів, де знайти дані датчика руху в 64-байтовому звіті. Трохи емпіричного тестування, і схоже, що це передає дані в gs та радіани / сек:

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;

Це права рука координатної системи з x + правою, y + вгору і z +, що вказує на плеєр.

Отримання даних таким чином не перешкоджає InputManager Unity, який все одно збиратиме кнопки та палички, як очікувалося, не потребуючи завантаження нестандартних драйверів або запуску додаткового програмного забезпечення у фоновому режимі.


Оновлення: бездротовий (Bluetooth)

Я виявив дві проблеми, що розширюють цю роботу бездротово (і два рішення):

  1. DualShock 4s не любить залишатися в парі з Windows (до Windows 8). Ця нерозумна процедура, схоже, обробляє цю проблему в Windows 7.

  2. Немає даних датчика руху при підключенні через Bluetooth . Я виявив, що вам потрібно написати звіт про вихід на пристрій (див. HidDevice для методу та DS4Device для магічних чисел), щоб налагодити його для надсилання даних про рух. Коли це буде зроблено, вхідні звіти, які ви отримаєте назад, зміщуватимуться на 2 байти.


Чи можна вам пояснити цю відповідь у цій публікації ?

Я зараз подорожую, але я займусь цим, коли у мене буде час простою з wifi. Дякую @JoshPetrie!
DMGregory

Займаючись цим, у мене більше немає вихідного коду проекту з зондування руху, над яким я працював, і повернення до DS4Tool нагадало мені, чому я вирвав лише потрібні біти! Це стає суперсловним і може перевищити розумну довжину для відповіді StackExchange. Я спробую максимально спростити, але це займе певний час.
DMGregory

1
@DMGregory - Цей аркуш даних, я думаю, для IMU DualShock 4 використовує: mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf - і він говорить Short.MaxValue відповідає до 2000 градусів за секунду. За моїм підрахунком, ви отримуєте близько 1833 градусів за секунду, що є близьким (і розумним для результату тестування), але, можливо, коригування вашого обчислення відповідно дасть вам трохи більше точності?
Jibb Smart

(Я сам зараз займаюся гіроскопами, і збирався спробувати визначити конверсії стандартних одиниць, перевіривши себе, і тоді друг знайшов для мене це посилання)
Jibb Smart

1

Я сам створив рішення для цього. Він називається JoyShockLibrary і читає з DualShock 4, Switch Pro Controller і Joy-Cons. Це відкритий код, ліцензія MIT, і працює добре, хоча підтримка Bluetooth для DS4 була додана лише нещодавно і все ще вдосконалюється.

Він використовується в JoyShockMapper , який є вхідним картографічним інструментом, і JoyShockOverlay, який ще не є загальнодоступним, але ви можете побачити його в дії тут (Gfycat) і тут (YouTube).

JoyShockLibrary чудово доповнює XInput - окрім звітів про IMU, він дуже схожий на XInput - так що ви можете легко охопити всі поточні контролери генконсолей, з користю для вводу гіроскопів та акселерометрів з тих, хто його підтримує.

Користуватися Unity досить просто, хоча я мушу створити .cs файл, щоб полегшити його іншим.


0

Це, мабуть, усі інструменти, які переносять DirectInput у XInput. У Unity є підтримка DirectInput, тож вам слід поглянути на те, щоб він працював без сторонніх інструментів. Ключовим моментом є те, якщо IMU відображено на що-небудь у DirectInput, і якщо він вже знаходиться у використанні. Якщо ні, то, можливо, доведеться написати власний обробник DirectInput, щоб мати справу з необробленими даними.

Ви можете подякувати xbox за всі ці неприємності контролера.


На жаль, схоже, IMU не відображається ні на одній із 20 "осей джойстика", яку Unity читає, ні на Input.gyro тощо. Я в кінцевому підсумку перекопався в необроблених даних; додав відповідь із деталями рішення.
DMGregory
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.