UnityによるOculus Questアプリ開発

Oculus Quest

PC不要の一体型HMDかつトラッカーレス6DoF対応という未来を体感してみたくて、Oculus Questを買ってしまった。

あまりゲームをするタイプではなく、スマブラ目当てで買ったSwitchが1ヶ月で飽きて放置されているので、買うのを躊躇っていたけど好奇心に勝てなかった。 5/1から買うかどうか迷っていて、結局5/15くらいにOculus公式で発注したけど、5/24の夕方に届いた。海外から発送されるのに早い。

早速beat saberやvr chatをやってみたけど、久々に凄い感動した。 HTC ViveとかOculus Riftでもやったことあるけど、全然ユーザ体験が違った。 準備の手間がほとんどかからず、被るだけでVR世界に行けるなんて、完全にレディープレイヤーワンの世界。 もうHMDはこれで良いです。完成。って感じ。

せっかく買ったので、南極に行ってペンギンに囲まれるVRアプリを自分のためだけに作ろうと思います。

Quest アプリ開発とOculus Store

Oculus Questの開発は個人でできないという噂があったのですが、結果から言うと個人でも開発はできます。 Oculus QuestはOculus Goと同じくAndroidベースのOSが搭載されているので、Androidアプリとして書き出すことができる開発環境があればOKです。

個人では難しそうなのは、作ったアプリをOculus Storeで販売すること。 審査を通過しないと販売することができず、その審査基準がかなり高いらしい。 Quest向けアプリはクオリティの高いものから展開していく方針らしいので、2019年5月現在は個人で開発して販売するのは結構ハードルが高そう。

環境

  • Unity 2018.4.0f1 (2018.1.0だと動かなかったので注意)
  • Android Studio 3.1.3

Oculus Quest向けアプリをUnityで作る

Unityプロジェクトの作り方

  • 事前準備として、UnityからAndroidアプリをビルドできるようにAndroid SDKを入れておく必要がある。以前UnityからAndroidアプリを作ったことがある人は不要。

  • Unityを立ち上げて新規プロジェクトを作る。

  • Questに搭載されたセンサによる6DoF移動やOculus Touchに反応させるため、Unity StoreからOculus IntegrationをDownload & Import (Import結構時間かかることが多い) assetstore.unity.com

  • Quest向けにビルドするため、Build Settingsを以下の設定に変える。

    • プラットフォームをAndroidに変更
  • Player Settings から Minimum API Levelを Android 4.4 ‘KitKat’ (API level 19) に変更
    • API Level 19未満にしたらエラーが出たので、おそらく現在はこれで良さそう。
    • f:id:yuki_tkd:20190527100424p:plain
  • Package Namecom.Company.ProductName のCompanyとProductNameを登録した組織名とプロジェクト名に置き換える。
  • AndroidXR SettingsVirtual Reality Supported をチェックして、右下の+ボタンを押してOculusを追加

    • f:id:yuki_tkd:20190527100420p:plain
  • 以上でUnity側の設定は終わりなので、後は適当にUnityでアプリを作る。

アプリのインストール

  • Questの開発者モードをオンにする

    • Oculus Store以外からアプリをインストールするために、開発者モードを有効にする必要がある。
    • Questをセットアップするのに使ったスマートフォンアプリの設定画面で、自分のQuestを選び、詳細な設定から開発者モードをオンにする。
    • このとき、OculusアカウントのDeveloper登録をしておかないと開発者モードを有効にできないので、未登録の場合はこちらから登録する必要がある。
  • USBケーブルでPCと接続する

  • PCと接続すると、Questの画面内にこのPCにファイルアクセスを許可しますか? みたいな感じのアラート画面が出るので Yes を選択

  • UnityからBuild & RunAndroidアプリとしてビルド&書き込み

  • Questの画面内に このPCからアプリのインストールを許可しますか?みたいな感じのアラート画面が出るので Yesを選択

  • Questの Home -> Library ->Unknown sources の一覧からインストールしたアプリを選んで起動できる。

以上で、Oculus Quest上で動くアプリを作ることができます。

今回は簡単なアプリなので問題ないけど、FPSを稼ごうとすると結構テクニックが必要そう。 周辺視野部分を荒くレンダリングするFoveated Rendering(中心窩レンダリング)や、左右の視差映像を1枚のフレームとしてレンダリングする手法などを使って、 CPU/GPUのリソースをなるべく減らす必要がありそうでした。

RealSense D435でKinect Fusionする

経緯

RealSenseのDepthセンサーを使ってSLAMをしたい。 簡単なのはROSを使うことらしい。 ただ、ROSを使ったことが無いというのと将来的にUnityにリアルタイムでそのモデルを持っていきたいので、Unityに繋ぎやすい方法で実装したかった。 そこで、将来的にNative PluginとしてUnityに繋ぐことを想定して、最近OpenCVに実装された kinfu (Kinect FusionのOpenCVコミュニティ版実装)を動かしてみることにした。 そして、このブログをもうちょっと技術的なブログにしていこうと思って書いた。

環境

大事なこと

  • ビルド済のRealSense SDKは64bitでビルドされているので、OpenCVも64bitでビルドする必要がある

やったこと

  • OpenCVOpenCV-contribをgit clone
  • それぞれ4.1.0としてcheckout
  • OpenCVディレクトリの下に build というディレクトリを作る
  • cmake(gui)を開いて、opencvディレクトリとopencv/buildのディレクトリを開く
  • 以下の設定を変更する

    • OPENCV_ENABLE_NONFREE (チェックを入れる)
    • OPENCV_EXTRA_MODULES_PATH (opencv-contrib/modules へのパスを入れる)
    • WITH_OPENCL (チェックを入れる)
    • WITH_LIBREALSENSE (チェックを入れる)
    • LIBREALSENSE_INCLUDE_DIR (Add EntityからDirecotry Pathとして、C:/Program Files (x86)/Intel RealSense SDK 2.0/include を入れる)
    • LIBREALSENSE_LIBRARIES (Add EntryからFile Pathとして、C:/Program Files (x86)/Intel RealSense SDK 2.0/lib/x64/realsense2.lib を入れる) x86もあるけど、x64選ぶこと。
  • configureする

  • open projectする
  • ALL_BUILDを右クリックしてBuild (時間かかる)
  • INSTALLを右クリックしてビルド
  • opencv/build/install 以下にヘッダファイルやビルド済みlibなどができるので、opencv/build/installディレクトリを適当な場所と名前でコピー (例えば C:/opencv-410/)
  • 環境変数opencv-410/x64/vc15/bin/ を追加
  • Visual StduioのC++のインクルードパスと、ライブラリパスに、opencv-410/x64/vc15/libopencv-410/include を追加
  • opencv-worldではなく、coreやhighguiなどがバラバラのlibとしてビルドされるので、それらすべてをVisual Studioのリンカが見に行けるように登録する
  • OpenCVのビルド & 設定完了

実行

  • サンプルプロジェクトを作って実行したときに、librealsense2.dllが見つからないというランタイムエラーが発生したら、RealSense SDKの中からlibrealsense2.dllを探してきてプロジェクトのディレクトリにコピーする (RealSense SDKへのパスが通っていたらおそらく不要?)

参考にさせて頂いた記事

ほとんどここの通りなのだけれど、ビルド済みRealSense SDKが64bitとは知らず32bitでOpenCVをビルドして手間取ってしまった。 qiita.com

いろんなものが壊れまくってる

身の回りのものが壊れまくって、新年度からのやる気が消滅してしまった

  • 研究に使っていた機械学習用のマシンのSSDが突然死
  • シャーペンが壊れた
  • FDM方式3Dプリンタのフィーダーが壊れた
  • SLA方式3Dプリンタの印刷中にレジンが切れた
  • 10年に1回しか切れないはずの自宅の煙感知器の電池が切れた

厄年なので厄払いに行くべきか... この調子だと全データ入ってる個人用のHDDも壊れそうな気がしたので、予備のHDD買った

mbedをシステムに組み込む話

LPCXpresso LPC1769をmbed化して使っているのだけれど、大きさの都合からLPC-Link部分を切り離して使いたいので、その場合にどうやって書き込んだら良いのかを調べてみた。 また、今度プリント基板を発注してマイコンを直接実装する運びになりそうなので、mbedをシステムに組み込むときはどうしたら良いかも調べた。

mbedの仕組み

LPCXpressoや青mbedなどは、PCに繋ぐと外部ストレージとしてマウントされ、そこにbinファイルを置くだけで書き込める。 これはArduinoのようにブートローダーが起動して、binファイルを受け付けるようになっていると思っていたのだけれど違った。

青mbedの裏にはmbed HDKと呼ばれるデバッガ回路がついており、これがメインのマイコンファームウェアを書き込んでいるらしい。 mbedをPCに繋ぐと、mbed HDKによって外部ストレージとしてマウントされ、そこにbinファイルを置くと、 mbed HDKがメインのマイコンであるLPC1768に対してISPで書き込むという構成になっているようだ。

したがって、ARMマイコンだけをシステムに組み込みたい場合は、mbed HDKに相当するような外付けのライターが必要となる。

書き込み方法

外付けのライター/デバッガから書き込む方法は以下の2種類があるようだ。

  • ISP書き込み
  • SWD書き込み

ISP書き込み

1つ目は、ISP (In-System Programming)を使って書き込む方法。こちらのほうが手軽そう。 LPCのマイコン(他のARMマイコンにも?)には、特定のシリアルポートを使ってバイナリ書き込む方法がマイコン自体に備わっている。 試してないけれど、LPC + ISPとかで検索すると結線方法が出てくるのでその通りに結線したら書き込めるはず。 FT232等のUSB-Serial変換アダプタを使ってマイコンに書き込むなら、 FlashMagic というソフトを使えばよく、 青mbedをライターとして使ってマイコンに書き込むなら イカ醤油ぽっぽ焼きというソフトを使えば良いらしい。

SWD書き込み

2つ目は、ARMマイコンデバッグするためのSWDを使って書き込む方法。 SWDは物理的な結線方法らしく、実際のプロトコルはCMSIS-DAPとかJ-Linkとか色々あるらしい...? (良く分かってない)

CMSIS-DAPというのがARMの統一規格らしく、これをサポートしてるデバッガやマイコンが多いので、とりあえずはこれを使ったら良さそう。

LPCのマイコンに対して書き込んだりデバッグしたりするなら、LPC-Link2というデバッガが秋月で2800円で買えるのでお買い得。 LPC-Link Configuration Toolsというのを使ってLPC-Link2のファームウェアを書き変えると、CMSIS-DAPデバッガとして使ったり、J-Linkデバッガとして使うことが出来る。 これで2800円は安くない...?

J-Linkデバッガとして使うときはLPCマイコン限定っていう縛りがライセンス的にあった気がするけど、CMSIS-DAPデバッガとして使うときは他のメーカーのマイコンでも良いのかな...? 今回はLPC1768と1769なので、どちらにせよ大丈夫だけど。

KeilとかのIDEデバッグ時に書き込んでも良いけど、単にバイナリの書き込みだけしたいときは CoFlashというソフトを使うと良い。 CMSIS-DAPをサポートしてるので、LPC-Link2をCMSIS-DAPデバッガ化しておくと使える。 ただ、CoFlashを作っているCoocox社のサイトに全然繋がらないので、別の所からダウンロードするのが良さそうでした。 https://www.wyzbee.com/documentation/developers-guide/flash-the-application-to-wyzbee/

ちなみに、CoFlashで検索すると検索上位にSourceforgeのVer 1.3.6のものがあるのだけど、これだとCMSIS-DAPをサポートしてなかった。 上記のリンクだとVer 1.4.9がダウンロードできて、これだとサポートしてるのでこちらを使うべし。

LPCXpresso LPC1769をSWDで書き込む

LPC-Link2のJ7 (Target SWD/JTAG)とXpressoのJ1を接続する。Xpresso側はどちら向きでも刺さってしまうけど、矢印の1pin方向を合わせる必要がある。 あとはCoFlashでLPC1769を選んで書き込む。 f:id:yuki_tkd:20180916222339j:plain

参考URL

Prototype to hardware | Mbed

Android版LINEアプリの追記

yuki-tkd.hateblo.jp

前回のAndroid版LINEアプリの記事に対するアクセスがとても多いので、最近の状況についてメモしておきます

問題

  • [LINE]が繰り返し停止しています。
  • トーク画面での文字入力が重い

対処法

[LINE]が繰り返し停止しています。

僕の端末(Xperia XZ)だと、Androidバージョンが7から8にアップデートしたところ、 「[LINE]が繰り返し停止しています」の文字が出なくなりました。 (バックグラウンドアプリのメモリ解放方法が変わった?) もし上記エラーで困っている方は、OSのアップデートをされると改善されるかもしれません。

トーク画面での文字入力が重い

トーク画面での文字入力が異様に遅い場合、Bluetoothをオフにすると改善する場合があります。 (Bluetoothによる位置情報測位をバックグラウンドで動かしてる?)

この現象が発生したとき、LINEアプリに対するBluetoothの権限を無くしても重いままで、Bluetooth自体をオフにすると改善されます。 なので、直接LINEアプリの問題では無いのかもしれないのですが、動作が改善されることが多いので、この症状でお困りの方は試してみてください。

Andorid版LINEで「[LINE]が繰り返し停止しています」が出るときの対処法

2018/5/22 最近の状況こちらに書きました。 yuki-tkd.hateblo.jp

Xperia XZをAndroid 7.0にアップデートした夏あたりからLINEがよく落ちるようになった。 LINEを開いたあとに別のアプリを立ち上げると8割くらいの割合で、 「LINEが停止しました」というメッセージが出たり、何度も繰り返すと「[LINE]が繰り返し停止しています」が出てしまう。

f:id:yuki_tkd:20171025233847p:plain:w300

ぐぐってもあんまり出てこないので僕だけかと思ったけど、Twitterで調べたら同じような症状の人が居たのでどうやって対処したかを公開しておく。

変更すべき設定は以下の2つ

  • (Xperiaユーザのみ) スマートクリーナーの対象外アプリにLINEを追加する
  • 省電力機能Dozeの対象外アプリにLINEを追加する

1. (Xperiaユーザのみ)スマートクリーナーの対象外アプリにLINEを追加する

Xperiaにはスマートクリーナーという自動でメモリを開放してくれるアプリがついてくるのだが、 これが原因でバックグラウンドに回ったLINEのプロセスを止めていそう。 スマートクリーナーが働かないようにLINEを対象外アプリに追加する。

設定からストレージとメモリを選び f:id:yuki_tkd:20171025233916p:plain:w400

高度な設定を選ぶ

f:id:yuki_tkd:20171025233935p:plain:w400 f:id:yuki_tkd:20171025233936p:plain:w400

キャッシュを保持を選び、

f:id:yuki_tkd:20171025233937p:plain:w400

アプリタブでLINEを選択する。

f:id:yuki_tkd:20171025233938p:plain:w400

これによって、スマートクリーナーがLINEのプロセスを殺すことが無くなる。

2. Dozeの対象外アプリにLINEを設定する

1の設定により頻度は下がったものの、やっぱりLINEが落ちるのでもう少し調べたところ、 Android 7から搭載された省電力機能Dozeが悪そうだということが分かった。 そこで、Dozeの対象外アプリにLINEを追加する。

設定からバッテリーを選び、

f:id:yuki_tkd:20171025233939p:plain:w400

電池の最適化を選ぶ

f:id:yuki_tkd:20171025233940p:plain:w400 f:id:yuki_tkd:20171025233941p:plain:w400

アプリタブから、LINEを選び、チェックを付ける。

f:id:yuki_tkd:20171025233942p:plain:w400

これにより、Dozeによる電池の最適化からLINEが外れる。

そして、最後にAndroidを再起動させてください

少なくとも僕はこの2つを設定したことにより快適なLINE生活が帰ってきたので、お困りの方はお試しください。

Xperia XZを買いました

f:id:yuki_tkd:20170710100203j:plain

Nexus 5Xがダメになったので、新しい端末を探すことに。 ただ、 希望のスペックを満たすものが中々見つからず、結構苦労した。

  • Android搭載 (自分で作ったアプリ動かしたい)
  • なるべく素のAndroid (標準UIが好み)
  • IIJmioが使える (SIMフリーでドコモのバンドに合うもの or ドコモ機種)
  • なるべくカメラの画質は良いやつ (カメラ持ち歩かないので)
  • (出来れば)おサイフケータイ搭載

基本的にブラウザとSNSのために使っていて、スマホゲームするわけではないので、ハイエンドCPUとか大量のメモリとかは別に無くても良かった。 おサイフケータイは結構欲しいのだけれど、おサイフケータイ搭載 = 一部例外を覗いてほぼキャリア機種に限定される という点で、半分諦めていた。

この条件で探したところこの辺りが良さそうだった。 * Huawei P10 * NuAns Neo Reloaded * Xperia XZ (SO-01J)

Huawei P10はカメラがめちゃめちゃキレイで、もはやコンデジ要らんやんってくらい綺麗だったのだけど、 Androidに謎UIが搭載されていて、慣れるのが大変そうで辞めた。

NuAns Neo Reloadedは、SIMフリー機種なのにおサイフケータイ搭載してるし、素のAndroid搭載してるし、今後のアップデートも期待できそうだったのだが、 カメラの画質が良くないところと、デザインが人を選ぶ感じのデザインで、僕はあまり好みではなかった…

Xperia XZ(SO-01J)はカメラの画質もよく、おサイフケータイ搭載。 しかも、XZsの影響でXZの中古は5万円程度まで値段が下がっているという点も良かった。 ただ、SIMロックは掛かっている。6ヶ月以上経てば出来るのかと思っていたけれど、中古で購入した人はダメで、機種購入時の契約者じゃないと解除してもらえないらしい。 海外版SIMフリーXperia XZ, XZsはSIMフリーだけど技適通ってない。

結局、この中から一番バランスが取れていたXperia XZにすることにした。 SIMフリーが良かったけど、そんなに頻繁に海外に行くわけでもないし、もし行くとなったときはSIMフリーのモバイルWiFi買えば良いかな。

Xperia Z -> Xperia Z3 -> Nexus 5Xとスマホを持ってきたけど、結局Xperiaシリーズに出戻りすることになったな。