การเข้าถึงเซ็นเซอร์ตรวจจับความเคลื่อนไหว 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 remote motion sensor และส่งไปยัง 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 ซึ่งจะยังคงรับปุ่ม & sticks ตามที่คาดไว้โดยไม่จำเป็นต้องดาวน์โหลดไดรเวอร์ที่ไม่ได้มาตรฐานหรือเรียกใช้ซอฟต์แวร์เพิ่มเติมในพื้นหลัง


อัปเดต: ไร้สาย (Bluetooth)

ฉันพบปัญหาสองข้อที่ทำให้สิ่งนี้ทำงานได้แบบไร้สาย (และสองวิธี):

  1. DualShock 4s ไม่ต้องการจับคู่กับ Windows (ก่อนหน้า Windows 8) ขั้นตอนโง่นี้ดูเหมือนว่าจะแก้ไขใน Windows 7

  2. ไม่มีการเคลื่อนไหวข้อมูลเซ็นเซอร์เมื่อเชื่อมต่อผ่านบลูทู ธ ฉันค้นพบว่าคุณต้องเขียนรายงานผลลัพธ์ไปยังอุปกรณ์ (ดู HidDevice สำหรับวิธีการและ DS4Device สำหรับหมายเลขเวทย์มนตร์) เพื่อเกลี้ยกล่อมให้ส่งข้อมูลการเคลื่อนไหว เมื่อดำเนินการเสร็จแล้วรายงานอินพุตที่คุณได้รับจะถูกเลื่อนไปทีละ 2 ไบต์


เป็นไปได้หรือไม่ที่คุณจะชี้แจงคำตอบนี้ต่อโพสต์นี้ ?

ฉันกำลังเดินทางอยู่ตอนนี้ แต่ฉันจะทำต่อไปเมื่อฉันมีเวลาว่างด้วย wifi ขอบคุณ @JoshPetrie!
DMGregory

เมื่อขุดลงไปฉันก็ไม่มีซอร์สโค้ดสำหรับโครงการตรวจจับการเคลื่อนไหวที่ฉันกำลังทำงานอยู่และกลับไปที่ DS4Tool เตือนฉันว่าทำไมฉันถึงฉีกเฉพาะส่วนที่ฉันต้องการ! สิ่งนี้ได้รับ verbose สุด ๆ และอาจเกินความยาวที่เหมาะสมสำหรับคำตอบ StackExchange ฉันจะพยายามลดความซับซ้อนให้มากที่สุดเท่าที่จะทำได้ แต่จะใช้เวลาสักครู่
DMGregory

1
@DMGregory - แผ่นข้อมูลนี้ฉันคิดว่าสำหรับ IMU การใช้งาน DualShock 4: mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf - และมันบอกว่า Short.MaxValue สอดคล้อง ถึง 2000 องศาต่อวินาที โดยการคำนวณของฉันคุณจะได้รับประมาณ 1,833 องศาต่อวินาทีซึ่งใกล้ (และเหมาะสมสำหรับผลการทดสอบ) แต่บางทีการปรับการคำนวณของคุณตามนั้นจะให้ความแม่นยำมากขึ้นหรือไม่
Jibb Smart

(ตอนนี้ฉันกำลังทำ gyro แล้วและกำลังลองแปลงหน่วยมาตรฐานโดยทดสอบตัวเองแล้วเพื่อนก็พบลิงค์นั้นสำหรับฉัน)
Jibb Smart

1

ฉันได้สร้างวิธีแก้ปัญหานี้ด้วยตัวเองแล้ว มันเรียกว่าJoyShockLibraryและอ่านจาก DualShock 4, Switch Pro Controller และ Joy-Cons มันเป็นโอเพ่นซอร์ส, ใบอนุญาต MIT และใช้งานได้ดีแม้ว่าการรองรับบลูทู ธ สำหรับ DS4 นั้นเพิ่งจะถูกเพิ่มเมื่อไม่นานมานี้และยังคงปรับปรุงอยู่

มันถูกใช้ในJoyShockMapperซึ่งเป็นเครื่องมือการทำแผนที่อินพุตและ JoyShockOverlay ซึ่งยังไม่เผยแพร่สู่สาธารณะ แต่คุณสามารถเห็นมันในการกระทำที่นี่ (Gfycat) และที่นี่ (YouTube)

JoyShockLibrary เติมเต็ม XInput ได้อย่างดี - นอกเหนือจากรายงาน IMU แล้วมันมีลักษณะคล้ายกับ XInput มากดังนั้นคุณสามารถครอบคลุมตัวควบคุมคอนโซลปัจจุบันทั้งหมดได้อย่างง่ายดายด้วยประโยชน์ของอินพุตไจโรและ accelerometer จากผู้ที่สนับสนุน

มันค่อนข้างง่ายที่จะใช้กับ Unity แต่ฉันควรใส่ไฟล์. cs เพื่อให้ผู้อื่นง่ายขึ้น


0

สิ่งเหล่านั้นดูเหมือนจะเป็นเครื่องมือที่ห่อ DirectInput ไปยัง XInput Unity มีการสนับสนุน DirectInput ดังนั้นคุณควรมองหาวิธีการใช้งานโดยไม่ต้องใช้เครื่องมือของบุคคลที่สาม กุญแจสำคัญคือถ้า IMU ถูกแมปกับสิ่งใดใน DirectInput และถ้ามันอยู่ในสถานะที่ใช้งานได้ ถ้าไม่คุณอาจต้องเขียน DirectInput handler เพื่อจัดการกับข้อมูลดิบ

คุณสามารถขอบคุณ xbox สำหรับการควบคุมเหล่านี้ทั้งหมด


น่าเสียดายที่ IMU นั้นไม่ได้ถูกแมปกับแกนจอยสติก 20 อันใด ๆ ที่ Unity อ่านไม่ได้หรือ Input.gyro เป็นต้นฉันลงเอยด้วยการขุดลงในข้อมูลดิบ เพิ่มคำตอบด้วยรายละเอียดของการแก้ปัญหา
DMGregory
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.