Unlit Sphere

Let’s discover a new world with Unity

【Unity】MirageSoloアプリ開発 2019edition - コントローラー入力

OverView

GVR SDK 2019年版におけるコントローラーのクリックイベント受取り

Environment

Windows10 64bit

Unity2018.2.14f1

Google VR SDK - GVR SDK for Unity v1.190.1 (2019-01-16)

Lenovo Mirage Solo - Android 8.0.0

Method

f:id:nagatsukimxi:20190317001409p:plain

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ControllerInput : MonoBehaviour {

    private static readonly GvrControllerHand[] AllHands =
    {
            GvrControllerHand.Right,
            GvrControllerHand.Left,
    };

    void Update () {
        foreach (var hand in AllHands)
        {
            GvrControllerInputDevice device = GvrControllerInput.GetDevice(hand);
            if (device.GetButtonDown(GvrControllerButton.TouchPadTouch))
            {
                Debug.Log("touch");  //(1)がタッチされたとき
            }

            if (device.GetButtonDown(GvrControllerButton.TouchPadButton))
            {
                Debug.Log("button"); //(1)が押されたとき
            }

            if (device.GetButtonDown(GvrControllerButton.App))
            {
                Debug.Log("app"); //(2)が押されたとき
            }
        }
    }
}

コントローラーの画像は  Daydream View のハードウェア - Daydream ヘルプ から拝借した.

【Unity】MirageSoloアプリ開発をはじめる2019edition - 6dof対応とコントローラー表示

Overview

最近のGoogle VR SDKを用いてMirageSoloのアプリ開発を行うやりかたとかです.

現在はなにもないところからコントローラーの表示と6dofに対応させる部分まで書いてあります.

Environment

Windows10 64bit

Unity2018.2.14f1

Google VR SDK - GVR SDK for Unity v1.190.1 (2019-01-16)

Lenovo Mirage Solo - Android 8.0.0

Method

0. 環境構築

UnityでAndroidアプリ開発を行えるレベルの環境構築は行っておく.

1. Google VR SDKのインポート

Google VR SDK - GVR SDK for UnityをGitHubのReleaseからDLしてきてインポートします.

配布はunitypackageで行われてます.

https://github.com/googlevr/gvr-unity-sdk/releases

2. 新規シーンを開く

新規シーンを開き,初めからあるMainCameraとDirectionalLightを削除する.

3. SDKからPrefabのインスタンスを作る

・GvrEventSystem (Assets/GoogleVR/Prefabs/EventSystem/GvrEventSystem.prefab)

・GvrHeadet (Assets/GoogleVR/Prefabs/Headset/GvrHeadset.prefab)

・GvrControllerMain (Assets/GoogleVR/Prefabs/Controller/GvrControllerMain.prefab)

f:id:nagatsukimxi:20190303123130p:plain

4. Create EmptyGameObject and MainCamera

Playerという名の空のゲームオブジェクトを作成し,中にMainCameraを作成する.

MainCameraにはGvrPointerPhysicsRaycasterコンポーネントを追加する.

GvrPointerGraphicRaycasterではないので注意.

MainCameraコンポーネントのClipping PlanesのNearの値を0.01に設定する.これをしないと近いものが描画されない,つまりコントローラーが見えん.

また適当にPlayerオブジェクトのtransform.position.yを1.6などに設定する.身長分(m).

5. 各GameObject内にPrefabのインスタンスを作る

MainCameraの子に GvrReticlePointer (Assets/GoogleVR/Prefabs/Cardboad/GvrReticlePointer.prefab)

を作成する.これを使うとレティクル(見ている方向の中央点)が表示されるが,必要ない場合は無効化,または追加しなくて良い.

Playerオブジェクトの子には

GvrControllerPointer (Assets/GoogleVR/Prefabs/Controller/GvrControllerPointer.prefab)

インスタンスを作る.

最終的にこの時点ではこうなる.

f:id:nagatsukimxi:20190303123145p:plain

この時点で6dofに対応し,コントローラーの表示ができているはず.

【YOLOv3】オリジナルの学習済みモデルを作成する

OverView

画像から手の位置を認識をさせたかったんじゃぁ.

お.いい高速な画像認識アルゴリズムがある.つかってみるか...

f:id:nagatsukimxi:20190228105652p:plain

ということで,YOLOv3で自分で作成したデータを学習させる方法

つまりオリジナルの学習済みモデルの作り方を書き残します.

YOLOはYou Only Look Onceの略,物体検出アルゴリズム

darknetはC/CUDAで開発されたOSSニューラルネットフレームワーク

Environment

macOS Mojave version.10.14.3

Python 3.7.2

Method

1. darknetをmake & Install

https://github.com/pjreddie/darknet からdarknetをcloneする

git clone https://github.com/pjreddie/darknet
cd darknet
make

makeをする前にMakefileを編集することでdarknetでGPUを使うか否かなどの設定ができる.

# Compiling with CUDA
GPU=1

# Compiling with OpenCV
OPENCV=1

2. 学習用データセットを作る

この記事を執筆しているとき,自分は人の手を認識させたかったので,データセットの中の名前がhandなんとかになったりしていますが,適宜ファイル名を分かりやすいものに変えても問題はない.

f:id:nagatsukimxi:20190228104757p:plain

backupフォルダ

学習済みモデルが完成したときに格納されるディレクト

datasets

学習用画像と学習用画像のどこに何が写っているかを記述したtxtファイルが入っている.

画像とtxtの名前は揃っていないといけない.

hand-obj.names

hand

今回は手しか認識させないので1行目にhandとだけ記述.

複数のものを学習させたいときには2行目3行目と認識させたいものの名前を記述していく.

hand-test.txt

datasets/img_0-0.jpg
datasets/img_0-1.jpg
datasets/img_0-2.jpg

学習用画像のある場所を列挙する.こちらはテスト用の画像リスト.

hand-train.txt

datasets/img_0-0.jpg
datasets/img_0-1.jpg
datasets/img_0-2.jpg

こちらも学習用画像のある場所を列挙する.こちらは訓練用の画像リスト.

hand.data

classes= 1
train  = hand-train.txt
valid  = hand-test.txt
names = hand-obj.names
backup = ~/Documents/GitHub/darknet/cfg/task/backup

hand.dataにはここまでに作成したtxtファイルなどの場所などを記述.

最後の行のbackupは学習済みモデルを保存するディレクトリ指定だが,権限的にちゃんと保存できる場所にしておかないと,時間かけて学習したデータが保存されない.何時間も時間を掛けて学習させエラーが最後の最後に起きたら悲しぃ(経験済み)

yolov3-hand.cfg

darknet/cfg/yolov3-voc.cfgをコピーして名前を変更した.

このファイルには学習時のハイパーパラメータが記述されている.

細かいことをしないのであれば,とりあえず以下の行数の「filters」と「classes」の値だけ変更すればいい.

605: filters=18
611: classes=1
689: filters=18
695: classes=1
773: filters=18
779: classes=1

この値にはルールがあり,classesは認識させたいオブジェクトの数.今回は手(hand)だけなので1.

filtersは「(classes + 5) * 3」の値となる.今回は(1+5) * 3 = 18とした.

ex. 学習用データセットを自作するのに今回使ったツール「labelImg」

https://github.com/tzutalin/labelImg

とりあえず,labelImgを使わせてもらった.

Install方法は以下のReadme

https://github.com/tzutalin/labelImg/blob/master/README.rst

直感的に動かすことができるが,画像の範囲を選択したあとにxmlで出力するのではなく,txtで出力するように設定を変更する.たしかYOLO用に書き出し.みたいな設定があった.

3. YOLOv3用の学習モデル初期値ファイルをDL

https://pjreddie.com/media/files/darknet53.conv.74

からDLできる.適当なディレクトリに保存しておく.155MB.

今回は darknet/models/に保存した.

4. 学習開始

コマンドを叩いて学習スタート.

./darknet detector train hand.data yolov3-hand.cfg models/darknet53.conv.74

5. 学習したモデルを使ってみる

Ref.

https://timebutt.github.io/static/how-to-train-yolov2-to-detect-custom-objects/

https://www.slideshare.net/BusHato/ss-100355414

https://orizuru.io/blog/machine-learning/yolov3/

https://pjreddie.com/darknet/yolo/

https://wakuphas.hatenablog.com/entry/2018/09/19/025941

【Unity】Color型変数をもとにDebug.Logの文字色を変更する

Pref.

Unity上のDebug.LogのテキストカラーをColor型変数から指定する方法

Env.

Unity2018.2.14f1(恐らくどのバージョンでも良い)

Method

Color _logTextColor = new Color(1, 1, 1);
String _text = "test";

Debug.Log (string.Format("<color=#{0:X2}{1:X2}{2:X2}>{3}</color>", 
(byte)(_logTextColor.r * 255f), 
(byte)(_logTextColor.g * 255f), 
(byte)(_logTextColor.b * 255f), 
_text));

windowsでmacスタイルのIME切り替えを行う

Pref.

WindowsでのIMEの切り替えが半角/全角キーだと,現在IMEがONになっているかOFFになっているかが分からなくなります. そのため,誤入力が多くなり作業効率が下がるのが困るので,無変換,変換キーでIMEの切り替えを行うときの設定方法を書いておきます.

Env.

Windows10 64bit Google日本語入力

Method

1.Google日本語入力プロパティを開く

2.一般タブ,キー設定の「キー設定の選択」の編集をクリック

3.HenkanとMuhenkanの項目をそれぞれIMEを有効と無効に切り替える

無変換 -> IMEを無効化
f:id:nagatsukimxi:20190202213506p:plain

変換 -> IMEを有効化
f:id:nagatsukimxi:20190202213503p:plain

UnityAsset「External Mobile Controller」をリリースしました

Pref.

LAN内のスタンドアロンVRスマホアプリから操作可能にするアセット 「External Mobile Controller」をリリースしました.

Unity Asset Store : https://assetstore.unity.com/packages/tools/gui/external-mobile-controller-136516

今回の記事はこのアセットで何ができるのか? このアセットを使うには? といった部分を書いていきます.

Env.

Unity2018.1.14f1 - macOS mojave

External Mobile Controllerって何ができるのか

External Mobile Controller(EMC)を導入することで

Unityで制作したスタンドアローンVR(Oculus Goなど)向けアプリを スマホからリモートで「メソッド呼び出し」「映像確認」が可能になります.

これのアセットを組み込んでスタンドアローンVR向けアプリを制作することによって 展示会でお客さんに見てもらうときに 「今なに見えていますか?」 「ちょっと調整するので一旦Oculus Go返してもらってもよろしいですか?」 といったやり取りをしなくて良くなります.

また,実のところスタンドアローンVRで動作することを想定して開発したアセットではありますが,

スマホからPC用にビルドしたアプリを操作,Game画面の確認

スマホからスマホ用にビルドしたアプリを操作.Game画面の確認

のようにEMCを導入したアプリであればVR用アプリ以外でも LAN内のスマホからの操作が可能になります(有用性があるのかは知りませんがw)

分かりにくいですが,UnityEditor上で実行されているものが 手前のiPhoneからシーンの切り替えと画面確認が出来ています.


また展示会の利用以外では 常駐体験ブースのオペレーティング用アセットとしても利用が可能なので そういったシステムを開発されている方も使えるかと思います!

導入方法

導入は簡単です!

1.Unity Asset Storeから「External Mobile Controller」をUnityプロジェクトに導入

インポートを行い,シーン設定をちょこちょこっと行い,遠隔で操作されるときの表示名やパスワードを設定します.

2.手持ちのスマホにリモートコントロール用アプリ「Unity EMC」をインストール

Google Play で手に入れよう

からアプリをインストールしてください.

3.LAN内でEMCを導入したプロジェクト(アプリ)の起動とスマホにインストールしたアプリ「Unity EMC」の起動

Unityアセットが導入されて適切に設定されたプロジェクトがLAN内に存在する場合, スマホにインストールされたコントロール用アプリからリモートコントロールが可能になります.


Unityで制作したアプリをリモートコントロールする手順は以上ですが, より丁寧なアセットの導入方法はアセットのunitypackageの中にpdfで同梱してあります.

おわりに

今回リリースしたアセットでは

・コントロールされる側をアセットでの提供

・コントロールする側のアプリをiOSAndroidでリリース(審査)

と大掛かりになり,想像よりも大変でした(笑 今年はOculus Quest,Holo Lens 2といった新たなデバイスの誕生も控えているので このアセットに各展示会のデモなどの回転がよくなると嬉しいです(๑•̀ㅂ•́)و


Google Play および Google Play ロゴは、Google LLC の商標です。