Windows(理想的にはUnity)でDualShock 4モーションセンサーにアクセスする


10

Windows 7でUnityのモーションコントローラーとしてDualShock 4のIMUを使用しようとしています。

これまでのところ、私は試しました:

  • DS4Windows(1.5.11):モーションセンサーデータを読み取りますが、左右のスティックにマップしない限り、それらを軸としてUnityに公開しません。スティックを使用できなくなったため、これでは不十分です。6チャネルのデータのうち4チャネルしかフィットできず、通過する値は狭い範囲にクリップされます。
  • Motioninjoy(0.7.1001):DS4をコントローラーとして検出しないようです(最新のドキュメントはDS3以前のみを参照しています)
  • GlovePIE(0.43):DualShock 3をLibUSB-Win32(ロングショット)で使用するための手順に従っても、SixAxisプロパティがすべて空白になります。

これまで、GlovePIEなどの外部プログラムを使用してWiiリモートモーションセンサーデータをキャプチャし、OSCメッセージを介してUnityに渡していました。そのため、Unityにコントローラーのセンサーを読み取れない場合は、このようなアプローチを受け入れることができます。入力システムを介して直接。

誰もがこれで運が良かったですか?

回答:


8

実行可能なアプローチを見つけました。私はDS4Toolソース取得し、必要なビットをUnityプロジェクトにコピーして、デバイスからレポートを直接読み取れるようにしました。

(それがありますNativeMethodsの Kernel32.dllの、からデバイスの列挙とのインタフェースクラスHidDevices、およびからのレポートを読んでHidDeviceのクラスIは、できるだけ簡単に物事を保つために残りの部分を切り取る- 。私はちょうど新しいのスレッドポーリングを持っています可能な限り高速なデータ。)

このガイドでは、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には影響しません。UnityのInputManagerは、非標準のドライバーをダウンロードしたり、バックグラウンドで追加のソフトウェアを実行したりすることなく、期待どおりにボタンとスティックを取得します。


更新:ワイヤレス(Bluetooth)

これをワイヤレスで機能するように拡張する2つの問題(および2つの解決策)が見つかりました。

  1. DualShock 4は、(Windows 8より前の)Windows とのペアリングを維持したくありませんこの愚かな手順は、Windows 7でそれを回避するようです。

  2. Bluetooth経由で接続した場合、モーションセンサーデータはありません。モーションデータを送信するためにデバイスに出力レポートを書き込む必要があることを発見しました(メソッドについてはHidDevice、マジックナンバーについてはDS4Deviceを参照)。これが完了すると、返される入力レポートは2バイトずつシフトされます。


この投稿ごとにこの回答を明確にすることは可能ですか?

私は今旅行中ですが、wifiでダウンタイムが発生したときにそれを利用します。@JoshPetrieに感謝!
DMGregory

これを掘り下げて、私が取り組んでいたモーションセンシングプロジェクトのソースコードがなくなったので、DS4Toolに戻って、必要なビットだけを取り除いた理由を思い出させました!これは非常に冗長になり、StackExchangeの回答にとって妥当な長さを超える可能性があります。できる限り簡略化するようにしますが、少し時間がかかります。
DMGregory

1
@DMGregory-このデータシートは、私が思うに、DualShock 4が使用するIMUの場合:mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf-そして、Short.MaxValueは対応していると言っています毎秒2000度に。私の計算では、1秒あたり約1833度になっています。これは近い(そしてテストの結果としては妥当)ですが、それに応じて計算を調整すると、もう少し正確になるでしょう。
Jibb Smart 2018

(私は今自分でジャイロをやっていて、自分でテストして標準の単位変換を
見つけよ

1

これに対する解決策を自分で作成しました。これはJoyShockLibraryと呼ばれ、DualShock 4、Switch Pro Controller、およびJoy-Consから読み取ります。DS4のBluetoothサポートは最近追加されたばかりで、まだ改善中ですが、オープンソースでMITライセンスであり、適切に機能します。

それはで使用されますJoyShockMapper入力マッピングツールであり、まだ公開されていないJoyShockOverlay、が、あなたはアクションでそれを見ることができ、ここで(Gfycat)とここ(YouTubeの)。

JoyShockLibraryはXInputをうまく補完します-IMUレポートを除いて、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.