LoginSignup
1
0

More than 3 years have passed since last update.

スタンプ型デバイス(5) ~VuforiaとHoloLens2~

Last updated at Posted at 2020-09-23

まえがき

前回,HoloLens2とデバイスの連携に成功した.
理想としてHoloLens2以外のデバイスでも利用できるようにしたいと考えていたが,
このデバイスをBletoothKeyboradとして扱うことで,Android,iOS,Vive,PCなどでも利用可能となった.

今回はデバイスをトラッキングする手法を考えることにした.
Bluetoothを利用した位置調整
 → Bluetoothでは数cm単位での同期ほぼ不可能
画像処理,機械学習による識別(python)
 → python勉強中
NuGetForUnityを用いたQRコードトラッキング
 → 試したがうまくいかなかった
Vuforia
 → Androidで触ったしいけそう!

ということで以前利用したことがあるVuforiaを使用することにした.
HoloLens1・2用のAssetがstoreにあったので,まずはHoloLens2でDemoを作ることにした.

本題

HoloLens2でデバイスを活用したARコンテンツのデモを作成する

機器概要

・Windows10 Laptop
・Unity 2019.3.2f1
・HoloLens2
・Visual Stadio 2019
・Arduino IDE
・スタンプ型デバイス(M5StickC)

準備

Vuforiaを利用するにはアカウントを作成する必要があります.
1. Vuforia Developer Portalにアクセス
2. Register」からアカウントを作成,ログイン
License Managerへ
image.png
3. Get Development KeyでLicense Keyを発行
image.png
image.png
※License Key(赤枠で塗りつぶしたところ)はUnityの画面で使用する
4.Target Managerからマーカーを登録する
image.png
Add Databaseをクリック
image.png
TypeはDeviceでCreate
image.png
Add Targetをクリック
image.png
Type:マーカーにしたい形状を選択,今回は平面
File:マーカーとする画像を選択,今回は特徴点がわかりやすいQRコードを使用
Witdth:マーカーのサイズを指定,1=1mなので今回は0.01=1cmを指定

Addするとマーカーが追加される
Ratingは特徴点の多さ,認識のしやすさ
image.png

Unity内で利用するためには,Download Databaseをクリック
必要なtargetを選択して,.unitypackageファイルをDL
これをプロジェクト内にImportすることで利用可能となる

手順

1. Unityでプロジェクトを作成
2. HoloLens2用の設定に変更する

・Universal Windows PlatformにSwitch Platformをクリック
image.png
・MRTK Project ConfiguratorでApplyをクリック
image.png
・TextMeshProでImport TMP Essentialsをクリック
image.png
・PlayerのXR Settingsを確認する
image.png

3. Asset StoreからVuforia Hololens 1+2 Sampleをimport

※バージョンが違うかもしれないが構わず,Install/Upgrade
image.png
image.png
image.png
エラーも無視でOK(たぶん)

4. Sampleシーンを試してみる

HoloLens2でVuforiaが動くことを確認する
Assets/SampleResources/Scenesを開くとサンプルがあるのでこれらをビルド
出てきたファイルをVisual StadioからHoloLens2にビルド

5. 自作のシーンを作成

まず自作のマーカーを利用するためには発行したLicense Keyを入力する
Assets/Resources/VuforiaConfigurationを開く
image.png
App License KeyにLicense Keyをコピペ
これでLicenseが認証される

次にDLした自作したマーカーを入れる
パッケージをimportする
image.png
これで後述のDatabaseImage Targetから選択できるようになる

デモ用のシーンを作成する
・0.Menu
・1.Scene1
・2.Scene2
・3.Scene3

必要なものをSampleから持ってくる
MixedRealityToolKitMixedRaaliyPlayspaceはそれぞれのシーンで新たに作成した方が良い
 作成の仕方はMixedReality/Add to Scene and Configure...をクリックする
image.png

Menu
image.png
SpeechInputHandler ← 音声認識に関するもの
Lights ← 光源
UIContent ← Menuのオブジェクト,シーン遷移ができる
image.png
ButtonFrontPlateにそれぞれScene Loaderというscriptがアタッチされている
この変数を変更することでどのシーンに移行するか変更できる(例では3)
image.png
シーンの番号はBuild Settingsを参照
ビルド対象に選択した順に0から番号を振られる
image.png
また,ButtonのテキストはSectionTitleTextMeshPro-Text,マークはQuadMesh RenderMaterialsから変更可能
image.png
image.png

Scene1,2,3
image.png
SpeechInputHandler ← 音声認識に関するもの
Lights ← 光源
UIContent ← 説明のパネル(Homeボタン付き),Menuへの遷移ができる
VuforiaContent ← ARtargetと出現するobject
image.png
VuforiaContentにはImageTargetが入っている.
image.png
ImageTargetにはImage Target Behaviourというscriptがアタッチされている
この内容を変更することでARマーカーとなる画像等を変更することが可能である
Type:Vuforiaに登録したDatabaseを利用するのでFrom Database
Database:自分の作成したDatabase
Image Target:登録したTarget

ImageTargetの下にAR表示させたいobjectを配置することでマーカーを認識したときにobjectが表示される

6. プログラムを作成

今回作成したいものはマーカーをトラッキングして,その位置にobjectを配置するプログラムである

次にマーカーを配置
マーカーとなるobjectはCreate/Vuforia Engine/Image Tagetで作成できる
image.png
マーカーの設定はImage Target Behaviourから行う

マーカーの下に,位置を伝えるPosition_Makerと認識したことがわかるようにPlaneを置く
image.png
image.png

初期位置の調整用のscriptを作成

Tracking.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Tracking : MonoBehaviour
{
    public GameObject imageTarget;
    //初期の位置を設定
    public float x = 0.0f;
    public float y = 0.0f;
    public float z = 0.0f;
    private void Start()
    {
        Vector3 target_Pos = new Vector3(x, y, z);
        this.GetComponent<Transform>().localPosition = target_Pos;
    }
}

PlanePosition_Makerにアタッチ
image.png
image.png

デバイスの入力処理,マーカーのPositionを認識してそのy=0の位置にオブジェクトを配置するscript
スイッチで生成,ButtonAで種類変更,ButtonBで出したオブジェクトを全消し

Device_Controller.cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Device_Controller : MonoBehaviour
{
    public GameObject[] Stamp;
    private int num = 0;
    public float tall_down = 0;
    private void Update() {
        if(Input.GetKeyDown(KeyCode.LeftControl)){
            //マーカーの位置を取得
            Vector3 Maker = GameObject.Find("Position_Maker").transform.position;
            // Debug.Log("Device: " + Maker);

            //マーカーの位置の下(y=0)にスタンプ
            Maker.y = -1.0f * tall_down;
            // Device_Pos.transform.position = Maker;
            // Transform Pos = Device_Pos.transform;
            // Pos = Vector3(Maker.transform.position.x, 0 , Maker.transform.position.z);
            Vector3 Pos = Maker;
            Instantiate(Stamp[num], Pos, Quaternion.identity);
        }
        else if(Input.GetKeyDown(KeyCode.Tab)){
            num++;
            if(num >= 3) num = 0;
        }
        else if(Input.GetKeyDown(KeyCode.Escape)){
            // GameObject型の配列targetsに、"stamp"タグのついたオブジェクトをすべて格納
            GameObject[] targets = GameObject.FindGameObjectsWithTag("stamp");

            // GameObject型の変数targetに、targetsの中身を順番に取り出す。
            // foreachは配列の要素の数だけループします。
            foreach (GameObject target in targets) {
                // 消す!
                target.GetComponent<Destroy>().OnDestroy();
            }
        }
    }
}

Eventを作成してアタッチ
image.png

出現させるobjectに自分を消すscriptをアタッチ(多くなりすぎると処理落ちする可能性があるため)

Destroy.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Destroy : MonoBehaviour
{
    public void OnDestroy()
    {
        Destroy(this.gameObject);
    }
}

stampというtagを作成して,出現させるobjectを設定
image.png

これで完成
ビルドして,VisualStadioからHoloLens2にビルドする.

実行例

トラブルシューティング

主に詰まったところを載せておく
2回目以降のVisualStadioのビルドがうまくいかない
Unityで同じフォルダにビルドした際にVisualStadioで配置完了してもうまくいかない場合がある.
おそらく他の設定ファイルとごっちゃになってしまう場合である.
そんな時はビルド先のフォルダを新たに作成すると良い.(APP,Demo等)
image.png

HoloLens2で同じアプリとして認識され,上書きされる(設定でアプリ名を変更しても)
別のアプリとして認識させたいときは別のプロジェクトでビルドしましょう.
ちなみにUnityのアプリとVuforiaのアプリは別もの扱いされる
image.png

あとがき

QRコードで位置をトラッキングできたのでデバイスに張り付ければ使えそう!!(なおサイズ...)
VuforiaはAndroid,iOS,HoloLens2では使えそうだし,汎用性高い😊(Viveはカメラ占有されて?無理とか聞いた)
とりあえずできたので良かった.
分からないことやトラブル,エラーなどがあれば気軽にどうぞ.

参考

Nuget
QR コードの追跡
Hololens2とQRコードについて学ぶ
Vuforia
Unity での Vuforia Engine の使用
HoloLensでVuforiaを、一歩ずつ進めながら、確実に動かす
HoloLensでVuforiaを使う (Unity&MRTK 2017世代)
【Unity】Vuforiaを使ってARを表示する手順(2019年版)
UnityとVuforiaで始めるAR開発

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0