HTC Viveコントローラーを無線で3本以上接続する方法

HTC Viveコントローラーを無線で3本以上接続する方法

こんにちは坪倉です。

皆さん、HTC ViveでのVRライフは楽しんでいますでしょうか?
HTC Vive付属のワイヤレスコントローラーは2本ですが、昨年末ごろから追加のコントローラーが購入できるようになっています。


【国内正規品】 HTC VIVE コントローラー

安価な3Dモーションキャプチャーとしてもかなり優秀なHTC ViveのLighthouseシステムですが、 こうなるとワイヤレスコントローラーを沢山繋いで、手足につけてフルボディVRIKに対応させたり、複数人でゲームをしたり、多人数参加型のメディアアートに応用したりしたくなりますよね。

Vive Tracker来週27日頃から販売開始されるようですが、それでもボタン一式を備えたViveコントローラーを複数台無線接続する需要は絶えないと思います。
今回はそんなViveコントローラーを3台以上無線で接続する方法をご紹介します。

多人数参加型にする

私も去年Lighthouseシステムを応用したアートを制作したのですが、この時はViveアクセサリーの発売前だったので2しかコントローラーを用意できませんでした。
今はコントローラーを追加購入できるのでこの作品を多人数参加型にバージョンアップさせたいです。

まずは、HTC Viveのコントローラー接続方法についておさらいしてみましょう。

Viveコントローラーペアリングの仕組み

HTC Viveには2個のコントローラーが付属していますが、無線の機能が付いていないはずのデスクトップPCともペアリングができます。
何故かというと、HTC Viveのヘッドマウントディスプレイ(HMD)本体に2個分のワイヤレスドングルの機能が中に入っていて、それとのペアリングを行っているのです。

接続イメージ(実際にドングルが入ってるわけじゃないです)

2個分のレシーバーの機能しか入っていないので、仕様上2個以上は接続できないということですね。
また、その理由でHMDを繋がずにコントローラーだけをモーションキャプチャのように使うことはできません。
Lighthouseの3Dトラッキングを使いたい時はHMDを使わなくてもPCに接続しておく必要があります。

ワイヤレスドングル増設

ではどのようにして2個以上のコントローラーを無線接続するかというと、追加のワイヤレスドングルを使用します。

海外のSteamVR開発者コミュニティの情報を読み漁っていたら、「Steam コントローラ ワイヤレスレシーバー」というUSBドングルを使って、中身のファームウェアを書き換えることで3個以上の接続か可能になるという情報がありました。
早速ワイヤレスレシーバーを2個ほど購入したので、ファームウェアの書き換えをしてみることにします。

※ファームウェア書き換えでデバイスが使えなくなる可能性がある為、自己責任でお願いします。

Steamコントローラーワイヤレスレシーバ
ファームウェア書き換え手順(ドングルのSteamVR対応化)

  1. Steamを終了させる。(バックグラウンドからも)
  2. コマンドプロンプトを開いて以下を入力。(SteamVRのディレクトリに移動する)

    cd C:\Program Files (x86)\Steam\steamapps\common\SteamVR

  3. ワイヤレスドングルをPCに接続。
  4. SteamVRディレクトリで以下のコマンドを実行(ファームウェア書き換え)

    tools\lighthouse\bin\win32\lighthouse_watchman_update.exe -D tools\lighthouse\firmware\vr_controller\watchman_dongle.bin

  5. コマンドが実行されてログが表示される。
    /////////////////////////////////////////////////////////////////
    C:\Program Files (x86)\Steam\steamapps\common\SteamVR>tools\lighthouse\bin\win32\lighthouse_watchman_update.exe -D tools\lighthouse\firmware\vr_controller\watchman_dongle.bin

    Attempting to update Watchman Dongles to version 1450758230…

    Converting steam controller dongle to watchman dongle. Switching to bootloader

    Looking for 1 bootloaders

    HID opened: VID 28de PID 1042 serial (null) seq 1 | if -1

    Attempting to convert Steam Controller dongle into Watchman Dongle…

    Valve Nordic bootloader version 19.0

    P2vvX……..vvvvvvvvP3X……..vvvvvvvvP4X……..vvvvvvvvP5X……..vvvvvvvvP6X……..vvvvvvvvP7X……..vvvvvvvvP8X……..vvvvvvvvP9X……..vvvvvvvvP10X……..vvvvvvvvP11X……..vvvvvvvvP12X……..vvvvvvvvP13X……..vvvvvvvvP14X……..vvvvvvvvP15X……..vvvvvvvvP16X……..vvvvvvvvP17X……..vvvvvvvvP18X……..vvvvvvvvP19X……..vvvvvvvvP20X……..vvvvvvvvP21X……..vvvvvvvvP22X……..vvvvvvvvP23X……..vvvvvvvvP24X……..vvvvvvvvP25X……..vvvvvvvvP26X……..vvvvvvvvP27X……..vvvvvvvvP28X……..vvvvvvvvP29X……..vvvvvvvvP30X……..vvvvvvvvP31X……..vvvvvvvvP32X……..vvvvvvvvP33X……..vvvvvvvvP34X……..vvvvvvvvP35X……..vvvvvvvvP1vvvvvvvvP0X……..vvvvvvvv

    Successfully converted firmware.

    Found all expected bootloaders
    //////////////////////////////////////////////////////////////////
    「Successfully converted firmware.」となればたぶんOK。
    ※ファームウェア書き換え後、ドングルを刺した状態でSteamVRを起動すると、HMDのファームウェアアップデートの通知が出ますがアップデートするとドングルが使えない状態に戻ってしまうのでアップデートしないようにして下さい。
    ※間違えてHMDファームウェアアップデートをしたら何故かキーボードとマウスが暴走して大変な目にあいました…。
  • キャプチャ

これで「Steam コントローラ ワイヤレスレシーバ」が、「SteamVR ワイヤレスレシーバ」になったわけです。

接続してみる

早速Viveコントローラーの接続を試してみました。

  • SteamVRを起動して、デバイス>コントローラーのペアリング

すると上手く3台目以降が認識されているようです。
↓ 折角なので、家にあるコントローラー全部接続してみましょう。

HTC Vive本体(HMD)は複数台接続できる。

実はHTC Vive本体が2台以上ある場合は、HTC Vive本体を2個分のワイヤレスドングル代わりに使うことができます。

今家にある機材だとこんな感じで合計6本同時に無線接続可能です。
1本コントローラーが余るのでこちらは有線USB接続して…。
こうなりました。

SteamVRの接続デバイス欄が賑やかですね!

Unityプロジェクト内でチェックしてみる

ちゃんと全て無線接続で動作していますね!動作も軽快です。

※追記
ちなみに、HTC ViveのHMDの上部カバーを外した所には1口だけUSBポートが開いている場所が隠されています。

なんとここにワイヤレスドングルが、この為に設計されたのじゃないかと思うくらいバシコーン!!とピッタリ入ってくれます。
ちゃんとカバーも閉じられるので、ここにドングルを装備しておくことでHTC Viveはデフォルト3個の無線コントローラーが使えるスーパーHTC Viveに進化するのです。

Unity上の設定とか

コントローラーの追加方法

Unity上では、SteamVRプラグインをインポートして、CameraRigの中のコントローラーを複製。
紐づいているスクリプトのDeviceIndexを1~10まで連番で設定しました。
たぶんSteamVR_ControllerManagerというスクリプトで管理するやり方もあると思います。

ここでひとつ注意が必要だったのですが、SteamVRの仕様なのかDevice6や7といった中途半端なIDに何故かベースステーションがアサインされてしまいました。
SteamVRではHMDやベースステーションもコントローラーと等しくDeviceの一つとしてIDが割り当てられるようです。

デバイスの種類を判別する

そのためデバイス毎に処理を分ける必要があります。
調べてみたところ、SteamVR_RenderModel.renderModelNameにデバイスの名前(vr_controller_vive_xxxx等)が入るようだったので以下のようなスクリプトでコントローラーかどうかを判断する処理をしました。

        renderModelName = GetComponentInChildren<SteamVR_RenderModel>().renderModelName;
        if (renderModelName.IndexOf(“vr_controller_vive”) == -1)
        {
            // Viveコントローラーじゃない場合は子を非アクティブに。
            for (int i = 0; i < transform.childCount; i++)
            {
                transform.GetChild(i).gameObject.SetActive(false);
            }
        }

今回はコントローラー以外の時だけ処理をしましたが、デバイスの名前が分かればデバイス毎に処理を分岐させられるので使ってみてください。
手持ちのViveコントローラーと物につけたVive Trackerで処理を分けるとかも可能だと思います。

仕様上の最大接続数

SteamVR Pluginの仕様上の最大接続数は16台のようでした。
ですが、上記の通りHMD・ベースステーションもデバイスの1つとして認識されるので実際には、

最大16台 – HMD1台 – ベースステーション2台 = 13台

と、13台が現状の最大接続数のように感じました。
ですがVive Trackerも発売されるので今後SteamVR Plugin側のUpdateですぐに上限が変わるのかもしれません。

ますます今後が楽しみですね!
それでは、無線コントローラーで良いVRライフを~♪

初音ミクさんと次元を超えた俺

Leave a reply

Your email address will not be published.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>