Table of Contents

Controllare il processo di tracciamento Mega

Questo documento spiega come controllare le varie funzioni e i parametri del processo di tracking Mega per adattarlo a scenari applicativi differenti.

Prima di iniziare

Flusso di lavoro del tracker

Il flusso di lavoro del tracker è il seguente:

flowchart LR
  subgraph startup_graph[Avvio]
    direction TB
    sstart((session avviata))
    create[Creazione nativa]
    load(Carica target)
    init_g[[Inizializzazione]]
  end
  
  subgraph init_graph[Inizializzazione]
    direction TB
    init_{Inizializzazione 6DoF riuscita<br>o non 6DoF}
    init[[Processo di inizializzazione del tracking locale]]
    localization_g[[Localizzazione iniziale]]
  end

  subgraph localization_graph[Localizzazione iniziale]
    direction TB
    localize__{Localizzazione attiva e<br>intervallo di richiesta superato}
    localize[Localizzazione cloud]
    localize_{Localizzato su block e<br>block caricato}
    tracking_g[[Tracking]]
  end
  
  subgraph tracking_graph[Tracking]
    direction TB
    tracking[[Tracking continuo]]
  
    localizet_{Localizzazione attiva e<br>intervallo di richiesta superato}
    localize2[Localizzazione cloud]
    localize2_{Localizzato su block e<br>block caricato}
    localization_g2[[Localizzazione iniziale]]
  end

  subgraph stopping_graph[Arresto]
    direction TB
    unload(Scarica target)
    dispose[Distruzione nativa]
    sstop([session arrestata])
  end

  sstart --> create --> load --> init_g
  init --> init_ --> |Yes| localization_g
  localize --> localize_ --> |Yes| tracking_g
  localize_ --> |No| localize__ --> |Yes| localize
  unload --> dispose --> sstop
  init_ --> |No| init

  tracking --> localizet_ --> |Yes| localize2 --> localize2_ --> |Yes| tracking
  localizet_ --> |No| tracking
  localize2_ --> |No| localization_g2

  startup_graph --> init_graph
  init_graph --> localization_graph
  localization_graph --> tracking_graph
  tracking_graph --> localization_graph
  tracking_graph --> stopping_graph

Il flusso si divide in alcune fasi:

  • Avvio:
    • dopo l'avvio della sessione, il tracker nativo viene creato.
    • Il target viene caricato nel tracker corrispondente dopo il suo Start (Start()).
  • Inizializzazione:
    • quando si usa un frame source 6DoF, si entra nel processo locale di inizializzazione del tracking.
    • quando si usa un frame source non 6DoF, la fase di inizializzazione viene saltata e si passa direttamente alla localizzazione iniziale.
    • questo processo può richiedere tempo, dipende dalla complessità della scena e dalle capacità del dispositivo, e di solito è legato agli algoritmi usati dal frame source sottostante.
    • Con la configurazione predefinita, il contenuto di questa fase non viene mostrato; si può controllare questo comportamento tramite le opzioni del componente ActiveController.
  • Localizzazione iniziale:
    • se la localizzazione è abilitata e l'intervallo richiesto è stato superato, il tracker invia una richiesta di localizzazione al cloud.
      • se la localizzazione riesce e l'id restituito dal servizio corrisponde a un block già caricato, si entra nella fase di tracking; se il block non è caricato, si continua ad attendere il caricamento e la prossima richiesta di localizzazione.
      • se la localizzazione fallisce, il tracker continua ad attendere la prossima richiesta di localizzazione.
    • questo processo può richiedere tempo, a seconda di quanto la scena è facile da localizzare, della qualità di acquisizione/mappatura e della rete.
    • Con la configurazione predefinita, il contenuto di questa fase non viene mostrato; si può controllare questo comportamento tramite le opzioni del componente ActiveController.
  • Tracking:
    • il tracker segue continuamente il block corrente.
    • se la localizzazione è abilitata e l'intervallo richiesto è stato superato, il tracker invia una richiesta di localizzazione al cloud.
      • se la localizzazione riesce e l'id restituito dal servizio non cambia, il tracking continua; se l'id cambia e il block è già caricato, si passa al nuovo block e il tracking continua; se l'id cambia e il block non è caricato, si continua ad attendere il caricamento e la prossima richiesta di localizzazione.
      • se la localizzazione fallisce, il tracker continua a seguire il block corrente e attende la prossima richiesta.
    • Con la configurazione predefinita, solo il contenuto sotto il nodo target che è nello stato di tracking (TargetController.IsTracked == true) viene mostrato; questo comportamento si può controllare tramite le opzioni del componente ActiveController.
  • Arresto:
    • dopo l'arresto della sessione, il target viene scaricato e il tracker nativo viene distrutto.

Regolare il livello di supporto del dispositivo

La proprietà MegaTrackerFrameFilter.MinInputFrameLevel di MegaTrackerFrameFilter serve a specificare il livello minimo di dispositivo supportato da Mega.

alt text

Mega può funzionare su quasi tutti i tipi di frame source, ma frame source diversi hanno effetti differenti sul tracking.

Per impostazione predefinita, Mega sceglie per il tracking il frame source di livello più alto supportato dal dispositivo. La sessione supportata da Mega con la configurazione predefinita è già configurata con frame source che supportano 6DoF e 5DoF.

Per supportare un determinato livello di frame source durante l'esecuzione di Mega devono essere soddisfatte due condizioni:

Per esempio, per supportare il tracking 3DoF nella sessione predefinita, bisogna:

Oppure, per rimuovere il supporto 5DoF dalla sessione predefinita, bisogna:

Se non è disponibile alcun frame source che soddisfi le condizioni, l'assemblaggio della sessione fallirà.

Capire lo stato corrente del sistema

Con la configurazione predefinita della sessione, i messaggi UI vengono mostrati sullo schermo e contengono informazioni sullo stato del tracking Mega.

Quando la localizzazione riesce, sotto le informazioni di servizio Mega compare il testo di stato Found; quando la localizzazione fallisce, compare NotFound.

Un block già caricato viene mostrato come Block [scnObj=<objName>] (<trackingStatus>): <name> (<id>). Qui <objName> è il nome dell'oggetto di scena corrispondente al block, <name> è il nome del block e <id> è l'ID del block. trackingStatus può essere Tracking o NotTracking, e indica rispettivamente se il block è attualmente tracciato.

alt text alt text

Quando la localizzazione riesce, un block localizzato ma non ancora caricato viene mostrato come Block [scnObj=?]: <name> (<id>).

alt text

Consiglio

NotFound è uno stato normale; compare spesso durante il funzionamento di Mega e il tracking continua comunque. In genere non serve gestire in modo speciale lo stato NotFound.

È possibile usare l'evento MegaTrackerFrameFilter.LocalizationRespond per ottenere lo stato corrente della localizzazione e capire se il sistema ha trovato o meno il target di tracking.

Il codice seguente mostra come usare questo evento e come gestire gli stati anomali più comuni a cui l'applicazione deve prestare attenzione:

private void Awake()
{
    megaTracker.LocalizationRespond += HandleLocalizationStatusChange;
}
        
private void HandleLocalizationStatusChange(MegaLocalizationResponse response)
{
    var status = response.Status;
    wakingUpCount = status == MegaTrackerLocalizationStatus.WakingUp ? wakingUpCount + 1 : 0;
    if (wakingUpCount >= 5)
    {
        // il servizio si sta riattivando; l utente finale deve attendere
    }

    if (status == MegaTrackerLocalizationStatus.QpsLimitExceeded)
    {
        // limite QPS superato; alcuni utenti finali possono fallire casualmente la localizzazione (la qualita complessiva del tracking diminuisce)
        // di solito e necessario pagare per aumentare il limite QPS e garantire la qualita del tracking con il numero attuale di utenti
    }

    if (status == MegaTrackerLocalizationStatus.ApiTokenExpired)
    {
        // Token scaduto; questo accade solo quando si accede al servizio tramite l interfaccia Token
        // per risolvere il problema, l applicazione deve richiedere un Token al proprio backend e chiamare MegaTrackerFrameFilter.UpdateToken per aggiornarlo
    }
}

Se l'app incontra spesso lo stato MegaTrackerLocalizationStatus.RequestTimeout, in genere significa che la rete del dispositivo verso il servizio non è buona; si consiglia di ottimizzare l'ambiente di rete per migliorare la qualità del tracking. Se la rete non può essere migliorata, si può considerare di aumentare il timeout della richiesta.

Nota

Non è possibile ottenere il pose restituito dalla localizzazione tramite questo evento.

In realtà, il pose restituito dalla localizzazione non serve nello sviluppo dell'app: dopo la localizzazione, EasyAR calcolerà con un algoritmo locale un pose più accurato e lo restituirà allo sviluppatore; questo pose è già riflesso nel transform del block, e si può fare riferimento a Ottenere il risultato di esecuzione della sessione.

Pausa e ripresa

Il tracking e la localizzazione di Mega possono essere messi in pausa e ripresi separatamente.

Pausa del tracking

Impostare MegaTrackerFrameFilter.enabled su false per mettere in pausa il tracking.

Per impostazione predefinita, dopo la pausa del tracking, tutto il contenuto sotto i nodi block viene nascosto.

Pausa della localizzazione

Impostare MegaTrackerFrameFilter.EnableLocalization su false per mettere in pausa la localizzazione.

Avvertenza

Mettere in pausa la localizzazione influisce sul risultato del tracking e in generale non è consigliato. Usarla solo sotto la guida del supporto tecnico EasyAR.

Se la localizzazione è stata messa in pausa durante l'esecuzione dell'app, assicurarsi di segnalarlo quando si fornisce un report del problema a EasyAR.

Controllo del servizio e delle richieste

È possibile controllare il comportamento della richiesta al servizio modificando i parametri del componente MegaTrackerFrameFilter.

Selezionare la cloud localization library

Selezionare l'oggetto Mega Tracker sotto la sessione e modificare le opzioni sotto Service per cambiare la cloud localization library connessa. Questa opzione deve essere impostata prima dell'avvio della sessione.

Con la configurazione predefinita, Access Source è Global Config: la configurazione del servizio usa la configurazione globale e i parametri del servizio possono essere modificati in Project Settings > EasyAR > Sense > Mega > Mega Block; questa configurazione influisce su tutte le sessioni che usano la stessa configurazione globale.

alt text

Consiglio

La configurazione del servizio può essere ottenuta dal EasyAR Developer Center.
Mega Config Detail

Se si desidera usare cloud localization library diverse in sessioni diverse, si può impostare Access Source su API Key e quindi modificare i parametri del servizio qui sotto.

alt text

In uno script, si possono modificare MegaTrackerFrameFilter.ServiceAccessSource e MegaTrackerFrameFilter.ServiceAccessData per ottenere lo stesso risultato.

Per esempio, il codice seguente mostra come configurare il tracker prima dell'avvio della sessione per connettersi al servizio usando parametri runtime:

megaTracker.ServiceType = easyar.MegaApiType.Block;
megaTracker.ServiceAccessSource = easyar.MegaServiceAccessSourceType.APIKey;
megaTracker.ServiceAccessData = new easyar.APIKeyAccessData
{
    ServerAddress = serverAddress,
    APIKey = apiKey,
    APISecret = apiSecret,
    AppID = appID
};

Intervallo e timeout delle richieste

Selezionare l'oggetto Mega Tracker sotto la sessione e modificare le opzioni sotto Request Time Parameters per regolare l'intervallo di richiesta al servizio e il timeout.

alt text

In uno script, si può modificare MegaTrackerFrameFilter.RequestTimeParameters per ottenere lo stesso risultato.

Avvertenza

Modificare l'intervallo di richiesta influisce sul risultato del tracking e in generale non è consigliato. Usarlo solo sotto la guida del supporto tecnico EasyAR.

Se l'intervallo di richiesta è stato modificato durante l'esecuzione dell'app, assicurarsi di segnalarlo quando si fornisce un report del problema a EasyAR.

Cambiare localization library

È possibile usare MegaTrackerFrameFilter.SwitchEndPoint per cambiare localization library a runtime. Usando questa interfaccia, l'immagine della fotocamera e la sessione non verranno interrotte.

Argomenti correlati