はじめに
Oculus Rift と組み合わせて立体視可能なスルー画を楽しめるステレオカメラ、Ovrvision の待望の DK2 版マウンタ及び SDK が発売・公開され、先週予約していたものが届きました。
Ovrvision 1 : Stereo camera for Oculus Rift
- 出版社/メーカー: 株式会社しのびや.com
- メディア: エレクトロニクス
- この商品を含むブログを見る
Ovrvision 1 : for Oculus Rift DK2 Cover
- 出版社/メーカー: 株式会社しのびや.com
- メディア: Personal Computers
- この商品を含むブログを見る
Ovrvision は 60 fps、640x480x2 な広角ステレオカメラで、DK1 の頃も SDK を利用しながら AR と組み合わせて色々と楽しむことが出来ました。
- 過去記事: Ovrvision の検索結果 - 凹みTips
PS Eye で自作していた頃と比較すると格段に楽になり、また軽量な AruCo を利用した AR を簡単に扱うことのできるマルチプラットフォームな SDK も用意されていることから、安価で使いやすいステレオ視可能な AR 環境を手に入れることが出来ます。ハンズオンから SDK の利用、高速化あたりのノウハウ、今後の情報などについてまとめてみました。
環境
- Windows 8.1
- Unity 4.6
- Ovrvision SDK v2.1
外観・組み立て
Ovrvision1 を購入するとパーツが届きますので、まずは組み立てが必要です。組み立てに必要な情報は以下にあがっています。
Ovrvision は以下の様な円筒の箱に入って届きます。この箱は後でサンプルアプリで利用するので捨てないようにしましょう。
中には本体、DK2 マウンタの土台およびカバー、組み立て用のドライバおよびネジ(短4本、長4本)、ケーブルが同梱されています。
ネジ穴が左右対称なので上下間違いやすいですが、Oculus Rift DK2 に取り付けた際に DK2 の USB ポートと同じ側に Ovrvision1 の USB miniB 口が来るような向きで取り付けましょう。基本的には公式の動画を参照すると良いと思います。
完成するとこんな感じになります。ケーブルも本体で完結するのでとてもシンプルです。
なお、Oculus Rift DK2 のケーブル結束部に 5V 電源をつないであげないと DK2 の USB ポートにつないだデバイスが認識されないので注意してください。
サンプルについて
Ovrvision SDK for Unity
後述します。
Ovrvision SDK for Windows
ダウンロードして bin
フォルダを見てみると、x86、x64 向けにそれぞれダイナミックリンク用に *.dll
及び *.lib
が付属していますので、以前と同様に C++ でソフトを作成することが可能です。また C# 用の DLL やサンプルも付属しています(ただし exe は画の同期ずれが起きていました...)。詳細は以下のページをご参照下さい。
- startup_manual - Ovrvision Developer Document
- Oculus Rift × OVRVISION × OpenCV で線画だけの世界を覗いてみた - 凹みTips
x64
フォルダにはビルド済みの exe が入っているのでクリックすると以下の様な画面が開きます。Extend モードにして頑張って DK2 側へウィンドウを持っていけば立体視出来ます。
これを利用して本体のカメラを回してピント調節をすると良いと思います。また、A
キーを押下すると AR モードになって、ArUco 用のマーカを見せると番号と座標を dump してくれます。
Mac についてはまだ見ていませんがだいたい同じものと思われます。
Calibration ツールについて
カメラの歪み補正を行うキャリブレーションツールが tools/ovrvision_calibration.exe
として付属しています。これを実行すると以下の様なウィンドウが表示され、「Open Ovrvision」 > 「Start Calibration」に従って 25 枚のまんべんなく画面を覆うようなチェックボードの写真を撮ります。
撮り終わると自動的に計算が走り、キャリブレーションデータが PC に保存されます。ドキュメントが見当たらなかったのでおそらくですが、C:\Users\<USER_NAME>\AppData\Local\Temp\ovrvision_conf2.xml
がキャリブレーション結果を保存しているファイルだと思われます。
AR のサンプル
以下のページからクエリちゃんの AR サンプル / Ovrvision ケースのテクスチャを変更するサンプルをダウンロードできます。
Ovrvision が入っていた円筒形のケースの天面をなるべく明るい状態で近づいてじっと見ているとクエリちゃんが出てきて喋りながら動いてくれたり、筒のテクスチャが十字キーで変更できたりします。
左目はバッチリなのですが右目のズレが目立ちますね...(処理自体は左の画像をベースに行っているので)。カメラの向きが調整・固定出来たら良いのですがどなたか良い方法確立したら教えて下さい。
サンプルについては今後も随時拡充していくとのことです。
サンプルにつきましては継続してOvrvison1で出来る技術デモを掲載していく予定です!もし公開して欲しい技術デモの要望をDMで頂ければ検討させて頂きます。 よろしくお願いします!http://t.co/WisbpSiVso
— ウィザプライ (@Wizapply) November 21, 2014
Unity サンプルについて
取り敢えず使ってみる
以下のページからダウンロードします。
ovrvision_unity_includeOVR.unitypackage
を開くと現在のプロジェクトへインポートされます。そこに含まれている ovrvision_scene
を開くと以下の様なシーンが開きます。
OvrvisionViewObject
にアタッチされている OvrvisionTracker
の Marker ID
に該当する番号の ArUco マーカを見つけると OvrvisionViewObject
に入っているオブジェクトがそのマーカの上に重畳される形になります。
自分の好きなオブジェクトにしてあげれば色々なものを表示できます。取り敢えずはダウンロードしたフォルダの中にある marker_sample
に 56 番と 64 番のマーカが入っていますのでこれを利用すると良いと思います。それ以外の番号のマーカについては自前で AruUco をビルドするか、izm さんのブログから入手できるビルド済みのバイナリを利用するのが良いと思います。
複数の AR オブジェクトを表示
OvrvisionViewObject
をコピーして複数のトラッカーを作成してあげれば同時に複数のオブジェクトを表示することも出来ます。
カメラ画と 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.localPosition
の x
を変更してあげることで視差を調整することが出来ます。例えば上の一連のスクリーンショットでは 0.05f
を 0.2f
にしています。この設定では目が 20 cm 離れている人間になっているので気持ち悪いですが、そこそこ合うので対症療法的には良いと思います。
高速化について
Deep Profile してみるとテクスチャを撮ってくるところと姿勢の計算部が重い事がわかります。
ここを例のごとくやっつけですが別スレッド化しました。
これで処理に大分余裕ができたと思います。
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
に突っ込む形になったため、透明なものを描画しても問題なく描画されるようになっています。
今後のロードマップ
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 オブジェクトを表示するだけでなく、人間の行動を支援するみたいな実験も色々と出来ると思いますので、色々とやってみたいと思います。