まえがき
前回,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を利用するにはアカウントを作成する必要があります.
- Vuforia Developer Portalにアクセス
- Register」からアカウントを作成,ログイン
License Managerへ
- Get Development KeyでLicense Keyを発行
※License Key(赤枠で塗りつぶしたところ)はUnityの画面で使用する
4.Target Managerからマーカーを登録する
Add Databaseをクリック
TypeはDeviceでCreate
Add Targetをクリック
Type:マーカーにしたい形状を選択,今回は平面
File:マーカーとする画像を選択,今回は特徴点がわかりやすいQRコードを使用
Witdth:マーカーのサイズを指定,1=1mなので今回は0.01=1cmを指定
Addするとマーカーが追加される
Ratingは特徴点の多さ,認識のしやすさ
Unity内で利用するためには,Download Database
をクリック
必要なtargetを選択して,.unitypackageファイルをDL
これをプロジェクト内にImportすることで利用可能となる
手順
1. Unityでプロジェクトを作成
2. HoloLens2用の設定に変更する
・Universal Windows PlatformにSwitch Platformをクリック
・MRTK Project ConfiguratorでApplyをクリック
・TextMeshProでImport TMP Essentialsをクリック
・PlayerのXR Settingsを確認する
3. Asset StoreからVuforia Hololens 1+2 Sample
をimport
※バージョンが違うかもしれないが構わず,Install/Upgrade
エラーも無視でOK(たぶん)
4. Sampleシーンを試してみる
HoloLens2でVuforiaが動くことを確認する
Assets/SampleResources/Scenes
を開くとサンプルがあるのでこれらをビルド
出てきたファイルをVisual StadioからHoloLens2にビルド
HoloLens2でVuforia使ってみた#HoloLens2 #Vuforia #Unity pic.twitter.com/YBRgX42D37
— ゆーま (@sagirin262) September 17, 2020
5. 自作のシーンを作成
まず自作のマーカーを利用するためには発行したLicense Keyを入力する
Assets/Resources/VuforiaConfiguration
を開く
App License Key
にLicense Keyをコピペ
これでLicenseが認証される
次にDLした自作したマーカーを入れる
パッケージをimportする
これで後述のDatabase
やImage Target
から選択できるようになる
デモ用のシーンを作成する
・0.Menu
・1.Scene1
・2.Scene2
・3.Scene3
必要なものをSampleから持ってくる
※MixedRealityToolKit
とMixedRaaliyPlayspace
はそれぞれのシーンで新たに作成した方が良い
作成の仕方はMixedReality/Add to Scene and Configure...
をクリックする
Menu
・SpeechInputHandler
← 音声認識に関するもの
・Lights
← 光源
・UIContent
← Menuのオブジェクト,シーン遷移ができる
Button
のFrontPlate
にそれぞれScene Loader
というscriptがアタッチされている
この変数を変更することでどのシーンに移行するか変更できる(例では3)
シーンの番号はBuild Settingsを参照
ビルド対象に選択した順に0から番号を振られる
また,ButtonのテキストはSectionTitle
のTextMeshPro-Text
,マークはQuad
のMesh Render
のMaterials
から変更可能
Scene1,2,3
・SpeechInputHandler
← 音声認識に関するもの
・Lights
← 光源
・UIContent
← 説明のパネル(Homeボタン付き),Menuへの遷移ができる
・VuforiaContent
← ARtargetと出現するobject
VuforiaContent
にはImageTargetが入っている.
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 Target Behaviour
から行う
マーカーの下に,位置を伝えるPosition_Maker
と認識したことがわかるようにPlane
を置く
初期位置の調整用のscriptを作成
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;
}
}
デバイスの入力処理,マーカーのPositionを認識してそのy=0の位置にオブジェクトを配置するscript
スイッチで生成,ButtonAで種類変更,ButtonBで出したオブジェクトを全消し
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();
}
}
}
}
出現させるobjectに自分を消すscriptをアタッチ(多くなりすぎると処理落ちする可能性があるため)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Destroy : MonoBehaviour
{
public void OnDestroy()
{
Destroy(this.gameObject);
}
}
stamp
というtagを作成して,出現させるobjectを設定
これで完成
ビルドして,VisualStadioからHoloLens2にビルドする.
実行例
QRコードをトラッキングしてスタンプできる😁#HoloLens2 #Vuforia #Unity pic.twitter.com/FlAgvUQCfK
— ゆーま (@sagirin262) September 23, 2020
トラブルシューティング
主に詰まったところを載せておく
・2回目以降のVisualStadioのビルドがうまくいかない
Unityで同じフォルダにビルドした際にVisualStadioで配置完了してもうまくいかない場合がある.
おそらく他の設定ファイルとごっちゃになってしまう場合である.
そんな時はビルド先のフォルダを新たに作成すると良い.(APP,Demo等)
・HoloLens2で同じアプリとして認識され,上書きされる(設定でアプリ名を変更しても)
別のアプリとして認識させたいときは別のプロジェクトでビルドしましょう.
ちなみにUnityのアプリとVuforiaのアプリは別もの扱いされる
あとがき
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開発