VR
oga at 23:47
HTC Vive や Oculus Rift など、PC 向け VR HMD ではモニタ画面にもゲームの映像が出ます。周囲からも VR 内部がどんな状態なのかある程度は見えるようになっています。モバイルやスタンドアロンタイプの VR HMD だと本人にしかわからないので、デモなど人に見せたい場合は何らかの手段が必要です。

Android に標準で用意されている Chromecast や Miracast を使うのが簡単です。Oculus Go の場合もシェアボタンからリンクされているスマートフォンや Chromecast に出力できるようです。

下記は Daydream を Miracast で出力したものです。モニタ直撮り。使用した Miracast アダプタは Microsft Wireless Display Adapter

Miracast

また Windows 10 には Miracast 機能があるので、アダプタがなくても Wi-Fi があれば直接 PC に表示することができます。

(1) 設定→システム→この PC へプロジェクション

 「セキュリティで保護されたネットワーク上のどこでも利用可能」

(2) スタートメニューから「接続」というアプリを起動。

この状態で HDMI の Miracast アダプタと同じように繋がります。なおこの PC は Wi-Fi を内蔵していますが LAN には有線接続しました。(Wi-Fi は Miracast 専用)

↓実際に ZenFone AR + Daydream でつないだところ。(Pixel 3 は Miracast 非対応でした)

Windows10 Miracast

他にもアプリを使う方法があります。様々なサイトで Vysor というソフトが紹介されていました。このソフトは画面のミラーリングだけでなく PC から操作もできるようです。

ただし接続に adb を使っており開発者モードを有効にする必要があります。ワイヤレス接続も adb の tcp 接続を使っているようです。

VR では PC からの操作は不要なのと、adb を使うなら python で作れそうな気がしたので作ってみました。

GitHub: android_mirrortool

下記は android_mirrortool を使って Oculus Go を Windows PC にミラーリングしたところです。

android_mirrortool

Android には画面を録画する機能があります。それを adb 経由でストリーミングしているだけです。python の opencv を使っています。音は出ません。Windows と Linux で動きます。


● Windows の場合

(1) Android SDK を install し adb.exe にパスを張っておく

  AndroidStudio をそのまま install した場合はこの辺です。
  C:/Users/<USERNAME>/AppData/Local/Android/sdk/platform-tools

(2) python 3.x を install

(3) パッケージ pywin32 と opencv-python を install する

pip をを使ってインストールする場合

pip3 install pywin32
pip3 install opencv-python


●使い方

(1) 開発者モードにして adb でつないでおきます。

(2) 「 python android_mirror.py 」を実行します。

画面に動きがないと Mirror Window が表示されないので最初はいろいろ操作して画面を動かしてみてください。終了は ESC キーです。

デフォルトで Full HD になります。VR が処理落ちする場合、または Wi-Fi で adb 接続する場合はレートやサイズを落としてください。



python android_mirror.py --bitrate 4m --size 1280x720


●Linux の場合

下記の操作は Debian 系

$ sudo apt install python3 python3-pip
$ pip3 install opencv-python
$ sudo apt install adb

開発者モードにして adb でつながったら

$ python3 android_mirror.py


●スクリーンキャプチャ

-c をつけるとスクリーンキャプチャになります。png で保存します。

python android_mirror.py -c



関連エントリ
Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた
Oculus Go を文章書き&開発マシンにする
Gear VR のヘッドセットの種類のまとめ
Oculus Go は VR ができる新しい携帯ゲーム機


root 無しで簡単に Linux を起動できる UserLAndXSDL (X11 Server) との連携に対応しました。SSH, VNC 同様メニューから選べるようになったので試してみました。スマートフォンは ZenFone AR (ZS571KL) Android 7.0 を使っています。

Google Play ストアから UserLAnd をインストール。起動すると Linux Distribution を選択できます。今回の手順は Debian を選択しています。

UserLAnd

Distribution を選択すると共有ストレージへのパーミッションを求めてきますが、これは /sdcard をマウントするため。

ユーザー名とパスワードの設定をします。

UserLAnd

新しく XSDL が選択できるようになっています。

UserLAnd

XServer XSDL をインストールしていない場合はここで Play Store に飛びます。先にインストールしておいた方が良いかもしれません。Bluetooth Keyboard と Bluetooth Mouse も先にペアリングしておくことをお勧めします。

インストールしたらもう一度 UserLAnd から Debian を選択。XSDL が起動し、一瞬切り替わったあと↓この画面で止まったように見えますがそのまま待ってください。

XSDL

暫く待つと起動が終わり、左上に小さいターミナルウィンドウが出ます。止まったように見えたのは背景画像が残ってしまっているため。

XSDL

xterm のウィンドウが小さいのは Native 解像度 (上の例は 2560x1440) で起動しているからです。


● XSDL の解像度変更方法

解像度の変更は XSDL 起動時の下記の画面で、カウントダウン中に画面をタップします。

null

↓選択画面になるので 1280x720 あたりを選択。

null

↓次にフォントスケールの選択。潰れて読めないけど X0.7~X0.4 あたりを選択。いろいろ試して見やすいように調整してください。

null

↓ウィンドウが大きくなりました。

null


● lxde を使う方法

UserLAnd から起動すると twm + xterm の最小限で立ち上がります。Desktop を使うには Script の書き換えが必要でした。

Desktop lxde の install 手順

一旦 SSH でログインしておきます。(Distribution 名長押し→ App Stop → App Info)

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install lxde

下記のファイルを編集します。

/support/startXSDLServer.sh

元の内容
#! /bin/bash

if [[ -z "${DISPLAY}" ]]; then
  DISPLAY=:4721
fi

if [[ -z "${PULSE_SERVER}" ]]; then
  PULSE_SERVER=localhost:4721
fi

if [[ -z "${INITIAL_USERNAME}" ]]; then
  INITIAL_USERNAME="user"
fi

until env DISPLAY=:4721 ; do sleep 1 ; done

nohup twm & echo $! > /tmp/xsdl.pidfile

while [ ! -f /tmp/xsdl.pidfile ]
do
  sleep 1
done

su $INITIAL_USERNAME -c 'xterm -geometry 80x24+0+0 -e /bin/bash --login &'

下記のように書き換える

#! /bin/bash

if [[ -z "${DISPLAY}" ]]; then
  DISPLAY=:4721
fi

if [[ -z "${PULSE_SERVER}" ]]; then
  PULSE_SERVER=localhost:4721
fi

if [[ -z "${INITIAL_USERNAME}" ]]; then
  INITIAL_USERNAME="user"
fi

until env DISPLAY=:4721 ; do sleep 1 ; done

# ここから下を改変
sleep 20

su $INITIAL_USERNAME -c 'startlxde &'
su $INITIAL_USERNAME -c 'xterm -geometry 80x24+0+0 -e /bin/bash --login &'

sleep の部分は適当に調節してください。これで XSDL に切り替えて起動すると、しばらく待ったあとに青い画面から下記のような desktop 画面になります。起動は気長に待ってください。

null

日本語化等の情報はこちらを参照してください。

Hyperでんち: UserLAnd


●いくつかの問題点

・XSDL が Android 9 で動かない。
・lxde 起動には script 書き換えが必要
・Android で物理キーボードのレイアウトに日本語配列を選択していると一部のキーが入力できない

Android 9 Pie では XSDL が restart を繰り返してしまい起動しないので、UserLAnd 上でも選択できないようになっています。


関連ページ
Android の上の開発環境: UserLAnd

関連エントリ
Oculus Go を文章書き&開発マシンにする
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd


VR
oga at 20:21
前回 Oculus Go で UserLAnd を呼び出せるアプリを作ったのですが、せっかくなので何でも呼び出せるように普通のランチャーアプリも作ってみました。Oculus Go 上で様々な Android アプリが動きます。

TVLauncherGo TVLauncherGo

任意の Android アプリを apk で直接 Install するだけで↑のようにランチャー画面にアイコンが並びます。

もちろん前回の TVWrapperUL 同様 UserLAnd や VNC Viewer、Android 設定画面も呼び出せます。(前回の記事はこちら「Oculus Go を文章書き&開発マシンにする」)

↓Firefox

Firefox

↓AnyDesk で Windows 10 にログインしてさらに VMWare で Ubuntu

AnyDesk

↓Kindle も動きましたがテキストタイプの書籍はフォントサイズが大きすぎます。ページを画像データとして持つ雑誌や漫画のような本は大丈夫そう。サイズ調節が難点。

Kindle

Amazon App Store が動きました。ただし事前に提供元不明アプリのインストールを許可しておく必要があります。(詳細はあとで)

Amazon App Store


●TVLauncherGo Install 方法

Oculus TV 上で動くランチャーです。下記からダウンロードした TVLauncherGo の apk を install してください。Oculus TV の中から起動します。

GitHub: TVLauncherGo1.0.apk

例えば adb を使って install するなら

1. Oculus Go を Developer Mode にする
2. Android SDK を install する (adb.exe にパスを通しておく)
3. PC と USB で接続する (必要なら adb ドライバを入れる)
4. adb install で apk をインストールする

adb install TVLauncherGo1.0.apk

TVLauncherGo が入れば、あとは設定画面や内蔵ファイラーが呼び出せるので Oculus Go 本体でアプリインストールもできるようになります。


●使い方

1. Oculus ストアから "Oculus TV" をインストールしておく
2. Oculus TV を起動
3. 画面の下の方にある "TVLauncherGo" を起動する (↓の赤枠)

TVLauncherGo

起動するとインストールされている一般 Android アプリのアイコンが並ぶのでクリックで起動できます。アイコン長押しでアプリの詳細画面に飛ぶのでアンインストールもできます。


●注意点

事前に Bluetooth Keyboard をペアリングしておくことをお勧めします。ペアリングは Oculus TV → TVLauncherGo → 設定 → Bluetooth から行ってください。

TVLauncherGo 経由ではなく、アプリが直接他のアプリを呼び出してしまう場合があります。VR 空間ではなく 2D でアプリやダイアログが表示されると Controller では操作できなくなるので注意が必要です。Keyboard があれば [ESC] や [Enter] キーで脱出できるかもしれません。


●一般の Android Apk をインストールする方法

さまざまな方法が使えます。

・adb で PC 経由で install
・Dropbox などオンラインストレージ経由で転送して、内蔵ファイラーでインストール
・Amazon などストアアプリ経由のインストール

など。

ブラウザで直接ダウンロードできる場合もありますが apk のインストールに関しては自己責任でお願いします。


●adb を使った PC 経由の install

Oculus Go が adb でつながっているなら PC から install するのが簡単です。TVLauncherGo.apk と同じように

adb install  アプリ.apk

でできます。


●オンラインストレージ経由での apk 転送

Dropbox のようなオンラインストレージを経由して apk ファイルを転送することもできます。Dropbox 上で apk を直接開かないようにしてください。ダイアログが 2D 描画されてしまい操作できなくなります。

メニューからエクスポートを使って一旦ローカルストレージに保存します。その後内蔵ファイラーを使ってインストールしてください。


●内蔵ファイラーを使ったインストール方法

Oculus Go 上に転送した apk をインストールするには下記の手順に従ってください。

1. インストールを許可

 Oculus TV → TVLauncherGo → 設定 → セキュリティ → 提供元不明アプリのインストールを許可する

2. 内蔵ファイラーを起動する

 Oculus TV → TVLauncherGo → 設定 → ストレージ → 外部メディア

3. apk のインストール

 ファイラーが起動したら、本体ストレージ(Pacific) を選択します。例えば Download フォルダにあるなら Pacific → Download を開きます。apk file をクリックすると install できます。


●ストアアプリ経由のインストール

Amazon App Store を使ったインストールもできます。ただしいくつか注意が必要です。

インストール許可の設定画面が 2D 描画になるので、必ず先に「TVLauncherGo → 設定 → セキュリティ → 提供元不明アプリのインストールを許可する」で許可しておいてください。

Amazon App Store の「インストールしますか」のダイアログが左右の目で矛盾した描画になりますが操作はできます。片目で操作してください。

インストールしたアプリはストアから直接開かないで、一旦戻って TVLauncherGo から起動してください。


●apk ファイルを入手するには

手持ちの Android スマートフォンから install してある apk file を取り出すことができます。apk を取り出す script を作ってみました。

GitHub: apk_get.py

1. PC に Python 3.x を install しておきます。
2. スマートフォンを Developer Mode にして PC と adb と接続します。
3. python apk_get.py を実行します。

python apk_get.py

これでインストールされているアプリの apk file をすべて取り出すことができます。


●VR 空間での起動と Oculus TV での起動の違いについて

VR 空間で直接 Android アプリを起動してしまうと問題が生じることがあります。一度起動して Activity が残っていると、以後 Oculus TV から呼び出しても VR 空間のままになる場合があるので注意が必要です。

(1) 例えば設定画面の場合、↓が VR 空間に直接描画されている状態です。少々わかりにくいですが周囲が真っ暗で部屋がありません。

VR Space

↑この状態だと一部のダイアログで操作できなくなる場合があります。例えば Bluetooth のペアリング削除画面ではまります。また一部の画面で固まったり落ちたりします。アプリ一覧画面、レイアウト変更画面など。

(2) Oculus Go 起動直後に Oculus TV → TVLauncherGo → 設定 で呼び出すと ↓ のようになります。部屋の中にウィンドウが配置されています。

Oculus TV Space

↑こちらは普通の Android と同じ操作が可能でダイアログも問題が出ません。物理キーボードのレイアウト変更もできました。↓

Layout

もし (1) の状態なってしまった場合は、Activity を完全に終了させるために一旦 Oculus Go を再起動することをお勧めします。電源ボタンの長押しでできます。

また前回の記事で書いたような adb コマンドを使った設定画面呼び出しは確実に (1) の状態になるので注意してください。adb を使った起動はしないで Oculus TV (TVLauncherGo) 経由で設定を呼び出すことを強くお勧めします。

外部のアプリを呼び出すアプリにも注意が必要です。Dropbox や Amazon App Store など、外部アプリや設定画面が呼ばれると Oculus TV を経由せずに直接 VR 空間や 2D 描画されてしまう場合があります。

再起動しても画面が真っ暗で操作できなくなったら、近接センサーが中途半端な状態になっている場合があります。Oculus Go の HMD 内部、中央上部の近接センサーに触れてみてください。


関連エントリ
Oculus Go を文章書き&開発マシンにする
Gear VR のヘッドセットの種類のまとめ
Oculus Go は VR ができる新しい携帯ゲーム機


VR
oga at 20:26
Oculus Go にも Bluetooth Keyboard が接続できて、さらに一般の Android アプリが動くらしいと今更ながら知ったので、先人の知恵をお借りしつつ UserLAnd を動かしてみました。どこでも Oculus Go をかぶって大画面で日本語文章書いたりプログラム書いたりできます。
Remote Desktop ではないので Network がなくても単体で使えます。

Oculus Go UserLAnd Oculus Go UserLAnd
↑ Oculus Go で動く Debian の Desktop。Oculus TV は残念ながら画面キャプチャできないので、Oculus Go を覗いたところを無理やり写真に撮っています。

参考にさせていただいた情報
Oculus Go Tips
KILINBOX: Oculus GoでAndroidアプリを動かす

調べてみたらすでに同じようなことを実践している方もいらっしゃるようです。
Oculus GoでスタンドアロンVR作業環境を作った


● Bluetooth Keyboard が使える

adb 経由で Settings 画面を呼び出せば Bluetooth 設定ができるようです。上の参考にさせていただいた Tips ページで直接 Bluetooth 画面を呼び出す方法が紹介されています。

下記のように設定画面の Top を呼び出すことも可能です。(追記 2019/02/06: この方法ではダイアログが操作できない場合があることがわかったので非推奨です。詳細はこちら)

adb shell am start -a android.intent.action.MAIN -n com.android.settings/.Settings

毎回 PC 上で呼び出すのも大変なので、単独で使えるよう設定画面を呼び出すアプリを作成しました。(後述)


● 一般のアプリが動く

通常の Android apk を Oculus Go にそのまま install しても VR に対応していないためライブラリに表示されません。ところが公式アプリの Oculus TV を起動すると、一部のアプリが下の方に表示されていました。選択すると VR 空間の TV の中で実行できるようです。

特に Termux は何もしなくても表示されており、apk install だけでそのまま使うことができました。↓

Oculus Go Termux

どうやら Oculus TV には Android TV に対応したアプリが表示されるようです。AndroidManifest.xml に LEANBACK_LAUNCER を登録しておけば Oculus Go の上で実行できることになります。

Linux 環境を走らせるアプリ UserLAnd には LEANBACK_LAUNCER が入っていないので Oculus TV から見えませんでした。ダミーアプリを作って Intent で呼び出せば Oculus TV の上で実行できそうです。

こちらで紹介されていた TvAppRepo というアプリがまさにそれで、Android TV 用のダミーアプリを実機上で作ることができます。


● UserLAnd を呼び出すだけのアプリを作る

実際にアプリを作ってみます。AndroidStudio で Android TV 向けの空 Project を作ります。Tempalte で Android TV Activity を選択しておき、Activity 起動直後に UserLAnd を呼び出します。

// MainActivity.java
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.os.Bundle;
import android.content.pm.PackageManager;
import android.content.Intent;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PackageManager manager= getPackageManager();
        Intent it= manager.getLaunchIntentForPackage( "tech.ula" );
        it.addCategory( Intent.CATEGORY_LAUNCHER );
        startActivity( it );
    }
}

これだけでうまくいきました。apk 作ってを Oculus Go に install すると Oculus TV にアイコンが並びます。起動すると Oculus TV の上で UserLAnd が動きました。

Bluetooth Keyboard があれば任意の Linux Distribution を使うことができます。これでテキストエディタ、日本語入力、開発用言語など、様々なものが動きます。

この UserLAnd を呼び出すだけの簡単なアプリをこちらで公開してみました。ついでに Real VNC Viewer と設定画面も呼び出せるようにしています。

GitHub: TVWrapperUL 1.0


● VNC を起動する

LuserLAnd が内部で呼び出している bVNC Free は残念ながら Oculus Go で動きませんでした。VR を無視して全画面表示になってしまいます。代わりに Real VNC Viewer (com.realvnc.viewer.android) が動いたのでこちらを使います。UserLAnd と全く同じように Wrapper アプリで呼び出せるので TVWrapperUL に追加しました。

UserLAnd で動いている tightvncserver の port は 5951 です。VNC Server のアドレスには "127.0.0.1:5951" を指定してください。



● 手順の詳細

(1) Oculus Go を Develoepr mode にして PC と adb で接続します。

(2) TVWrapperUL の apk を Oculus Go に install してください。

adb install TVWrapperUL1.0.apk

(3) Oculus TV から TVWrapperUL を起動。Settings → Bluetooh で Bluetooth Keyboard をペアリングしておきます。

(4) UserLAnd (tech.ula) と RealVNC Viewer (com.realvnc.viewer.android) の APK を adb で Oculus Go に install します

(5) Oculus TV → TVWrapperUL → UserLAnd で起動します。

(6) 任意の Linux Distributon を選択します

 Keyboard を使って Username, password, VNC password を入力。ここでは SSH を選びます

日本語化を行えば、そのまま Console で文章書き環境として利用可能です。

UserLAnd の日本語化や日本語入力環境の解説

↓Ubuntu の Console で日本語入力
null

Desktop (lxde 等) 環境も VNC 経由で使うことができます。



● VNC 接続手順

(1) Oculus TV → TVWrapperUL → UserLAnd

(2) Linux Distributon を選択。User を作って VNC を選択

  すでに SSH で作ってある場合は下記の手順で VNC 切り替えます。

  1. 長押しして Stop App
  2. もう一度長押しして App Info → VNC に切り替え
  3. Distribution 名をクリックすると起動

(3) Client アプリがないと言われるので一旦 OK して、Controller のメニュー(←) ボタンを何度か押して戻る

(4) Oculus TV → TVWrapperUL → RealVNC を選択

(5) 右下の + ボタンを押して New Connection 画面から設定を追加。Address は "127.0.0.1:5951" 名前は任意

(6) (5) で作った設定を選んで CONNECT を押す。User 作成時に決めた VNC Password を入れると繋がります。

Desktop の install 手順、VNC 解像度指定方法などはこちらを参照してください。



● 課題など

Android 設定画面から物理キーボードのレイアウト変更ができませんでした。設定画面が落ちるため。(追記: X11 desktop なら xmodmap による変更は可能) (追記 2019/02/06: Oculus TV + TVLauncherGo から設定を呼び出せばできることがわかりました)

Oculus Go Controller を使ったマウス操作が難しいかもしれません。

Oculus TV 上で起動したアプリは画面キャプチャが禁止されているらしく、画面を保存できなくなっています。ミラーリングも真っ黒な画面です。


(追記 2019/02/06: UserLAnd 以外も呼び出せるランチャーを作りました。詳細はこちら「Oculus Go で一般 Android アプリを起動できるランチャーを作ってみた」)


関連ページ
Android の上の開発環境: UserLAnd

関連エントリ
UserLAnd とブラウザ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd
Gear VR のヘッドセットの種類のまとめ
Oculus Go は VR ができる新しい携帯ゲーム機


Firefox だけでなく Chromium-browser も使えるらしいので使ってみました。ただし --no-sandbox オプションが必要です。(参考にしたページ)

UserLAnd Ubuntu で動く Chromium (Essential Phone PH-1)
null


● Install と起動方法

Debian の場合

$ sudo apt install chromium
$ chromium --no-sandbox

Ubuntu の場合

$ sudo apt install chromium-browser
$ chromium-browser --no-sandbox

2018/01/31 現在、Ubuntu では Firefox が正しく動いておらず起動しても黒い画面のまま固まってしまいます。Chromium が代わりに使えそうです。

Debian では Firefox も問題なく動いています。


● 画面分割

Android 7 以降なら画面分割が可能なので Android のブラウザを併用する方法もあります。

画面分割で Ubuntu と Android の Chrome と併用↓
null

UserLAnd の desktop は VNC でも XServer XSDL (X11) でも Software Rendering なので、速度と安定度を重視するなら画面分割もお勧めです。

Android 9 Pie だと XServer XSDL が restart を繰り返してしまい起動できないようです。Essential Phone と Pixel 3 の両方で確認。VNC は動きます。


関連エントリ
Android 上の開発環境と UserLAnd
OS の中の Linux (WSL/Chrome OS/Android UserLAnd)
ARM CPU 上の開発環境とコンパイル時間の比較 (2) Pixel 3/UserLAnd


<<前のページ(日付が新しい方向) | 次のページ(日付が古い方向)>>