こんにちは。
最近、VIVEから新しいトラッカーが発売されましたね。研究室で購入したものを見ると、シャープな形状となり小型化したことが見て取れます。そんなVIVE trackerですが、amazonによると1つ買うだけでも17000円以上もかかるんですね。また、VIVE trackerを使用するにはBase Stationという赤外線を発するデバイスも使用する必要があります(17000円)。

【国内正規品】 HTC VIVE Tracker (3.0)
- 発売日: 2021/03/15
- メディア: Video Game
とてもじゃないですが両方を買うのは割高ですよね。Base Stationは必須ですが、tracker側は複数個必要な場面もある上に、正直オーバースペックなので自作することで格安化できると考えられます!
私がVIVE trackerに注目している理由は、↓ この物理フリック入力キーボードをVR空間中でも応用できるようにしたいからです。
3月あたりから実装しつつ勉強もしてきたので、その知識を記事にしていこうと思います。 その中でも今回は、VIVE trackerが位置検出するため利用している、Base Stationから発される赤外線信号について説明したいと思います。
概要
VIVE trackerは、Base Stationから発される赤外線信号を受信し、その時間的なパターンから自己位置を算出しています。この方式をOutside-in方式と呼び、Base Stationのように外部から信号を発するプロジェクタを用います。トラッキング対象はプロジェクタの光をセンシングし、その情報だけでデバイスのみで自己位置が算出できます。自分だけで位置がわかるので、わざわざトラッキング対象をカメラで位置推定して、無線で位置を教えてあげる必要はありません。
全然身近じゃない技術とお思いかもしれませんが、おそらくあのWiiリモコンも似たような方式を採用しています。リモコンの先端部に赤外線透過フィルタとカメラが内蔵されており、謎のバーから発信される赤外線を読んでいたわけですね。パルスが発されているかは未調査なので、Outside-in方式かは断定できませんが。。。
// Outside-in方式の対象にあたるInside-out方式では、トラッキング対象がカメラを持って外部環境を取得し、SLAMして位置を推測します。こちらのほうが皆さんにとって直感的な技術かもしれませんね。
Base Stationが発する信号
Base Stationは現在Version.2まで発売されているはずですが、今回は比較的簡単な仕組みのVersion.1のほうを取り扱おうと思います。Base Station(v1)は2種類の信号を発します。1つはBlinkという一定時間間隔ごとの点滅で、もう1つはSweepというレイの走査です。赤外線は850nmの波長らしいです。
Blinkは信号の開始タイミングを示しており、これを時間基準としてsweepの信号が送られます。sweepはx軸とy軸の2方向に走査する信号で、異なる座標においてこのsweepの光が届くタイミングが変化します。
Base Stationの中身は ↓ のようなイメージになっています。
左上の9つの赤外線LEDでBlink信号を発し、下 / 右にある赤外線LEDがそれぞれx軸 / y軸方向に回転しながら光を発しています。下 / 右にあるLEDは直進性が高く、回転角度に合った領域にしか光が届きません。光 = 超早い(約30万km/s)ことと、 回転 = 超遅い(120π rad/s)ことで、座標によって光が届くタイミングが異なっています。
↓ の動画がイメージしやすいです。人間には波長と速度の問題で見ることができませんが、こうやって可視化されるとイメージが湧きやすいですね。 youtu.be
Base Stationが発する信号の詳細
2つのBase Stationの同期
Base Stationは2つ1組で使われることが想定されているようで、MasterとSlaveの2つのBase Stationが同期して信号を発します。Slaveが無い場合もあり得ますが、基本的にはMasterが開始の信号を 65 ~135 (us)程度で発信し、開始の 400 (us)後にSlaveが同様の時間で信号を発します。初めの2信号分は同期をとるためのもので、「どのBase Stationがこの周期を担うか」や「どの軸でsweepを行なうか」などの情報を含んでいます。2信号の同期が行なわれた後、どちらかのBase Stationのうち、xy軸どちらかのsweepが行なわれます。
つまり3つの信号が1つのフェーズで動作しています。
図示すると ↓ のような感じになります。
赤外線ダイオードで受光すると ↓ のような信号が取得できます。 github.com
同期信号が持つ情報
2信号の同期信号は周期ごとにHighの長さが異なっており、およそ65 ~ 135(us)の範囲で変化します。この表 ↓ がわかりやすいので引用させていただきます。
Highの時間によって8つのパターンに信号を分類できます。つまり3bit分の情報が読み取れるということです。3bitは「axis」「skip」「data」の3種類で、それぞれ「sweepの軸方向」「本周期でsweepするか」「OOTX形式のデータ1bit分」を示しています。位置計算をするうえで常に取得すべきなのは「axis」と「skip」の情報で、「data」の情報は初期設定時くらいにしか使いません。Base Station同士の位置関係を知るためには、dataを読み取りOOTX形式でdecodeする必要がありますが、それ以上に必要な情報はあまりないはずです(故障検知ぐらいかな?)。
この3bitは、Highの時間から次の式で導出できます。
おわりに
Base Stationから発される赤外線信号がどんなものかわかったので、sweepの取得タイミングを基にどのように座標を算出できるかについて明日は説明できればと考えています。数学は得意でないため、わかりやすく説明できるか不安ですが。。。
それでは。