見出し画像

Magic Leap2 でGPSを使って位置情報(緯度,経度,高度)を取得する方法

はじめに

Magic Leap 1 ではWiFIを使ったLocation APIを使用することで緯度、経度の取得が可能でしたが、Magic Leap2では、Location APIが提供されていません。今回はGPSを使った緯度、経度、高度の取得方法について説明します。


OnePlanet XR について

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

このブログ記事は OnePlanet XR によるものです。
OnePlanet XR は、AR/MR/VPS技術に専門特化したコンサルティングサービスです。豊富な実績を元に、AR/MR技術を活用した新たな事業の立ち上げ支援や、社内業務のデジタル化/DX推進など、貴社の必要とするイノベーションを実現いたします。

ご相談から受け付けております。ご興味ございましたらお問い合わせください。


緯度、経度、高度を取得して表示するデモアプリケーション

アプリケーションが起動したタイミングで、GPSの使用可否チェックを行います。その後、GPSにアクセスして緯度、経度、高度を取得して画面に表示します。

総務省 技適未取得機器を用いた実験等の特例制度の開設届出済(以下、参照。)

総務省 技適未取得機器を用いた実験等の特例制度の開設届出済

開発環境 / 動作環境


Magic Leap2 の GPS

Magic Leap2 にはGPSが搭載しておりません。今回はUSB接続によるGPSレシーバーを使用します。

Magic Leap2 の USB-Cコネクタの変換アダプタも用意します。


UsbGps4Droid のインストール

USBのGPSレシーバーをMagic Leap2 に接続しただけでは認識しません。Magic Leap2 にUsbGps4Droidのインストールを行い、設定することで、Magic Leap2 はUSBのGPSレシーバーにアクセスすることができます。
上のサイトからUsbGps4DroidのAPKファイルをダウンロードを行い、Magic Leap2にインストールします。


開発者者向けオプション画面の表示

設定→バージョン情報にあるビルド番号を選択した状態で、開発者向けオプションの有効メッセージが表示されるまで、トリガーを何度も押します。


GPSレシーバーのセットアップ

GPSレシーバーの接続

Magic Leap2 と GPSレシーバーをUSBで接続

Magic Leap2 と GPSレシーバーをUSB接続します。


UsbGps4Droidの設定

Magic Leap2 にインストールしたUsbGpsを起動します。起動後、右上の設定ボタンを選択した状態で、コントローラのトリガーを押します。

GPSレシーバーを選択

Choose Usb GPSを選んでトリガーボタンを押します。

Magic Leap2と接続しているUSBレシーバーを選択します。

現在地情報アプリの設定

開発者者向けオプション画面で現在地情報アプリの設定を促すダイアログが表示されます。「OPEN MOCK LOCATION SETTINGS」を選んだ状態でトリガーを押します。

開発者向けオプション画面に遷移されます。開発者向けオプションの「仮の現在地情報アプリを選択」を選んだ状態でトリガーを押します。

アプリ選択の中にUsbGpsが表示されます。UsbGpsを選んだ状態でトリガーを押します。

仮の現在情報アプリ:UsbGpsが設定されます。


GPSレシーバーの起動

UsbGpsを開き、UsbGps service started のスイッチを入れるとGPSレシーバーから緯度、経度、高度が取得できるようになります。


緯度、経度、高度を取得するデモアプリの作成

ヒエラルキー

シーンを新規作成します。Main Cameraは削除し、XR Rigのプレファブをヒエラルキーに配置します。
Game Objectを2つ作成します。1つ目は Location、2つ目はGPSExampleとします。

Location

LocationのGameObjectにScriptを追加します。Scriptの内容は以下になります。

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

public class Location : MonoBehaviour
{
    public static Location Instance { set; get; }

    public float latitude;
    public float longitude;
    public float altitude;
    public int maxWait = 20;
    public string message;

    private void Start()
    {
        Instance = this;
        DontDestroyOnLoad(gameObject);
        StartCoroutine(StartLocationService());
    }

    private IEnumerator StartLocationService()
    {
        message = "GPS Wait...";
        yield return new WaitForSeconds(3);

        // First, check if user has location service enabled
        if (!Input.location.isEnabledByUser)
        {
            message = "GPS not enabled";
            yield break;
        }

        // Start service before querying location
        Input.location.Start();

        while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)
        {
            message = "Wait: " + maxWait + "second";
            yield return new WaitForSeconds(1);
            maxWait--;
        }

        // Service didn't initialize in 20 seconds
        if (maxWait <= 0)
        {
            message = "Timed out";
            yield break;
        }

        // Connection has failed
        if (Input.location.status == LocationServiceStatus.Failed)
        {
            message = "Unable to determine device location";
            yield break;
        }

        // Set locational infomations
        while (true)
        {
            latitude = Input.location.lastData.latitude;
            longitude = Input.location.lastData.longitude;
            altitude = Input.location.lastData.altitude;
            message = "GPS enabled";
            yield return new WaitForSeconds(1);
        }
    }
}

GPSExample

GPSExampleのGameObjectにScriptを追加します。Scriptの内容は以下になります。

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

public class GPSExample : MonoBehaviour
{
    [SerializeField]
    private TextMeshProUGUI textMessage;
    [SerializeField]
    private TextMeshProUGUI textLocation;

    // Update is called once per frame
    void Update()
    {
        textMessage.text = Location.Instance.message;
        if (Location.Instance.latitude == 0 && Location.Instance.longitude == 0 && Location.Instance.altitude == 0)
        {
            textLocation.text = "latitude:N/A\nlongitude:N/A\naltitude:N/A";
            return;
        }
        textLocation.text = string.Format("latitude:{0}\nlongitude:{1}\naltitude:{2}", 
            Location.Instance.latitude, Location.Instance.longitude, Location.Instance.altitude);
    }
}

緯度、経度、高度の表示

緯度、経度、高度のテキスト表示用のUIを作成します。以下の記事に従って構築してください。(Textは2つ作成してください。)

上記の記事で作成したText(TMP)を GPSExample の textMessageフィールドとtextLocationに設定してください。


ビルド&インストール

緯度、経度、高度を取得して表示するアプリケーションの作成は完了となります。次はビルドを行い、作成されたAPKファイルをMagic Leap2 にインストールします。


位置情報の権限を付与

アプリケーション実行の前に位置情報の権限を付与する必要があります。

設定→アプリと通知まで移動します。作成したアプリを選びトリガーを押します。

アプリ情報の権限を選んでトリガーボタンを押します。

位置情報を選び、トリガーを押します。

アプリの使用中のみ許可を選びます。


実行

UsbGps4DroidのGPSがスタートしている状態で、作成したアプリケーションを起動します。一定時間経過すると緯度、経度、高度の情報が表示されます。


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