Truy cập cảm biến chuyển động DualShock 4 trong Windows (lý tưởng nhất là Unity)


10

Tôi đang cố gắng sử dụng IMU của DualShock 4 làm bộ điều khiển chuyển động trong Unity, trong Windows 7.

Cho đến nay tôi đã thử:

  • DS4Windows (1.5.11): đọc dữ liệu cảm biến chuyển động, nhưng không đưa chúng ra Unity dưới dạng trục trừ khi tôi ánh xạ chúng sang gậy trái & phải. Điều này là không đủ vì tôi mất sử dụng gậy, tôi chỉ có thể phù hợp với 4 trong số 6 kênh dữ liệu và các giá trị đi qua được cắt vào một phạm vi hẹp.
  • Motioninjoy (0.7.1001): không xuất hiện để phát hiện DS4 dưới dạng bộ điều khiển (tài liệu mới nhất chỉ đề cập đến DS3 và trước đó)
  • Găng tay (0,43): sau khi làm theo các hướng dẫn sử dụng DualShock 3 với LibUSB-Win32 (một cú sút xa), các thuộc tính SixAxis đều trống.

Trước đây tôi đã từng sử dụng các chương trình bên ngoài như Găng tay để thu thập dữ liệu cảm biến chuyển động từ xa của Wii và chuyển nó đến Unity qua tin nhắn OSC , vì vậy tôi sẽ mở một cách tiếp cận như thế này nếu tôi không thể đọc Unity để đọc cảm biến của bộ điều khiển trực tiếp thông qua hệ thống đầu vào của nó .

Bất cứ ai cũng có may mắn với điều này?

Câu trả lời:


8

Tôi đã tìm thấy một cách tiếp cận khả thi. Tôi đã lấy nguồn DS4Tool và sao chép các bit tôi cần vào dự án Unity của mình để tôi có thể đọc các báo cáo từ thiết bị trực tiếp.

(Đó là lớp NativeMethods để giao tiếp với Kernel32.dll, bảng liệt kê thiết bị từ HidDevices và đọc báo cáo từ lớp HidDevice . Tôi đã cắt bỏ phần còn lại để giữ mọi thứ đơn giản nhất có thể - Tôi vừa có một cuộc thăm dò chủ đề cho mới dữ liệu nhanh nhất có thể.)

Hướng dẫn này cho tôi biết nơi tìm dữ liệu cảm biến chuyển động trong báo cáo 64 byte. Một thử nghiệm nhỏ theo kinh nghiệm và có vẻ như điều này sẽ đưa dữ liệu vào gs và radian / giây:

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;

Đó là hệ thống tọa độ thuận tay phải với x + phải, y + lên và z + chỉ về phía người chơi.

Tìm nạp dữ liệu theo cách này không can thiệp vào Trình quản lý đầu vào của Unity, công cụ này vẫn sẽ nhận các nút và gậy như mong đợi mà không cần tải xuống trình điều khiển không chuẩn hoặc chạy phần mềm bổ sung trong nền.


Cập nhật: Không dây (Bluetooth)

Tôi tìm thấy hai vấn đề mở rộng điều này để làm việc không dây (và hai giải pháp):

  1. DualShock 4s không muốn ghép nối với Windows (trước Windows 8). Quy trình ngớ ngẩn này dường như hoạt động xung quanh đó trên Windows 7.

  2. Không có dữ liệu cảm biến chuyển động khi được kết nối qua Bluetooth . Tôi phát hiện ra rằng bạn cần phải viết Báo cáo đầu ra cho thiết bị (xem HidDevice cho phương thức và DS4Device cho các số ma thuật) để dỗ nó gửi dữ liệu chuyển động. Khi điều này được thực hiện, các báo cáo đầu vào bạn nhận lại sẽ được thay đổi 2 byte.


Có thể cho bạn làm rõ câu trả lời này cho mỗi bài viết này ?

Tôi đang đi du lịch ngay bây giờ, nhưng tôi sẽ thực hiện điều đó khi tôi gặp một số thời gian chết với wifi. Cảm ơn @JoshPetrie!
DMGregory

Đi sâu vào vấn đề này, tôi không còn có mã nguồn cho dự án cảm biến chuyển động mà tôi đang thực hiện và quay lại DS4Tool nhắc nhở tôi tại sao tôi chỉ trích xuất các bit tôi cần! Điều này nhận được siêu dài dòng và có thể vượt quá độ dài hợp lý cho câu trả lời StackExchange. Tôi sẽ cố gắng đơn giản hóa hết mức có thể nhưng sẽ mất một thời gian.
DMGregory

1
@DMGregory - Tôi nghĩ rằng bảng dữ liệu này cho IMU, DualShock 4 sử dụng: mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf - và nó nói Short.MaxValue tương ứng đến 2000 độ mỗi giây. Theo tính toán của tôi, bạn nhận được khoảng 1833 độ mỗi giây, gần đúng (và hợp lý cho kết quả kiểm tra), nhưng có lẽ điều chỉnh tính toán của bạn cho phù hợp sẽ giúp bạn chính xác hơn một chút?
Jibb Smart

(Tôi đang tự làm công cụ con quay hồi chuyển ngay bây giờ và sẽ thử tìm hiểu các chuyển đổi đơn vị tiêu chuẩn bằng cách tự kiểm tra, và sau đó một người bạn đã tìm thấy liên kết đó cho tôi)
Jibb Smart

1

Tôi đã tự tạo ra một giải pháp cho vấn đề này. Nó được gọi là JoyShockL Library và đọc từ DualShock 4, Switch Pro Controller và Joy-Cons. Đó là mã nguồn mở, giấy phép MIT và hoạt động tốt, mặc dù hỗ trợ Bluetooth cho DS4 chỉ mới được thêm vào gần đây và vẫn đang được cải thiện.

Nó được sử dụng trong JoyShockMapper , một công cụ lập bản đồ đầu vào và JoyShockOverlay, chưa được công khai, nhưng bạn có thể thấy nó hoạt động ở đây (Gfycat) và ở đây (YouTube).

JoyShockL Library bổ sung cho XInput một cách độc đáo - bên cạnh các báo cáo IMU của nó, nó trông rất giống với XInput - vì vậy bạn có thể dễ dàng bao quát tất cả các bộ điều khiển bảng điều khiển gen hiện tại, với lợi ích của con quay hồi chuyển và gia tốc kế từ những người hỗ trợ nó.

Nó khá dễ sử dụng với Unity, mặc dù tôi nên tạo một tệp .cs để giúp người khác dễ dàng hơn.


0

Những thứ đó dường như là tất cả các công cụ bao bọc DirectInput thành XInput. Unity có hỗ trợ cho DirectInput và vì vậy bạn nên xem xét để nó hoạt động mà không cần các công cụ của bên thứ 3. Điều quan trọng là nếu IMU được ánh xạ tới bất cứ thứ gì trong DirectInput và nếu nó đã ở trạng thái có thể sử dụng được. Nếu không, bạn có thể phải viết trình xử lý DirectInput của riêng bạn để xử lý dữ liệu thô.

Bạn có thể cảm ơn xbox cho tất cả những tai ương của bộ điều khiển này.


Thật không may, IMU dường như không được ánh xạ tới bất kỳ trong số 20 "trục điều khiển" mà Unity đọc, cũng như Input.gyro, v.v. Tôi cuối cùng đã đào sâu vào dữ liệu thô; thêm một câu trả lời với các chi tiết của giải pháp.
DMGregory
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.