大人でも子供でも、どこでも安定してジェスチャーを検出可能な技術とは

そして、発表の後半はKinectの説明に費やされた。ご存知のようにKinectは、ユーザのジェスチャーをキャプチャーしてゲームをコントロールする入力機器である。

しかし、対象が子供でも大人でも安定して検出ができ、広い部屋でも狭い部屋でも、プレーヤが複数でも、部屋の照明に影響されず安定して動かすのは容易ではないという。

Kinectに求められる性能要件

奥行き方向の検知であるが、1%程度の距離解像度で、2.5cmより小さな対象(子供の手首など)を検出する必要があるという。そして、水平方向70度の範囲で、0.8mから4.2mまでフルスペックの精度で動作し、ソフトウェアに対して20ms以下の遅れで反応し、遅れは2%以下の精度で一致する必要があるという。

このために、光センサは単に画像を検出するだけでなく、光の到着時間を分解できるTime of Flightテクノロジを使っている。

そして、Kinectからレーザ光を照射し、反射光を時間分解能の高いToFピクセルアレイで受光する。ただし、数10psオーダの分解能でリアルタイムに光の強度を測るのは大変なので、シャッターを開けるタイミングをスイープしながら、距離ごとの画像を取っていると思われる。

レーザを照射し、反射光を時系列でピクセルごとに検出する

そして、受信した光をピクセル間で比較する。AとBのピクセルの和は、全体的な室内の明るさや、反射光の普通のモノクロのイメージとなるが、A-Bは奥行きの位相情報である。また、以下の式は環境光に依存しない対象の動きのアクティブさを表している。

Kinectのセンサシステムのブロックダイアグラムは次のスライドのようになっており、レーザの照射系とタイミングを合わせて反射光を取り込む512×424ピクセルのセンサがあり、それをAD変換してカメラSoCを経由してSouth BridgeのUSB 3.0につないでいる。

Kinectのセンサ系のブロックダイアグラム

光は距離の2乗で広がってしまうし、黒いシャツの反射率は10%程度であるのに、白いシャツは95%反射する。このため、近くの白いシャツと遠くの黒いシャツの対象を検出するためには2500倍のダイナミックレンジが必要であり、2つかそれ以上のシャッタースピードでイメージを取り込み、一番良いデータを使っている。

距離や服の色で反射光は大きく変わる

反射光の往復時間が照射光パルスに間隔より長い場合は、位相は折り返されてしまう。80MHzのパルスの場合、この距離は3.75mとなる。より遠くからの反射の距離を測るためには、パルス間隔を延ばすという手もあるが、そうすると距離分解能が落ちてしまうので、次の図のように少し周波数が違う2つの周期での測定を組み合わせて、高い分解能で、正確な距離を求めているという。

距離の検出は80MHzでは、3.75mで360度位相が回る

室内の照明に依存すると、次のスライドの左の写真のように横から照明があたると影ができてソフトが混乱してしまうが、Kinectからレーザを照射すると、正面からの照射となり影ができず、室内の照明にも影響されないイメージが得られる。

横からの照明が当たっているイメージ(左)とKinectからのレーザの反射イメージ(右)

これらのテクノロジを総合して、Kinectは30fpsというリアルタイムでユーザの奥行きイメージを認識している。この写真では手の指まで識別でき、十分な解像度を持っていることがわかる。

30fpsでリアルタイムに2人の女性の奥行きイメージを認識している

なお、Kinectのブロック図ではAD変換されたピクセルイメージをUSB経由で送っているだけで、A-Bの計算や奥行きイメージの作成は、メインSoCで行われている筈である。筆者は、オーディオ処理には不相応に強力なDSP群がこの処理を行っているのではないかと推測している。