仮想と物理とエトセトラ

xRや物理とかごった煮の備忘録的技術ブログ

HoloLens2でJoyConのIMUを使ってみたかった(失敗)

今回はNintendo SwitchのJoyConをHoloLensで使用できるか試します。
使用できれば、加速度、ジャイロセンサを用いて何かしらできそうです。
※今回の記事はHoloLens上で正しく動作できていません。後々解決策がわかったら記事にします。

JoyConをUnityで取り扱う方法については下記を参考に実施します。

baba-s.hatenablog.com

前提

今回は下記環境で検証しています。
MRTKのインポートなどの設定は今回は省略し、JoyconLibの導入から始めます。
Unity 2019.4.17
MRTK 2.7.2
JoyconLib 0.6

準備

まずはJoyconLibのUnityPackageを下記からダウンロードします。

github.com

f:id:napo909:20211212163646p:plain

ダウンロードしたUnityPackageをUnity上にドラッグ&ドロップすると、Unity Packageのインポートができます。
右下の「Import」ボタンを押下するとインポートできます。
※ Sceneフォルダに警告が出ていますが、特に問題ないので無視でよいです。
f:id:napo909:20211212163917p:plain

正常にインポートができると、JoyconLib由来のファイルがAssetsフォルダ上に配置されます。
f:id:napo909:20211212164151p:plain

そのままだとエラーが発生するため、参考元の記事の通り、一部ソースコードを修正します。

  • Joycon.cs L370
    変更前:
DebugPrint(string.Format("Dequeue. Queue length: {0:d}. Packet ID: {1:X2}. Timestamp: {2:X2}. Lag to dequeue: {3:s}. Lag between packets (expect 15ms): {4:s}",

変更後:

DebugPrint(string.Format("Dequeue. Queue length: {0:d}. Packet ID: {1:X2}. Timestamp: {2:X2}. Lag to dequeue: {3:t}. Lag between packets (expect 15ms): {4:g}",

f:id:napo909:20211212165259p:plain

Scenes/Scene1を選択すると、JoyconLabのサンプルが確認できます。
これを左上メニューのFile/Save As...から複製して保存します。
f:id:napo909:20211212165814p:plain

複製したSceneをHoloLens用に構成します。
左上メニューのMixed Reality/Add to Scene and Configure...からMRTK用に構成します。
f:id:napo909:20211212165937p:plain

そのままだとJoyConの動きを示すCubeが頭の位置に来てしまうため、微調整します。
f:id:napo909:20211212170152p:plain

Scene上にTextを配置して、ジャイロと加速度の状態を確認できるようにします。
TextMeshProを適当な位置に配置して、JoyconManagerにShowJoyConState.cs (下記ソース参照)をアタッチし、TextMeshProを参照させます。

  • ShowJoyConState.cs
クリックで展開
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class ShowJoyConState : MonoBehaviour
{
    private List<Joycon> joycons;

    [SerializeField]
    private TextMeshPro text;

    // Start is called before the first frame update
    void Start()
    {
        this.joycons = JoyconManager.Instance.j;
    }

    // Update is called once per frame
    void Update()
    {
        ShowState();
    }

    private void ShowState()
    {
        string info = "";

        foreach(var joycon in this.joycons)
        {
            info += "#########\n";
            info += (joycon.isLeft) ? ("[Left]\n") : ("[Right]\n");
            info += $"Accel:\n";
            info += $"x:{joycon.GetAccel().x}\n y:{joycon.GetAccel().y}\n z:{joycon.GetAccel().z}\n";
            info += $"Gyro:\n";
            info += $"x:{joycon.GetGyro().x}\n y:{joycon.GetGyro().y}\n z:{joycon.GetGyro().z}\n";
            info += "#########\n";
        }

        this.text.SetText(info);
        
    }
}

f:id:napo909:20211212171722p:plain
f:id:napo909:20211212171859p:plain

ProjectSettins/PlayerのCapabilitiesからBlueToothにチェックを入れておきます。
f:id:napo909:20211212172520p:plain

BuildSettingsからビルド対象シーンに今のシーンを追加し、Buildボタンを押します。
f:id:napo909:20211212172219p:plain

次にHoloLens側でBluetoothを用いてJoyconを接続します。
設定/Bluetoothとその他のデバイスからBluetoothまたはその他のデバイスを追加するを選択します。
f:id:napo909:20211212175620p:plain

追加するデバイス種として、Bluetoothを選択します。
f:id:napo909:20211212175737p:plain

Joyconの丸いボタンを長押ししペアリングモードにすると、JoyConが一覧に表示されます。選択すると、HoloLensとJoyConをBluetooth接続できます。
f:id:napo909:20211212180044p:plain

動作確認

HoloLens側でアプリ起動しましたが、JoyConの加速度、ジャイロのデータを取得することはできませんでした。
Unity上では動作確認できているため、HoloLens特有の問題のようです。

f:id:napo909:20211212180936g:plain

アプリのログを見たところ、使用しているdllが読み込めていないようです。

  • UnityPlayer.log
DllNotFoundException: Unable to load DLL 'hidapi': The specified module could not be found.
  at JoyconManager.Awake () [0x00000] in <00000000000000000000000000000000>:0 
 
(Filename: currently not available on il2cpp Line: -1)

該当のプラグインの格納場所を見ると、win32, win64, mac用のプラグインしかなく、arm, arm64用のプラグインが入っていないようです。
hidapiのarm用プラグインがあれば、動作しそうです。
f:id:napo909:20211212180449p:plain

うまくいってはいないですが、今回はここまで。
hidapiのarm版が見つかったら再度チャレンジしてみます。