HTC Vive Trackerの仕様・使い方まとめ
※この記事は情報が古くなっています(SteamVR Plugin 1.x系の情報)
新しいSteamVR Plugin 2.x系の情報は以下が参考になるかもしれません。
・SteamVR Plugin 2.0 セットアップ・サンプルシーンを動かすまでの備忘録
https://qiita.com/kyourikey/items/5967018e613b2fd49a1f
・【Unity】SteamVR Plugin 2.0の入力方法を調べてみた
http://shop-0761.hatenablog.com/entry/2018/10/12/071507
ついにHTC Vive Trackerが発売開始しました! 格安3DトラッキングシステムであるところのLighthouseの空間の中で高い精度で位置・角度を取得できるデバイスで、VRだけでなく様々な分野に応用できる可能性を秘めています。
前職の1→10で先行して触れる機会があったので、使い方とその際に気づいた事などをまとめておきます。
公式資料
ペアリング方法
- USBワイヤレスドングルをPCに接続
- SteamVRメニューから、デバイス>コントローラーのペアリング
- 電源ボタン(Viveマーク)長押しでLEDが青く点滅
- ペアリングに成功するとLEDが緑に点灯
充電方法
- ACアダプタでMicroUSB接続
- 最大5V/1000mA。最大充電時間1.5時間。
- PCとMicroUSB接続
- 最大5V/500mA。最大充電時間3時間。
- Pogo Pinの3番に5V給電
- 最大5V/500mA。最大充電時間3時間。
ファームウェアアップデート
- USB接続してSteamVRメニューから、デバイス>ファームウェアの更新
- 設定からBluetoothコミュニケーションを有効化しておくと無線での更新が可能。(管理者ユーザーじゃないとBluetoothドライバが正しく入らない可能性有り)
視野角(FOV)
トラッキング可能な角度は270度。下側をベースステーションに向けている状態ではトラッキングできなくなるので注意。
アクセサリと組み合わせて使う場合は、アクセサリによる死角にも注意。
接続例
公式ドキュメントには接続例として、5つのケースが紹介されていた。Use Case 1 : Tracker USB通信
USB接続でシンプルにトラッキング情報だけを使う場合。Use Case 2 : Tracker USB通信 + アクセサリ 別途通信
TrackerはUSB接続。アクセサリ用のデータは別途BluetoothやWiFiや有線等でご自由にどうぞ、というスタイル。Use Case 3 : Tracker 無線通信
Trackerをドングルで無線接続。無線でトラッキングだけ行う場合。Use Case 4 : Tracker 無線通信 + アクセサリ 別途通信
Trackerをドングルで無線接続。さらにアクセサリ用のデータを別途用意してね、というタイプ。Use Case 5 : Tracker&アクセサリ 無線通信
Trackerもアクセサリのデータも全部ワイヤレスドングルでまとめて通信する場合。独自アクセサリを開発する場合、一番スマートな構成なのでこれを目指したい。
Pogo Pin(ポゴピン)
Tracker下部に配置された6個のスプリングタイプのピン。電源供給や、ボタン押下のシミュレーションができる。
アウトプットピンも一つ備えていて、アクセサリー側のバイブレーションやLED等とも連携できる。
ピン配置
- Digital output(アクセサリーとの連携用)
- GND
- Digital / Power input(グリップボタン)
- Digital input(トリガーボタン)
- Digital input(トラックパッドボタン)
- Digital input(メニューボタン)
ピン情報
- 3.5mmピッチ
- パッド部は縦幅4.1mm x 横幅2mm
- 謎規格すぎてどこにも対応コネクタが見つからない…。あまりに酷すぎるので、公式がそのうちコネクタ販売開始するんじゃないかな?
使用方法
- ボタンシミュレーション
- Digital inputピンをGNDにショートさせるとボタン押下状態になる
- 外部アクセサリー(バイブレーションなど)との連携
- 1ピンからのDigital outputをアクセサリ側で受け取って、アクチュエーター等と連携させる。
- ONにすると約3.3Vが出力される。振動モーターとかなら回せる。
- 現状、API的に1~3999(ms = ミリ秒)しか連続してONにできない。
- update内で叩きまくっても瞬断してしまうので、Output Pinで他のマイコン等を動作させるにはコンデンサを挟む必要がありそう。
- SteamVR PluginからOutput PinをONにするにはTriggerHapticPulse()を呼ぶ。
※Pulseという名前が付いてるけど実際はDuration(期間(ms))なので注意。(1~3999の範囲)SteamVR_Controller.Device device; device = SteamVR_Controller.Input((int)index); device.TriggerHapticPulse((ushort)millisec);
Vive Tracker用アダプタ作ってみた
- HTC Vive Tracker Hot Shoe Adapter
http://www.thingiverse.com/thing:2213549
https://amzn.to/3hjm2tH
パッド部分には銅箔テープを貼ってスイッチ等につなぐ想定で設計しています。 腕や足に取り付ける用のバンドアダプタも作っておいた。
- HTC Vive Tracker Band Adapter
https://www.thingiverse.com/thing:2213567
Output Pinを使ったコマンド送信がしたい
通常だとOutput PinではHIGHかLOWの1bitの情報しか表現できないけど、それだと例えばトラッカーを搭載しているラジコンを前進・後退・右旋回・左旋回させたい、みたいな用途だと別途無線の通信を用意する必要が出てきてとても面倒です。せっかくOutput Pinが1ピンついてるのでこれでコマンド送信できたら便利ですよね。
API的にPWMみたいな高速&複雑な制御はできなさそうでしたが、ONにしている時間は割と正確に制御できているようなので、Tracker→Arduinoへの簡単なコマンド送信を試してみました。
これである程度のコマンドはTrackerの無線を使って送れそうです。便利!一部の人が切望しそうなPogoPinコミュニケーション(#ViveTracker (#unity )→Arduino)機能が実装できた。
— Teruaki Tsubokura (@kohack_v) 2017年4月10日
Trackerでラジコンやロボットや照明制御したり、簡単な事ならTrackerの無線だけで完結できる。
USBは電源用で通信には使ってない。 pic.twitter.com/3w4Nmu3Q9U
USB接続
Vive TrackerはUSBでアクセサリと接続することで、HID(ヒューマンインタフェースデバイス)として機能する。
アクセサリ→Vive Trackerへのキー情報などの情報送信は、USB HIDクラスのFeature Reportという単位で送信する必要がある。
このあたり詳しくないのでちょっと調べてみた。
- HIDのレポートにはInput、Output、Featureの3種類があるらしい。
http://wiki.onakasuita.org/pukiwiki/?%E3%83%AC%E3%83%9D%E3%83%BC%E3%83%88%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF - AVRマイコンでV-USBを使えばHID対応のアクセサリが作れるかもしれない。
http://jsdiy.web.fc2.com/vusb_hid/
http://qiita.com/takeru@github/items/42873e1a7e0aef830eea
- Arduinoで使えるVive Trackerライブラリを作ろうとしてる人のブログ
http://www.talariavr.com/blog/vive-tracker-initial-documentation/
Unity上での使い方
いくつかあるけど、一番楽そうな方法はこれ。- 公式のSteamVRプラグインをインポート
- [CameraRig]プレハブのControllerをコピーして名前をTrackerとかに変えておく。
- [CameraRig]にアサインされているSteamVR_ControllerManagerのObjectsにTrackerのゲームオブジェクトを追加すれば使える。
- ボタンの入力を取得したい場合は、TrackerのゲームオブジェクトにSteamVR_TrackedControllerをAddして、キーに応じたイベントリスナーを登録しておく。
_controller = GetComponent<SteamVR_TrackedController>();
_controller.TriggerClicked += TriggerClickedFunction; //トリガーがクリックされたらTriggerClickedFunction()を実行
_controller.MenuButtonClicked += MenuButtonClickedFunction; //メニューボタンがクリックされたらMenuButtonClickedFunction()を実行
_controller.PadClicked += PadClickedFunction; //パッドボタンがクリックされたらPadClickedFunction()を実行
_controller.Gripped += GrippedFunction; //グリップボタンがクリックされたらGrippedFunction()を実行
_controller.SteamClicked += SteamClickedFunction; //SteamボタンがクリックされたらSteamClickedFunction()を実行
受け側はこんな感じ?
void TriggerClickedFunction(object sender,ClickedEventArgs e)
{
//トリガーが押された時の処理
}
Unityで使うときの注意
DeviceIndexが何番に割り当てられるかわからない問題
Viveコントローラーにも言えるが、認識外れや復帰でコントローラーとTrackerの役割が入れ替わったりすることがある。- SteamVR_RenderModel の、renderModelName(描画されるモデルの名前)によって処理を分岐させると良いかも。
string renderModelName = GetComponentInChildren<SteamVR_RenderModel>().renderModelName;
if (renderModelName.IndexOf("{htc}vr_tracker_vive_1_0") > -1)
{
// Trackerの時だけ実行
}
- ViveTrackerの場合はモデル名は「{htc}vr_tracker_vive_1_0」
- Viveコントローラーの場合はモデル名は「vr_controller_vive_1_5」
- これらの名前はSteamVRやデバイスのファームウェアのアップデートによって変わるかもしれない。
Viveコントローラー2本の接続が必要?
- Viveコントローラー2本が接続されていない状態ではTrackerの挙動が安定しなかった。(位置や角度がおかしくなる)
- SteamVR PluginデフォルトのプレハブについてるSteamVR_ControllerManagerでは左手右手のコントローラーを指定しなければいけないためかもしれない。コントローラーを登録せずにTrackerのみ登録すればいけるかも?
案の定、SteamVR Pluginの[CameraRig]についているSteamVR_ControllerManagerが悪さしてました。
SteamVR_ControllerManagerを使う場合は、Right ControllerとLeft Controllerにコントローラーを設定する必要があるようです。
Trackerだけで使いたい場合は、SteamVR_ControllerManagerを使わずに、コントローラーのPrefabをコピーして直接DeviceIndexを1~15番まで設定してあげると良さそうでした。
アクセサリーの位置合わせ
- 公式ドキュメントには毎フレームGameObject.Find()かけて位置と角度を代入するという重そうなサンプルスクリプトが書いてある。
- スクリプトからやらなくてもTrackerゲームオブジェクトの子にアクセサリー用の3Dモデルを配置して位置合わせするだけでよさそう。
HTC VIVE本体(HMD)も接続が必要
- 公式フォーラムでも回答のあった通り、HMD無しでViveコントローラーやTrackerのみをつかう事が「現状」ではできない。今後修正される可能性あり。
- HMD無しではSteamVRが利用不可状態に。
- PythonからHMD無しで使えてる人がいる?
https://www.triadsemi.com/2017/03/28/steamvr-tracking-without-an-hmd/
上記の方法を試してみたところ、確かにHMD無しで接続することはできた。
ただ、Unityエディタ上でも書き出したアプリからもTrackerやコントローラーが表示されることは無かった…。
しかもしばらくするとSteamVRがフリーズしてしまう。おとなしく公式の対応を待った方がいいかも。
UnityからでもHMD無しでVive Trackerを使う方法が分かりました。
ただ、プロジェクトのVR Supportをオフにしてスクリプトから手動でOpenVRを初期化したり、
毎フレームポーリングして座標を取得するなど、ちょっと特殊な方法なので使いにくいです。
やり方はてんちょーさん(@shop_0761)が記事にまとめてくださってるのでこちらをどうぞ。 【Unity】ViveのHMDなしにTrackerを使う – てんちょーの技術日誌
プロトタイプ作ってみた
Vive Tracker + ペーパークラフト +アーケードボタンでプロトタイプを作ってみた。PogoPinをハックするのが中々大変でしたが、銅箔テープを巻いた基板をPogoPinに押し付けるようにしてボタンを接続してます。
プロジェクションマッピングのキャリブレーションが適当なまま撮影してしまいましたが、ちゃんと時間かけて合わせればバッチリ合います。 プロトタイプなので勝ち負けの機能は実装していませんでしたが、デモしてると自然と人が集まってきて盛り上がってました。
やっぱり全員で空間を共有できるインタラクティブなプロジェクションマッピングは楽しいですよね。 ちなみにこのプロトタイプは、1→10drive試作室のプロジェクトの1つとして制作させて頂きました。
- 1-10drive 試作室 prototyping project
http://prototyping-project.com/
基本的にはTrack Tankの時と仕組みは同じですが、子供の「くるまあそび」をテクノロジーを使って拡張する作品です。
床を走らせると道路や家が立ち並び、持ち上げると飛行機やヘリコプターに変化し、つなげると電車に変化するというものです。 面白い技術が出たらすぐにプロトタイプを作ってみるというフットワークの軽さが新しいコンテンツを作る上でも重要だと思います。
VRに限らずVive Trackerにはもっと色んな分野で活用できる可能性を秘めているので、これからも色々と試していこうと思います。
Comment ( 1 )