読者です 読者をやめる 読者になる 読者になる

Kinect v2をOculusRiftと組み合わせてデモをする際のノウハウと知見

概要

Kinect v2は現時点で椅子に座った体験者の頭と手の位置を取得するだけなら、安価なセンサ類の中では一番安定していると個人的には思っています。 単純なヘッドトラッキングだけならOculusRiftDK2のカメラがあれば何とかなりますが、他の関節も取得したい場合は、こういったデバイスを併用することになります。

OculusRiftと併用して展示する機会が何度かあったので、その際に分かった事を書きます。

Kinect v2 Unity Integrationは重い

OculusRift DK2は75FPS環境が推奨されていて、Unityで制作したコンテンツを安価なPCで75FPSを出すためには色々なチューニングをしています。
しかしKinect v2 Unity IntegrationのパッケージをUnityに読み込み、関節の位置だけを取得する(つまり、描画負荷はほとんど無い)コンテンツを作って、Kinect 未接続時に75FPSギリギリのシーンに対してKinectを接続すると65FPS程度まで速度が低下しました。 まだ定量的には計測していませんが、特にCPU及びGPUが非力なノートPC環境でのデモを行う場合は、Kinectの分の負荷増加を考慮してパフォーマンスに余裕があるコンテンツを作ることが望ましいと思います。

座りっぱなしの人は検出されにくい

椅子に座って首を回すくらいしか動きが無い体験者を、Kinect v2は人だと検出しにくいです。
そして体験者の背後で覗き込む人や、後ろを通りすぎる他の人をKinectが検出してしまって、ゲーム内のキャラクター位置があらぬ方向に吹っ飛んでしまってアアアッ!!!となります。

これに対しては、ある程度椅子に座った後に動きを要求するか、椅子に座る前に体験する人をトラッキングしていることを確認してからの方が望ましいです。

人検出は万能ではない

椅子に座っている体験者の様子を覗き込む人がいると、二人分の点群が合体して、頭と腕と足がありえないポーズになることがあります。
これはv2のSDKで特に顕著で、v1の時はもうちょっとうまく分離できていたような記憶があります。
こんな時は、「一度Kinectのカメラを手で覆ってから戻す」なんてことをやりがちですが、前述の「座りっぱなしの体験者はKinectで検出されにくい」と言うのと併せてリカバリー不能になる事が多いです。
そんな時は落ち着いて覗き込んでいる人に事情を説明してしゃがんでもらう、離れてもらうなどしてもらいましょう。 進入禁止エリアを物理的にテープを床に貼る、カーテンで区切るなどの対処が許される展示なら、検討する価値があります。

プレビューを使おう

上で挙げたような問題に対処するために、技術者がもし貼り付いていられる展示であれば、別窓でKinectが今誰を検知しているかをプレビューしておくと、便利です。
Kinect SDK browserの中に入っているサンプルの「Body Basic WPF等が低負荷でおすすめです。
(Kinect Studioのpreviewを使うと詳細情報が取得できるんですが、割と重いソフトであること。Kinectのマイク入力を拾って、エコーがかかった外部の音が体験者のヘッドホンに入ってしまう。などの問題点があるので、Body Basicが良いと思います)

また、Kinect v2の人認識は複数ソフトウェアでデータは共有しているので、デモの開始前にこのプレビュー画面を見ながら、体験予定者が検知されていなければ、立ったり座ったり、手を動かしてもらいましょう。Kinectに検知させてから座ってもらい、OculusRiftを被せると、スムーズな体験を提供できると思います。

プログラム上で出来る事

  • 一番距離が近い人を体験者と見なす だけでは大抵失敗する
  • このエリア内にいる中で一番近い人、みたいな区切りをすると比較的安全
  • しかし人検知は万能ではないので、技術者張り付きではない環境では、一定の事故は起きる。遊びなら諦めましょう。お仕事だったら…大変ですね!!