littlewing

人間とコンピューターとメディアの接点をデザインするために考えたこと

【Unity 2018.2の新機能】デスクトップのUWPアプリからHolographic Remotingを呼び出す。(サンプルコード付き)

f:id:pigshape:20180609210102p:plain

Unity 2018.2の新機能である、 「Windows 10PC用のUWPアプリからHolographic Remoting を呼び出す」 を試して、無事に動作させる事ができました。

個人的にずっと待っていた機能です。

PCの高速な処理能力と 64bitのライブラリを利用したHoloLensアプリケーションの開発が可能となりました。

けどUWPです。

元のUnityのブログはこちら blogs.unity3d.com

Holographic Remotingについてはこちら。 (古い記事ですが、この一年でそんなに変化無いです)

littlewing.hatenablog.com

何ができるのか?

  • PC上でアプリの実行・レンダリングを行い、その内容をHoloLensで表示します。
  • 当然、HoloLensの動き・向きに追随して映像は変化します。
  • これまでも、UnityEditorの機能としては存在していたのですが、主にデバッグ用途だったのですが、これがビルド済みアプリからも呼び出せるようになりました。
  • 64bitビルドで動くので、アプリケーションはx86ではなく、64bit用として開発できます。(これが地味にうれしい)
  • PCとHoloを連携させたアプリが作りやすくなりそう。

動作デモ動画と解説

PC上のUWPアプリとしてCubeが回転しているだけのサンプルアプリを動かします。 左上にIPアドレス入力欄とConnect/Disconnectのボタンがついています。

f:id:pigshape:20180609204839p:plain

HoloLensではHolographic Remoting Playerを起動し、 PCアプリケーションにそのIPを入力して「Connect」を押すと、HoloLens上にCubeが回転する映像が表示されます。 「Disconnect」でHoloLensへの映像出力は停止します。

動いている様子を動画で撮影しました。

youtu.be


開発環境とサンプルコード

Unity Blogにあるように、Unity2018.2.b7を利用しました。

BuildSettingsに「Enable Mixed Reality Remoting」というcheckboxが追加されています。

f:id:pigshape:20180609205459p:plain

そしてHoloLensで動くようなSceneを作成します。 今回はMRTKは使わず、

  • Cameraの位置は(0,0,0)。背景黒・Near Clip 0.1
  • 1.5メートル先に scale0.2のCubeを設置。Constant Forceで回転

という簡単なシーンを作成しました。

その後、空のGameObjectを作成し、以下のRemoteExample.csを作成してattachします。

gist.github.com

で、上の図にあるようなUWP用のBuildSettingsでビルドしてVusialStudioのソリューションを生成します。

このコードはUnityのDocumentにあったコードを少しいじっただけです。

これを64bitアプリケーションとして「ローカルコンピューター」で実行しました。 f:id:pigshape:20180609211246p:plain

ハマったこと

最初動かなくて、困ったのですが、 以下の対応をしていたら動くようになりました。 実際の原因がはっきりわかってないのが情けないですが、、、

  1. PCにHoloLensのエミュレーターが入っていなかったのでインストールしました。

    • Unityブログのそのような記載があったため、
    • VSでの実行時に、Microsoft.Perception.Simulation.DLLが64bitじゃないという警告が出ていたから。(結局これは消えませんでした)
    • HoloLensのエミュレーターのインストール・再起動後、Unityのtoolbar のWindowのメニュー構成が変わりました。Holographic EmulationがXRの中に。気のせい? f:id:pigshape:20180609212158p:plain
  2. PlayerSettingsのCapabilitySettingsに全部チェックを入れた。ガバガバですみません。(どれが有効だったのか、今の所わかってません。)


動作の安定性は Unity Editor上のHolographic Emulationと同じくらいかな。

また、今までもそうでしたが、音声周りやカメラ周りの挙動は異なります。

Known Limitations Speech (PhraseRecognizer) isn’t currently supported via Holographic Remoting and instead intercepts speech from the Editor-hosted machine.

PhotoCapture can be performed during Holographic Simulation, but since the capture works via a local camera (such as a webcam), you won’t be able to retrieve a matrix with TryGetProjectionMatrix or TryGetCameraToWorldMatrix.

During Remoting, all audio on the hosted PC (not just that from the app) will redirect to the device. (Unity blogより引用)

ただ、今までのUnity Editor上でのRemoting はUWPではなく、Windows StandAloneのコードが動いていたのですが、UWPビルド後なので、当然UWPのコードが動きます。ここは違いがありますね。


終わりに

待ちに待った機能です。やったー

PCの高速GPU処理や64bitライブラリの恩恵を受けられるアプリケーションをいろいろ試してみたいと思います。


M5GOのfirmwareをM5Stack用に書き換える(+戻し方)

M5Stack の別バージョンであるM5GOが届いたので遊んでみました。

ただ、そのままの状態だとネット上のM5Stack関連リソースがそのまま使えなかったり、 なんとなく怪しい挙動が多かったので、FirmwareをM5Stack用に切り替えたり、 M5GOの最新版のfirmwareを入れてみたのでその手順をメモ。

firmwareの書き換え方がわかると、リセットしたい時や バージョンアップにも自分で対応できるので安心です。

基本Windows10の話です。

f:id:pigshape:20180521150250p:plain


事前準備

  1. USBドライバのインストール

    • M5GOをPCにUSB接続しただけでは正常にドライバが入らなかったので、M5StackのサイトからUSBドライバをインストールしました。
    • m5stack.comのページ上部のDownloadメニューからダウンロードできます。
    • f:id:pigshape:20180521151028p:plain
  2. Espressif Flash Download Toolsのダウンロード

    • firmwareの書き込みには、Espressif Flash Download Toolsを利用しました。
    • ここからダウンロードできます。Espressif Flash Download Tools
    • 解凍して、ESPFlashDownloadTool_v3.6.4.exeを起動し、ESP32 DownloadTool を選択します。

M5Stackのfirmwareを入れる

M5GOにM5Stackを入れる場合は、githubからM5stack用のfirmwareを入手します。

今回は、ここから、m5cloud-20180516-v0.4.0.binを入手しました。

M5Cloud/firmwares at master · m5stack/M5Cloud · GitHub

ダウンロード出来たら、Espressif Flash Download Toolsに以下のように登録します。 f:id:pigshape:20180521151950p:plain

COMポートはCOM3になっていますが、環境によりますのでWindows のデバイスマネージャで調べて適宜変更してください。

そして、M5GOをUSBでPCに接続し、最初にERASEをして完了してから STARTを押してFirmwareを書き換えます。

これで環境。M5Cloudが使えるようになります。

M5GOのfirmwareに戻す

M5GOのfirmwareも同様に github上にあります。M5GOの場合は、イメージファイルも同時に書き込む必要がありました。

ここから、最新版の M5GO/firmware at master · m5stack/M5GO · GitHub

  • firmware.bin
  • spiffs_image.img

をダウンロードして それぞれ書き込み位置を@0x1000 @0x1b000としてアップロードします。

f:id:pigshape:20180521145934p:plain

これで元の状態に戻りました。


試しにM5Cloud上からmicropythonを使ってデジタル時計を組み込んでみた。

github上のサンプルだと中国時間になってしまうので、JSTに変更しただけ

Digital Clock on M5stack JST

gist.github.com


Lego Crazy Action Contraptions

Lego Crazy Action Contraptions

gitでよく使うけど忘れるやつ

  • ファイルを指定して、そのファイルを特定のcommitまで戻す
git checkout {戻したいcommmitID} {相対ファイル名}
  • 直前のコミット操作を取り消す
git reset --soft HEAD^
  • 最新から、<commit>までの差分をarchive zip化
git archive --format=zip --prefix=<ProjectName>/ HEAD  `git diff --name-only <commit>`  -o archive.zip
  • remote のbranchを削除
$ git push --delete origin {branch_name}
  • local に新規branch作成
#一覧を取得
git branch -a
 
#作成元のbranchに移動
git checkout {master} 

#新しいbranchを作成
git checkout -b {new_branch}
  • 特定のコミット間の対象フォルダを指定して変更ファイル名の一覧を取得する
 git diff --stat --name-only --relative=<対象フォルダ> <commitID1> <commitID2>

git rm -r --cached .
git add .
git commit
git push
  • SJISファイルのdiff をサクッと見たい
 git diff | iconv -f SJIS
  • master の更新を hogebranchに取り込む
※ もし、作業途中のものでcommit出来るものがあればcommitしておく
# masterブランチへ移動
git checkout master

# git pullでmasterを最新に
git pull origin master
# 開発用ブランチへ移動
git checkout hogebranch
# mergeコマンドでmaserの内容を取り込む
git merge origin master

Submodule

  • submoduleを消す
git submodule deinit path/to/submodule
 git rm path/to/submodule
  • 強制的にsubmoduleのmaster branchを反映させる
git submodule foreach git pull origin master

UWPのTextBoxでEnterキーでVirtual keyboardを閉じる

UWPの2DビューでIPアドレスなど一行だけ入力したときにEnterで、キーボードを閉じるには自前で以下のような実装をしないといけません。

こんな感じ

hoge.xaml

  • XAML側でKeyDownイベントを取得する
  • この場合は自作のOnKeyDownHandlerを呼び出しています
<TextBox x:Name="hoge" KeyDown="OnKeyDownHandler" HorizontalAlignment="Left" Margin="166,112,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="189" InputScope="AlphanumericHalfWidth"  />

hoge.xaml.cs

  • OnKeyDownHandlerでEnterを検知してキーボードを閉じる
  • using Windows.System;が必要です。
private void OnKeyDownHandler(object sender, KeyRoutedEventArgs e)
{
        if (e.Key == VirtualKey.Enter)
        {
                Windows.UI.ViewManagement.InputPane.GetForCurrentView().TryHide();
        }
}

カメラキャリブレーションの用語の覚書

なんとなくやっていたカメラキャリブレーションについて 用語の定義など改めて調べてみた。

文末の「参考」にある opencvのドキュメントなどが詳しいのだが 用語がわからないと、理解が進まないので、自分が理解するためのメモ。

https://pbs.twimg.com/media/DL20xKTV4AEv4TP.png

画像引用元


Distortion Coefficients (レンズ歪みパラメータ )

  • 放射状歪み と 接線歪みを補正するパラメータ
  • [1 x 4] もしくは [1 x 5] の行列として表現される

  • 放射状歪み(Radial Distortion) は直線が曲線になるような歪み

    • 画像中心から離れれば離れるほど歪みは大きくなる。
    • k1 , k2, k3として表されることが一般的。
  • 接線歪み(Tangential Distortion)は,レンズと画像平面が完璧に平行になっていないことが原因で生じる歪み。

    • ある領域が期待しているよりも近くにあるように見えてしまう。
    • p1 , p2として表されることが一般的。
  • opencvの行列表現では

 Distortion\ Coefficients  =  \begin{pmatrix} k_1&k_2&p_1&p_2&k_3 \end{pmatrix}

として表現される。※k3が省略の場合もあり


Intrinsic Parameters (内部パラメータ) 

  • カメラ固有のパラメータ。カメラ行列とも呼ばれる
  • 同じカメラで同じ設定であれば常に同じ
  • [3 x 3] の行列として表現される
  • 焦点距離
    • Focal Length = (fx , fy ) (単位はピクセル)
  • 光学中心(主点)
    • Principal Point = (cx , cy ) (単位はピクセル)

 Intrinsic\ Parameters  =  \begin{pmatrix} f_x&0&c_x \\ 0&f_y&c_y \\ 0&0&1 \end{pmatrix}


Extrinsic Parameters (外部パラメータ)

  • ある座標系における3次元点の座標を別の座標系での座標に変換するための回転と並進のパラメータを指します.
  • マーカーとカメラ間の位置関係などを設定します。
  • [3 x 4] の行列として表現される

 Extrinsic\ Parameters =  \begin{pmatrix} R_{11}& R_{12}& R_{13}& t_x \\ R_{21}&R_{22}&R_{23}&t_y \\ R_{31}&R_{32}&R_{33}&t_z \end{pmatrix}  \\R:回転行列\\t:並進ベクトル


GML C++ Camera Calibration Toolbox 便利

最近は、GML C++ Camera Calibration Toolboxを使ってキャリブレーションデータを作成しています。 また、マーカーはiPadに表示すると、発光するし、歪みも発生しないし便利。


参考

imura-lab.org

HoloLens のDevice Portalにlocalhostで接続するには、Windows SDKが必要

HoloLens のDevice Portalにhttp://localhost:10080 もしくは、http://127.0.0.1:10080/で接続するには、Windows SDKが必要。

良く見たらドキュメントにも書いてあった。

PC に Visual Studio Update 1 と Windows 10 開発者ツールをインストールします。 これで USB 接続が有効になります。

Windows SDKは、全部入れると数ギガになるのだが、 試したところ、USB接続を利用するだけなら「Windows IP over USB」が入っていれば、DevicePortalは利用できた。 これだけなら、1M以下で済む。

f:id:pigshape:20180129162153p:plain

知らなくて、非開発用PCを利用した場合にはまったのでメモ。

Unityで利用する c++ のDLLを作成する。(Visual Studio 2017)

基本的に、以下のページにある手順で進めればNative Plugin を作成できるのですが 解説が、VS2013ベースになっているので、Visuai Studio 2017で実施した場合に ハマッた部分を、忘れないうちにスクショ付きでまとめました。

部分的にしか解説してないので、全体は以下のページを参照してください。

qiita.com

でやりました。


DLLビルド用のVSプロジェクトの準備

  1. 既存のソリューションに、DLL作成用のプロジェクトを追加する場合はこんな感じでスタート

2018/8/17追記 VS2017 update 3 ではこの部分がまた変更になっています。 * Visual Studio 2017 Update 3 以降で Win32 プロジェクトが作成できなくなった時の対処法 - Qiita

f:id:pigshape:20180118122930p:plain

  1. DLLを作るのですが、この画面では、「c++ のWin32コンソールアプリケーション」を選択。 f:id:pigshape:20180118123005p:plain

  2. 次に表示されるこの画面で「アプリケーション設定」をクリックして、DLLを選択します。 シンボルのエクスポートも忘れないように。 f:id:pigshape:20180118123057p:plain

  3. Unityに出力するなら「SDLのチェック」は外さないといけないらしいです。

f:id:pigshape:20180118133326p:plain


で、コードを書く。ここは省略します。


exe形式で実行テスト

同一ソリューション内で、テストのためのexe用プロジェクトを作成したのであれば、 「参照の追加」を行うのが、手っ取り早いです。

f:id:pigshape:20180118131611p:plain

ただし、既存の外部DLLやlibを使う場合はこれではダメです。 そのような場合は、以下の3つを設定します。

  1. c++  > 全般 > 追加のインクルードディレクトリ include/フォルダを指定し、その中に.hファイルを置く f:id:pigshape:20180118131154p:plain

  2. リンカ >全般>追加のライブラリディレクトリ libフォルダを指定 f:id:pigshape:20180118131322p:plain

  3. リンカ >入力 >追加の依存ファイル libファイルを指定 f:id:pigshape:20180118131345p:plain


作成したDLLをUnity上で実行する

Unityからは

[DllImport("sample-opencv-dll")] private static extern int CountUp();
            Debug.Log(CountUp());
            Debug.Log(CountUp());
            Debug.Log(CountUp());

のような感じで呼びだすことができます。 「DllImport」にファイル名を書くときは拡張子 (.dll)を含めるとエラーになるので含めません。


libで追加ライブラリを指定した場合は、そのdllもPlugins内に配置しておかないと、

Plugins: Failed to load 'Assets/Plugins/x86_64/xxxxxxxx.dll' with error '指定されたモジュールが見つかりません。
'.

という警告や

DllNotFoundException: Failure has occurred while loading a type.

という例外エラーが発生するので、関連DLLの配置もお忘れなく。


おまけ 既存DLL ( or lib ) の中身を解析する方法

スタートメニューから[開発者コマンド プロンプト for VS2015]を起動する

  • DLLのインターフェースを確認する
cd (DLLの場所)
dumpbin  /exports xxxxx.dll
  • dllが32bitか64bitか確認する。
dumpbin   /HEADERS xxxxx.dll | findstr machine

Visual Studio 2017のみでdumpbin を使う。(追記2018.12.28)

[開発者コマンド プロンプト for VS2015]は、Visual Studio 2017 のみインストールしていると、スタートメニューに表示されない。

利用するにはコマンドから起動する必要がある。

Win +R を押して

cmd /k "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\tools\VsDevCmd.bat"

で起動できる。 ちなみに、dumpbin.exe自体は

この辺りにある。

参考: If you have Visual Studio 2017 installed then you can use dumpbin to dump the PE... | Hacker News