Magic Leap2 の マーカートラッキング(QRコード)
はじめに
この記事は、Magic Leap2 Advent Calendar 2022 の24日目です。
Magic Leap 2 QRコードによるトラッキング について説明します。
Magic Leap 2 では以下のマーカーのトラッキングをサポートしており、マーカー毎に独自のAPIは使用せず、MLMarkerTrackerを使用する形になります。
QR
ArUco
EAN_13 (実験段階)
UPC_A (実験段階)
OnePlanet XR について
このブログ記事は OnePlanet XR によるものです。
OnePlanet XR は、AR/MR/VPS技術に専門特化したコンサルティングサービスです。豊富な実績を元に、AR/MR技術を活用した新たな事業の立ち上げ支援や、社内業務のデジタル化/DX推進など、貴社の必要とするイノベーションを実現いたします。
ご相談から受け付けております。ご興味ございましたらお問い合わせください。
Magic Leap2 の QRコードトラッキングについて
バンパーボタンを押すとマーカースキャンを行い、QRコードであればCubeを配置。QRコードに含まれているテキスト情報を前面に表示します。(再度、バンパーボタンを押すとマーカースキャンを止めます。)
開発環境 / 動作環境
Unity Editor 2022.2.0b8.3023
Magic Leap SDK 1.1.0-dev2
Magic Leap Unity 1.2.0
Magic Leap XR Plugin 7.0.0.pre.1
Magic Leap2 OS 1.1.0-dev2 (B3E.221117.04-R.028)
ヒエラルキー
Marker Example
シーンを新規作成します。Main Cameraは削除し、XR Rigのプレファブをヒエラルキーに配置します。
Game Objectを作成し、名前を Marker Example にします。
Marker Object Prefab の作成
QRコード上に配置するCubeとQRコードの情報を表示するテキストを作成しPrefab化します。
Cube
テキスト(TextMeshPro)
MarkerExample
Marker Example の Game Object にアタッチするMarkerExampleというスクリプトを作成します。
スクリプトは以下になります。(今回、検証で使用したQRコードのサイズが各6cmだったため、qrCodeMarkerSize = 0.06f;としています。)
using System.Text;
using System.Collections.Generic;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.XR.MagicLeap;
using TMPro;
using static UnityEngine.XR.MagicLeap.MLMarkerTracker;
using MarkerSettings = UnityEngine.XR.MagicLeap.MLMarkerTracker.TrackerSettings;
public class MarkerExample : MonoBehaviour
{
private MagicLeapInputs mlInputs;
private MagicLeapInputs.ControllerActions controllerActions;
private Task _;
private bool isScan = false;
private ASCIIEncoding asciiEncoder = new ASCIIEncoding();
private Dictionary<string, GameObject> markers = new Dictionary<string, GameObject>();
[SerializeField]
private GameObject markerObject;
// Start is called before the first frame update
void Start()
{
mlInputs = new MagicLeapInputs();
mlInputs.Enable();
controllerActions = new MagicLeapInputs.ControllerActions(mlInputs);
controllerActions.Bumper.performed += HandleOnBumper;
MLMarkerTracker.OnMLMarkerTrackerResultsFound += OnTrackerResultsFound;
}
private void OnDestroy()
{
MLMarkerTracker.OnMLMarkerTrackerResultsFound -= OnTrackerResultsFound;
}
private void HandleOnBumper(InputAction.CallbackContext obj)
{
isScan = !isScan;
if (isScan)
{
float qrCodeMarkerSize = 0.06f;
MLMarkerTracker.MarkerType type = MLMarkerTracker.MarkerType.QR;
MarkerSettings trackerSettings = TrackerSettings.Create(true, type, qrCodeMarkerSize);
_ = MLMarkerTracker.SetSettingsAsync(trackerSettings);
_ = MLMarkerTracker.StartScanningAsync();
}
else
{
_ = MLMarkerTracker.StopScanningAsync();
}
}
private void OnTrackerResultsFound(MLMarkerTracker.MarkerData data)
{
if (MLMarkerTracker.MarkerType.QR == data.Type)
{
string id = asciiEncoder.GetString(data.BinaryData.Data, 0, data.BinaryData.Data.Length);
if (markers.ContainsKey(id))
{
markers[id].transform.position = data.Pose.position;
markers[id].transform.rotation = data.Pose.rotation;
}
else
{
GameObject marker = Instantiate(markerObject, data.Pose.position, data.Pose.rotation);
markers.Add(id, marker);
marker.transform.GetChild(0).gameObject.GetComponent<TextMeshPro>().text = id;
}
}
}
}
markerObjectにMarker Object Prefabを設定
Marker Example の markerObject フィールドにMarker Object Prefabを設定します。
実行
バンパーを押すとマーカースキャンが実行され、QRコードが認識されるとCubeが配置されます。(動画はズレて見えますが、実際はこれほど大きなズレはありません。トラッキングはスムーズではなく少し遅れてトラッキングします。)
OnePlanet XR
AR/MR/VPS技術に専門特化したコンサルティングサービス
Magic Leap2 を使ったソリューションのご検討の方からのお問い合わせ、お待ちしております。
お問い合わせ先
https://1planet.co.jp/xrconsulting.html#op_form
OnePlanet Tech Magazine
Magic Leap1、Magic Leap2 、スマホAR(Niantic Lightship ARDK、WebAR、VPSなど)といったAR技術全般をブログマガジンを連載しています。