Windows에서 DualShock 4 모션 센서에 액세스 (이상적으로 Unity)


10

Windows 7에서 DualShock 4의 IMU 를 Unity의 모션 컨트롤러로 사용하려고합니다 .

지금까지 나는 시도했다 :

  • DS4Windows (1.5.11) : 모션 센서 데이터를 읽지 만 왼쪽 및 오른쪽 스틱에 매핑하지 않으면이를 축으로 Unity에 노출하지 않습니다. 스틱을 사용하지 않기 때문에 충분하지 않으며 6 채널의 데이터 중 4 개만 맞출 수 있으며 들어오는 값은 좁은 범위로 잘립니다.
  • Motioninjoy (0.7.1001) : DS4를 컨트롤러로 감지하지 않는 것 같습니다 (최신 문서는 DS3 이전 버전 만 참조)
  • GlovePIE (0.43) : LibUSB-Win32 (긴 샷)와 함께 DualShock 3을 사용 하기 위한 지침 을 따른 후 SixAxis 속성이 모두 비어 있습니다.

과거에는 GlovePIE와 같은 외부 프로그램을 사용하여 Wii 원격 모션 센서 데이터를 캡처하고 OSC 메시지 를 통해 Unity에 전달했습니다 . 따라서 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 +가 플레이어를 가리키는 오른손 좌표계입니다.

이 방법으로 데이터를 가져 오는 것은 Unity의 InputManager를 방해하지 않으며, 표준이 아닌 드라이버를 다운로드하거나 백그라운드에서 추가 소프트웨어를 실행할 필요없이 버튼과 스틱을 계속 예상합니다.


업데이트 : 무선 (블루투스)

무선으로 작동하도록 두 가지 문제와 두 가지 솔루션을 발견했습니다.

  1. DualShock 4는 Windows (Windows 8 이전)와 페어링 상태를 유지하는 것을 좋아하지 않습니다 . 이 바보 같은 절차 는 Windows 7에서 해결되는 것 같습니다.

  2. Bluetooth를 통해 연결된 모션 센서 데이터가 없습니다 . 모션 데이터를 전송하도록 동축하기 위해서는 출력 보고서를 장치에 기록해야합니다 (메소드 번호는 HidDevice, 매직 번호는 DS4Device 참조). 이 작업이 완료되면 다시 입력 한 보고서가 2 바이트 씩 이동합니다.


이 게시물 에 따라이 답변을 명확히 할 수 있습니까?

지금 당장 여행 중이지만 Wi-Fi로 다운 타임이 발생했을 때 사용하겠습니다. 감사합니다 @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에서 읽습니다. DS4에 대한 Bluetooth 지원은 최근에 추가되어 여전히 개선되고 있지만 오픈 소스, MIT 라이센스이며 잘 작동합니다.

그것은에서 사용되는 JoyShockMapper 입력 맵핑 도구이며, 아직 공개되지 JoyShockOverlay,하지만 당신은 행동에 그것을 볼 수 있습니다 여기 (Gfycat)와 여기 (유튜브).

JoyShockLibrary는 IMU 보고서 외에도 XInput과 매우 유사하게 XInput을 완벽하게 보완하므로 현재 지원하는 모든 자이로 및 가속도계 입력의 이점으로 모든 최신 콘솔 컨트롤러를 쉽게 커버 할 수 있습니다.

Unity에서는 사용하기가 쉽지만 다른 사람들이 쉽게 사용할 수 있도록 .cs 파일을 넣어야합니다.


0

그것들은 DirectInput을 XInput으로 감싸는 도구 인 것처럼 보입니다. Unity는 DirectInput을 지원하므로 타사 도구없이 작동하도록해야합니다. 핵심은 IMU가 DirectInput의 어떤 것에 매핑되고 이미 사용 가능한 상태에있는 경우입니다. 그렇지 않은 경우 원시 데이터를 처리하기 위해 직접 DirectInput 핸들러를 작성해야 할 수도 있습니다.

이 모든 컨트롤러 문제에 대해 xbox에 감사 할 수 있습니다.


불행히도 IMU는 Unity가 읽은 20 개의 "조이스틱 축"이나 Input.gyro 등에 매핑되지 않은 것으로 보입니다. 솔루션의 세부 사항과 함께 답변을 추가했습니다.
DMGregory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.