Доступ к датчику движения DualShock 4 в Windows (в идеале Unity)

10

Я пытаюсь использовать IMU DualShock 4 в качестве контроллера движения в Unity, под Windows 7.

Пока что я пробовал:

  • DS4Windows (1.5.11): считывает данные датчика движения, но не отображает их в Unity в качестве осей, пока я не сопоставлю их с левой и правой палками. Этого недостаточно, так как я теряю использование стиков, я могу разместить только 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 + right, y + up и z +, указывающими на игрока.

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


Обновление: беспроводной (Bluetooth)

Я обнаружил две проблемы, расширяющие это, чтобы работать без проводов (и два решения):

  1. DualShock 4s не любит оставаться в паре с Windows (до Windows 8). Эта глупая процедура, кажется, работает вокруг этого в Windows 7.

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

ДМГригорий
источник
Можно ли уточнить этот ответ на этот пост ?
Я сейчас путешествую, но возьму это на себя, когда у меня будет некоторое время простоя с Wi-Fi. Спасибо @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
(Я сам сейчас занимаюсь гироскопическими вещами, и собирался попробовать выяснить стандартные преобразования единиц измерения,
проверив
1

Я создал решение для этого сам. Он называется JoyShockLibrary и считывает данные с DualShock 4, Switch Pro Controller и Joy-Cons. Это открытый исходный код, лицензия MIT, и работает хорошо, хотя поддержка Bluetooth для DS4 была добавлена ​​только недавно и все еще улучшается.

Он используется в JoyShockMapper , который является инструментом отображения ввода, и JoyShockOverlay, который еще не опубликован, но вы можете увидеть его в действии здесь (Gfycat) и здесь (YouTube).

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

Это довольно легко использовать с Unity, хотя я должен создать файл .cs, чтобы облегчить его для других.

Jibb Smart
источник
0

Похоже, это все инструменты, которые связывают DirectInput с XInput. В Unity есть поддержка DirectInput, поэтому вы должны посмотреть, как она работает без сторонних инструментов. Ключ, если IMU сопоставлен с чем-либо в DirectInput и если он уже находится в пригодном для использования состоянии. Если нет, вам, возможно, придется написать собственный обработчик DirectInput для обработки необработанных данных.

Вы можете поблагодарить Xbox за все эти проблемы контроллера.

user54892
источник
К сожалению, кажется, что IMU не сопоставлен ни с одной из 20 «осей джойстика», которые читает Unity, ни с Input.gyro и т. Д. Я закончил копаться в необработанных данных; добавил ответ с подробностями решения.
DMGregory