凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Ovrvision SDK v2 x Oculus Rift DK2 で AR を楽しむ方法についてまとめてみた

はじめに

Oculus Rift と組み合わせて立体視可能なスルー画を楽しめるステレオカメラOvrvision の待望の DK2 版マウンタ及び SDK が発売・公開され、先週予約していたものが届きました。

Ovrvision 1 : Stereo camera for Oculus Rift

Ovrvision 1 : Stereo camera for Oculus Rift

Ovrvision 1 : for Oculus Rift DK2 Cover

Ovrvision 1 : for Oculus Rift DK2 Cover

Ovrvision は 60 fps640x480x2 な広角ステレオカメラで、DK1 の頃も SDK を利用しながら AR と組み合わせて色々と楽しむことが出来ました。

PS Eye で自作していた頃と比較すると格段に楽になり、また軽量な AruCo を利用した AR を簡単に扱うことのできるマルチプラットフォームSDK も用意されていることから、安価で使いやすいステレオ視可能な AR 環境を手に入れることが出来ます。ハンズオンから SDK の利用、高速化あたりのノウハウ、今後の情報などについてまとめてみました。

環境

外観・組み立て

Ovrvision1 を購入するとパーツが届きますので、まずは組み立てが必要です。組み立てに必要な情報は以下にあがっています。

Ovrvision は以下の様な円筒の箱に入って届きます。この箱は後でサンプルアプリで利用するので捨てないようにしましょう。

f:id:hecomi:20141122153131j:plain

中には本体、DK2 マウンタの土台およびカバー、組み立て用のドライバおよびネジ(短4本、長4本)、ケーブルが同梱されています。

f:id:hecomi:20141122153222j:plain

ネジ穴が左右対称なので上下間違いやすいですが、Oculus Rift DK2 に取り付けた際に DK2 の USB ポートと同じ側に Ovrvision1 の USB miniB 口が来るような向きで取り付けましょう。基本的には公式の動画を参照すると良いと思います。

f:id:hecomi:20141122184413j:plain

完成するとこんな感じになります。ケーブルも本体で完結するのでとてもシンプルです。

f:id:hecomi:20141122193209j:plain

なお、Oculus Rift DK2 のケーブル結束部に 5V 電源をつないであげないと DK2 の USB ポートにつないだデバイスが認識されないので注意してください。

サンプルについて

Ovrvision SDK for Unity

後述します。

Ovrvision SDK for Windows

ダウンロードして bin フォルダを見てみると、x86x64 向けにそれぞれダイナミックリンク用に *.dll 及び *.lib が付属していますので、以前と同様に C++ でソフトを作成することが可能です。また C# 用の DLL やサンプルも付属しています(ただし exe は画の同期ずれが起きていました...)。詳細は以下のページをご参照下さい。

x64 フォルダにはビルド済みの exe が入っているのでクリックすると以下の様な画面が開きます。Extend モードにして頑張って DK2 側へウィンドウを持っていけば立体視出来ます。

f:id:hecomi:20141125153631p:plain

これを利用して本体のカメラを回してピント調節をすると良いと思います。また、A キーを押下すると AR モードになって、ArUco 用のマーカを見せると番号と座標を dump してくれます。

f:id:hecomi:20141125153752p:plain

Mac についてはまだ見ていませんがだいたい同じものと思われます。

Calibration ツールについて

カメラの歪み補正を行うキャリブレーションツールtools/ovrvision_calibration.exe として付属しています。これを実行すると以下の様なウィンドウが表示され、「Open Ovrvision」 > 「Start Calibration」に従って 25 枚のまんべんなく画面を覆うようなチェックボードの写真を撮ります。

f:id:hecomi:20141125142602p:plain

撮り終わると自動的に計算が走り、キャリブレーションデータが PC に保存されます。ドキュメントが見当たらなかったのでおそらくですが、C:\Users\<USER_NAME>\AppData\Local\Temp\ovrvision_conf2.xmlキャリブレーション結果を保存しているファイルだと思われます。

AR のサンプル

以下のページからクエリちゃんの AR サンプル / Ovrvision ケースのテクスチャを変更するサンプルをダウンロードできます。

Ovrvision が入っていた円筒形のケースの天面をなるべく明るい状態で近づいてじっと見ているとクエリちゃんが出てきて喋りながら動いてくれたり、筒のテクスチャが十字キーで変更できたりします。

f:id:hecomi:20141125154648p:plain

f:id:hecomi:20141125185041p:plain

左目はバッチリなのですが右目のズレが目立ちますね...(処理自体は左の画像をベースに行っているので)。カメラの向きが調整・固定出来たら良いのですがどなたか良い方法確立したら教えて下さい。

サンプルについては今後も随時拡充していくとのことです。

Unity サンプルについて

取り敢えず使ってみる

以下のページからダウンロードします。

ovrvision_unity_includeOVR.unitypackage を開くと現在のプロジェクトへインポートされます。そこに含まれている ovrvision_scene を開くと以下の様なシーンが開きます。

f:id:hecomi:20141125161935p:plain

OvrvisionViewObject にアタッチされている OvrvisionTrackerMarker ID に該当する番号の ArUco マーカを見つけると OvrvisionViewObject に入っているオブジェクトがそのマーカの上に重畳される形になります。

f:id:hecomi:20141125164350p:plain

自分の好きなオブジェクトにしてあげれば色々なものを表示できます。取り敢えずはダウンロードしたフォルダの中にある marker_sample に 56 番と 64 番のマーカが入っていますのでこれを利用すると良いと思います。それ以外の番号のマーカについては自前で AruUco をビルドするか、izm さんのブログから入手できるビルド済みのバイナリを利用するのが良いと思います。

複数の AR オブジェクトを表示

OvrvisionViewObject をコピーして複数のトラッカーを作成してあげれば同時に複数のオブジェクトを表示することも出来ます。

f:id:hecomi:20141125165810p:plain

カメラ画と AR オブジェクトの焦点がずれるのを調整

内部的には 20 cm のマーカを仮定して計算しているようなので、マーカのサイズが小さいと視差のズレが目立ってしまいます。これはそれぞれのカメラ画から得られたマーカの姿勢を使ってそれぞれのカメラ画用に AR オブジェクトを別々にレンダリングすることで、ぴったりあった画を作成できますが*1、異なるオブジェクトを扱うのがコスト高なので、出来ることなら避けたいです。公式ではマーカを物理的に大きくするかカメラを動かすことを推奨しています。

2014/11/25 現在だと古い SDK の情報なので今回直す方法を紹介します。OVRCameraRig オブジェクトにアタッチされている OVRCameraRig.cs を開き、UpdateAnchors() を見てみます。

private void UpdateAnchors()
{
    OVRPose leftEye = OVRManager.display.GetEyePose(OVREye.Left);
    OVRPose rightEye = OVRManager.display.GetEyePose(OVREye.Right);

    //leftEyeAnchor.localRotation = leftEye.orientation;
    //centerEyeAnchor.localRotation = leftEye.orientation; // using left eye for now
    //rightEyeAnchor.localRotation = rightEye.orientation;

    leftEyeAnchor.localPosition = new Vector3(0.0f,0.0f,0.0f);
    centerEyeAnchor.localPosition = new Vector3(0.0f, 0.0f, 0.0f);
    rightEyeAnchor.localPosition = new Vector3(0.05f, 0.0f, 0.0f);
}

ここではオリジナルの OVRCamearRig.cs のコードが編集されて、localPosition が固定値となっています。ここで rightEyeAnchor.localPositionx を変更してあげることで視差を調整することが出来ます。例えば上の一連のスクリーンショットでは 0.05f0.2f にしています。この設定では目が 20 cm 離れている人間になっているので気持ち悪いですが、そこそこ合うので対症療法的には良いと思います。

高速化について

Deep Profile してみるとテクスチャを撮ってくるところと姿勢の計算部が重い事がわかります。

f:id:hecomi:20141125200230p:plain

ここを例のごとくやっつけですが別スレッド化しました。

これで処理に大分余裕ができたと思います。

f:id:hecomi:20141125200327p:plain

OVR のバージョン

Ovrvision SDK v2.0 では v0.4.3 だったものが、Ovrvision SDK v2.1 より v0.4.3.1 になりました。

以前の問題点の改善

以前の Ovrvision SDK for Unity で発生していた描画順に付随する問題(参考:2014-04-07 - 凹みTips)ですが、今回は専用のレンダリングカメラを用意するわけではなく、Ovrvision で撮ってきた画をテクスチャにしたプレーンを OVRCameraRig に突っ込む形になったため、透明なものを描画しても問題なく描画されるようになっています。

f:id:hecomi:20141125174503p:plain

今後のロードマップ

Ovrvision for Metaio SDK

マーカレスな AR を実現できるように Metaio SDK とのバインディングを作成されているようです。おそらく前述のクエリちゃんのデモはこれを利用しているのではないかと思われます。ただし有償のようです。

Ovrvision Pro

3万円代後半のプロ仕様のモデルが開発される予定とのことです。特徴としては、

  • Oculus Rift DK2(もしくはコンシューマモデル)に取り付け可能なマウンタ
  • 解像度 ⇒ 720p HD(1280x720p) x 2
  • フレームレート ⇒ 60 fps
  • カメラ間同期(ステレオ)⇒ より正確なARに対応
  • ハイダイナミックレンジ対応 ⇒ 暗さに強くなり、白とびも改善
  • カメラ内部へ設定情報を保存する機能(EEPROM)
  • カメラ単独での録画機能
  • 汎用プログラマブルインターフェイス(GPIF)

とのことです。サイト上では 11 月末よりクラウドファンディング開始と書いてありますが、残念ですがこれは 2 月に延期されたようです。

ストレッチゴールも考えられているようなので、是非応援したいです。

その他メモ

  • DK1 の時と比べて上下が反転しているため、DK1 の時に作成したソフトをそのまま動かすと上下逆さな映像になります。
  • Leap Motion の公式マウンタを取り付けている際は干渉しますので外すか別の DK2 を用意する必要があります。
  • DK2 は 75 fps で Ovrvision は 60 fps なので同期が取れていないのですが、ここの処理をどうしているかは未だノーチェックです。

おわりに

この分野はとても面白くて単に AR オブジェクトを表示するだけでなく、人間の行動を支援するみたいな実験も色々と出来ると思いますので、色々とやってみたいと思います。