※2018/12/01追記
Noloから正式にOculus GO対応のStreaming Serviceアプリが出たので本手順は不要となりました!
はじめに
ALVRとNOLO-CV1を連携してSteam VR Gameを遊べる環境を構築する手順をまとめました。動機は下記。
- Oculus GoでALVR動かしたら思いのほか高品質で感動する。作者に感謝!
- 6DofとちゃんとしたコントローラーでSteam VRのゲームがやりたくなりNOLO-CV1を購入するがALVRがNOLO-CV1に対応してなくて愕然とする
- VRidgeとRiftcatを使ってみるも画質や遅延が酷くて使い物にならず絶望する
- NOLOの中の人がALVRの中の人にコンタクトを取っているようで期待しつつも、ALVRの中の人が6Dof対応に消極的なようなので不安が募る
- Driver4VRとかVirtualHereUSB使えとかキーワードは出てくるけど手順がよくわからん
- Oculus Santa Cruzが来るまで待てない
- もんもんとしてたら夢でサッポロビールの作るしかない歌を見たのでとりあえず自分で作ろうと奮起する
- コントローラの遅延はあるがBeat SaberのHardモードがクリアできる所までは来たので手順をまとめる事にした
おそらくDriver4VRとか使うのが王道な気もしますが、もっと良い&簡単な方法をご存知の方は教えてください!
概要
ALVRはFreePIEに対応しているようなのでALVRとNOLOをFreePIE経由で連携させる事を思い立ちましたが、NOLOとFreePIEとの連携方法がググってもよく分かりませんでした。
そのためNOLO用のFreePIEプラグインを自分で作りました。ソースは下記に置いてます。ネットで拾ったサンプルコードのコピペで作った習作ですので汚いコードですがご容赦ください。
NoloFreePIEClient(Androidアプリ)でOculus Goに接続したNOLOのセンサーデータをUDP経由でホストPCに転送し、NoloFreePIEPluginで受信してFreePIE内でNOLOの各種センシングデータを使えるようにしています。
上記とALVRのFreePIEプラグインを連携させる事により、ALVR内のコントローラーをNOLOで制御できるようになります。
※ALVRのAsynchronous Timewarpを生かすためNOLOで取得したHMDのローテーションデータは使わずに捨てる
ただALVRのソースを読んだ限りではHaptic Feedbackのイベントを拾っていないようで、上記だけだとNOLOのHaptic Feedback機能が使えません。そのためALVR側にも手を入れて、Haptic FeedbackイベントをFreePIEに渡せるようにしました。ソースは下記に置いてます。
一応ちゃんと動いたのでALVRにプルリクも送りましたが、初プルリクで不作法な感じ&的外れな実装かもしれないのでマージされるかは未知数です。Haptic Feedbackが欲しい方は上記リポジトリのソースをコンパイルしてALVRを起動してみてください。
※Driver4VRとか使うといらないのかもしれない。
※VRidgeとRiftcatはHaptic対応してたのでもうちょい画質とレイテンシーがまともになれば。。。
Window10 x64、GTX1080の環境でテストしてます。
手順
下記手順ではNOLOのセンサーをOculus Goに接続する前提でNoloFreePIEClientのapkをOculus Goにインストールしてますが、NOLOの位置情報をPCに送信するだけなので、センサーの接続&apkインストール先はOculus Goじゃなくても良いです。
別のAndroid端末持ってる方はそちらにセンサーを接続してapkをインストールした方がOculus Goにつなぐよりも電池の持ちがよくなりますし、Vysorも不要となるので良い気がします。
事前準備
-
ホストPCでadbコマンドを使えるようにする ※こちらを参照
-
Oculus Goをデベロッパーモードにする ※こちらを参照
-
Oculus GoとホストPCにALVRをインストールしSteam VRが動くようにする ※こちらを参照
-
ホストPCにFreePIEをインストールする
-
FreePIEのインストールディレクトリにSystem.Reactive.dllを配置する
-
FreePIEのプラグインディレクトリにNoloFreePIEPlugin.dllを配置する
-
FreePIEのプラグインディレクトリにALVRFreePIE.dllを配置する ※ALVR-portable-v2.3.0.zipに入ってます
-
ホストPCにVysorをインストールする
-
Oculus GoをUSBでホストPCに接続し、下記コマンドでNoloFreePIEClientのapkをインストールする ※apkは適当な位置に保存
adb install NoloFreePIEClient_v1.0_20180905_225447.apk
-
NOLOのベースステーション、HMDセンサー、コントローラーをペアリングする
遊ぶ際の手順
-
Oculus GoをUSBでホストPCに接続する
-
Oculus GoのIPを調べ接続ポートを5555に設定する
adb shell ip addr show wlan0
adb tcpip 5555
-
USBケーブルを外しadb connectでOculus Goにネットワーク経由で接続する
adb connect <2で調べたIP>:5555
-
NOLOのHMDセンサーをOculus Goに接続する ※接続に成功すると音が鳴ります
-
下記コマンドでNoloFreePIEClientを起動する
adb shell am start -n net.platyrhynchos.nolofreepieclient/net.platyrhynchos.nolofreepieclient.MainActivity
-
USB接続のダイアログが出たら、チェックボックスにチェックを入れタブを3回おしてOKボタンを押す ※OKボタンは見えないですが右下当たりにいるはず
-
Oculus GoのALVR Clientを起動する
-
ホストPCのALVR&Steam VRを起動し、ALVR Clientと接続する
-
FreePIEを起動し、NOLOとALVRを連携するスクリプトを読み込んで実行する
-
HMDセンサーの高さをSteam VRキャリブレーション時の高さに合わせ、HMDセンサー上部のボタンを押してキャリブレーションする
-
NOLOコントローラーをベースステーションに向けて電源ボタンをダブルクリックしキャリブレーションする
-
Steam VRのゲームで遊ぶ
※Vysorは閉じておいた方がNetworkトラフィック減って良いかも -
止める時はVysorで再接続して右下の㈢ボタンを押して、NoloFreePIEClientのタスクを×ボタンで終了する
課題
- ヘッドトラッキングの位置情報がNOLOのセンサー位置を基準とするため、Oculus Goの上部にセンサーを設置すると頭を傾げる等の動きでポジションが大きめに動いてしまい違和感がある。VR空間内の頭の中央辺りが基準となる様に補正が必要。慣れないと酔うので何とかしたい。
- HMDとかコントローラーの位置が現実とズレているような気がするので補正が必要そう。でも遊んでると慣れるので気にしなければOK。
- コントローラーを動かしていると向きがズレる事がままある。特にセンサーデータの加工はしていないのでNOLOの問題な気がする。ズレたらベースステーションにコントローラーを向けて電源ボタンダブルクリックで補正可能。
- タッチパッドクリック時の挙動が怪しい気がする
- Haptic Eventの値をどうやってNOLOのHapticPuls関数に渡せば正解なのか分からないので、イベントが発生した事だけ拾って値は適当に設定してる
- Oculus Goの電池が40%以下になっている場合、NOLOセンサーを接続しても正常に認識してくれない。Oculus Goの仕様上仕方がないらしいので使う前にフル充電する必要あり。一度認識すれば電池切れになるまで動かせる。
- NoloFreePIEClientのUIが手抜きのため操作にVysorが必要。でもOculus Goの仕様上USB接続時のダイアログ操作でどうしてもVysorが必要になるのでやむなし
- 通信部分がUDPで指定IPに文字列をCSVで送りまくったりソケットのハンドリングが微妙だったりと雑な作り。ゲームの通信処理カッチリ作ってるサンプル何処かに無いかな
- Beat SaberのExpertモードをクリアできるようにするためにはもうちょいコントローラーの遅延を押さえる必要があるけど、何処がボトルネックか分からない。たぶん通信部分とかFreePIE部分だろうけど、この辺りのプロファイリングとか最適化はどうしたら良いのだろうか。NOLOのセンサーデータ取得部分だったらお手上げ
- C#側の通信処理をネットで拾ったサンプルのコピペで作ったらSystem.Reactive.dllが必要となってしまった。再配布方法が不明だったのでリポジトリに入れてしまったが良いのだろうか。このDLLだけ拾うの厳しそうだしどうやって配布するのが正解なんだろう
- 手順が複雑すぎるけど公式対応までの繋ぎだから我慢