在Windows中访问DualShock 4运动传感器(最好是Unity)


10

我试图在Windows 7下使用DualShock 4的IMU作为Unity中的运动控制器。

到目前为止,我已经尝试过:

  • DS4Windows1.5.11):读取运动传感器数据,但是除非将它们映射到左右摇杆,否则不会将它们作为轴暴露给Unity。这是不够的,因为我不再使用摇杆,只能容纳6个数据通道中的4个,并将通过的值限制在一个狭窄的范围内。
  • Motioninjoy(0.7.1001):似乎没有将DS4检测为控制器(最新文档仅指DS3及之前版本)
  • GlovePIE(0.43):在按照说明将DualShock 3与LibUSB-Win32一起使用(远景)之后,SixAxis属性全部为空白。

过去,我曾使用GlovePIE之类的外部程序来捕获Wii远程运动传感器数据,并通过OSC消息将其传递给Unity ,因此,如果我无法让Unity读取控制器的传感器,我将接受这种方法。直接通过其输入系统

有人有运气吗?

Answers:


8

我找到了一种可行的方法。我抓住了DS4Tool的源并将所需的位复制到Unity项目中,以便可以直接从设备读取报告。

(这是用于与Kernel32.dll进行交互的NativeMethods类,该类是HidDevices的设备枚举,并从HidDevice类读取报告。我剪掉了其余部分,以使事情尽可能简单-我刚好有一个线程轮询新线程尽可能快的数据。)

本指南告诉我在64字节报告中的哪里可以找到运动传感器数据。进行一些实证测试,结果看起来像这样将数据转换为gs和弧度/ sec:

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 +指向玩家。

以这种方式获取数据不会干扰Unity的InputManager,后者仍会按预期拾取按钮和操纵杆,而无需下载非标准驱动程序或在后台运行其他软件。


更新:无线(蓝牙)

我发现了将其扩展为无线工作的两个问题(和两个解决方案):

  1. DualShock 4s不希望与Windows(Windows 8之前)保持配对这个愚蠢的过程似乎可以在Windows 7上解决。

  2. 通过蓝牙连接时,没有运动传感器数据。我发现您需要向设备写入输出报告(有关方法请参见HidDevice,有关幻数请参见DS4Device)以哄骗其发送运动数据。完成此操作后,您取回的输入报告将移动2个字节。


您是否可以根据此帖子澄清此答案?

我现在正在旅行,但是在无线网络出现故障时,我会继续进行下去。谢谢@JoshPetrie!
DMGregory

深入了解这一点,我不再拥有我正在从事的运动传感项目的源代码,回到DS4Tool会让我想起为什么我只剔除了我需要的部分!这变得非常冗长,并且可能超出StackExchange答案的合理长度。我会尽量简化,但这需要一些时间。
DMGregory

1
@DMGregory-我认为此数据表适用于DualShock 4使用的IMU: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许可证,并且运行良好,尽管对DS4的蓝牙支持只是在最近才添加,并且仍在改进中。

它在使用JoyShockMapper,这是一个输入映射工具,JoyShockOverlay,这是不公开的,但你可以看到它在行动这里(Gfycat)和这里(YouTube)的。

JoyShockLibrary很好地补充了XInput-除了它的IMU报告外,它看起来与XInput非常相似-因此,您可以轻松地覆盖所有当前的发电控制台控制器,并从支持它的陀螺仪和加速度计输入中受益。

与Unity一起使用非常容易,尽管我应该放一个.cs文件以使其他人更容易使用。


0

这些似乎都是将DirectInput包装到XInput的工具。Unity支持DirectInput,因此您应该在没有第3方工具的情况下使它工作。关键是IMU是否已映射到DirectInput中的任何内容,并且是否已处于可用状态。如果没有,您可能必须编写自己的DirectInput处理程序来处理原始数据。

您可以感谢xbox对所有这些控制器的困扰。


不幸的是,IMU似乎没有映射到Unity读取的20个“操纵杆轴”中的任何一个,也没有映射到Input.gyro等。添加了有关解决方案详细信息的答案。
DMGregory
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.