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.