見出し画像

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 について

https://1planet.co.jp/xrconsulting.html

このブログ記事は 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

https://1planet.co.jp/xrconsulting.html

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技術全般をブログマガジンを連載しています。