Table of Contents

Il punto di ingresso di Unity AR - AR Session

La sessione AR è il punto di ingresso di tutte le funzionalità AR. Di seguito vengono illustrati i concetti fondamentali di AR Session, la sua composizione, il flusso di esecuzione e il rapporto con AR Session di Unity AR Foundation. Verrà anche spiegato come funziona il flusso dati di EasyAR Sense in Unity.

Che cos'è AR Session

Tutti i processi AR, come il tracking degli oggetti, vengono eseguiti nella libreria nativa, cioè all'interno di EasyAR Sense. La sessione è il principale punto di ingresso per le funzionalità AR in Unity. Gestisce il funzionamento e lo stato del sistema AR, comprese la lettura dei dati da fotocamere fisiche e sensori, l'analisi del mondo reale, la guida del movimento e del rendering della fotocamera virtuale e di altri oggetti nella scena.

flowchart LR
  A((Immagini<br>e altri dati))
  B[Session]
  C([Camera])
  O([Origin])
  T([Target])
  A --> B
  B -. transform .-> C
  B -. transform .-> O
  B -. transform .-> T

[Opzionale] Sessione EasyAR e sessione AR Foundation

La sessione di EasyAR è il componente centrale per usare EasyAR in Unity e può funzionare indipendentemente da qualsiasi funzione AR di terze parti o di sistema. Al contrario, la sessione di AR Foundation fa parte del framework XR di Unity e si basa solo sulle funzionalità fornite dai plugin XR di Unity, come ARKit o ARCore.

flowchart TD
  A1[EasyAR<br>AR Session]
  A2[EasyAR Sense]
  A1 --> A2

  B1[AR Foundation<br>AR Session]
  B2[ARKit Plugin]
  B3[ARCore Plugin]
  B1 --> B2
  B1 --> B3

Quando si usa EasyAR, in genere non è necessario installare o usare anche AR Foundation. Funzionalità come il tracking immagine, il tracking del movimento e così via sono fornite direttamente da EasyAR Sense.

In alcuni casi può essere necessario combinare EasyAR Sense con AR Foundation per sfruttare funzionalità aggiuntive offerte da AR Foundation, come il rilevamento dei piani su alcuni dispositivi, e le relative interfacce. In questo caso, EasyAR Sense interagisce con il motore Unity tramite le interfacce fornite da AR Foundation.

Tuttavia, poiché EasyAR offre più funzionalità e una compatibilità con i dispositivi più ampia rispetto all'AR di sistema, usare solo AR Foundation in genere non consente di ottenere gli stessi risultati di EasyAR.

Composizione della sessione

Una sessione tipica è composta principalmente dai seguenti elementi:

  • frame source: fornisce immagini della fotocamera fisica e dati dei sensori. A volte questi componenti forniscono anche dati di tracking del movimento. Per esempio, CameraDeviceFrameSource e MotionTrackerFrameSource
  • frame filter(s): componenti che forniscono funzionalità AR specifiche, come ImageTrackerFrameFilter
  • camera: l'oggetto della fotocamera virtuale nella scena
  • origin: l'oggetto origine per il tracking del movimento
Nota

Nel concetto di AR Foundation, il tracking del movimento è considerato una funzionalità obbligatoria, quindi fornisce sempre un origin. Nel sistema EasyAR, invece, il tracking del movimento è una funzionalità opzionale, quindi anche l'origin è opzionale.

[Opzionale] Flusso dati della sessione

Il flusso dati è uno dei concetti fondamentali di EasyAR Sense. Non influenza lo sviluppo delle app AR in Unity. Questa sezione è per chi desidera una comprensione più approfondita del funzionamento della sessione.

In Unity, una sessione rappresenta in genere un flusso dati di EasyAR Sense.

flowchart LR
  S[Frame Source]
  R[Input Frame Recorder<br>Video Input Frame Recorder]
  ift[iFrameThrottler]
  iff[iFrameFork]
  i2f[i2FAdapter]
  fb[fbFrameFork]  
  i2o[i2OAdapter]

  FOT[Object Tracker]
  FIT[Image Tracker]
  FMT[Mega Tracker]
  FSSM[Sparse Spatial Map]
  FST[Surface Tracker]
  FDS[Dense Spatial Map]
  FCR[Cloud Recognizer]
  
  ofj[oFrameJoin]
  off[oFrameFork]
  ofb[oFrameBuffer]

  O(( ))
  ODS(( ))
  OCR(( ))

  S ==> R ==> ift ==> iff
  iff --> i2f
  i2f --> fb
  fb -.-> FOT -.-> ofj
  fb -.-> FIT -.-> ofj
  iff ==> i2o ==> ofj ==> off ==> ofb ==> O
  iff -.-> FMT -.-> ofj
  iff -.-> FSSM -.-> ofj
  iff -.-> FST -.-> ofj
  iff -.-> FDS -.-> ODS
  iff -.-> FCR -.-> OCR
  off --> i2f
  ofb --> ift

Questo flusso dati viene creato durante l'inizializzazione della sessione. Le connessioni oltre i percorsi dati in grassetto dipendono dai componenti AR abilitati durante l'avvio.

Modificando i componenti della sessione, quindi, è possibile riorganizzare in modo flessibile il flusso dati e attivare più funzionalità AR contemporaneamente. I dettagli verranno spiegati nelle sezioni successive.

Flusso della sessione

flowchart LR
  i[Inizializzazione]
  a[Assemblaggio]
  starta["StartSession(Assembled)"]
  start[StartSession]
  update(update)
  stop[StopSession]
  di[Deinizializzazione]

  i --> a --> starta --> update --> stop --> di
  i --> start --> update

  • Inizializzazione
    L'inizializzazione è il processo con cui EasyAR Sense viene avviato usando una license key. Prima dell'inizializzazione, solo una piccola parte delle interfacce di EasyAR Sense è utilizzabile. Dopo l'inizializzazione, le funzionalità AR vengono attivate.

  • Assemblaggio (Assembling)
    Durante l'assemblaggio, in base alle opzioni configurate, vengono selezionati dalla scena i componenti adatti e collegati in un'unità di lavoro completa. Di solito il processo avviene automaticamente all'avvio, ma può anche essere eseguito manualmente prima dello start tramite l'interfaccia di assemblaggio. Una volta completato, è possibile avviare la sessione già assemblata per saltare l'assemblaggio e accelerare l'avvio. Un altro scopo importante dell'assemblaggio è determinare la disponibilità dei componenti AR e delle sorgenti di input, scegliendo la sorgente migliore tra tutte quelle candidate. Questo passaggio può anche essere usato per verificare se la sessione può funzionare sul dispositivo corrente.

    Il processo di assemblaggio è diviso in due fasi:

    1. Nella prima fase viene avviato l'aggiornamento della lista di supporto del dispositivo e, in base alla configurazione, si attende un intervallo fisso prima di iniziare l'assemblaggio. Se, al termine dell'attesa della prima fase, l'aggiornamento della lista di supporto del dispositivo è già completato, il processo termina.
    2. Altrimenti il processo entra nella seconda fase, che viene eseguita dopo il completamento dell'aggiornamento della lista di supporto del dispositivo. In questa fase, se la sorgente frame disponibile passa da nessuna sorgente disponibile a una sorgente disponibile e l'avvio della sessione è fallito dopo la prima fase, si tenterà di riavviare la sessione.

    Indipendentemente dal fatto che l'aggiornamento della lista di dispositivi nella prima fase sia completato o meno, la sessione continuerà con i passaggi successivi dopo la fine della prima fase.

  • Avvio
    L'avvio è il processo che fa entrare in funzione le funzionalità AR. Prima dell'avvio, i componenti AR non elaborano alcun dato. Dopo un avvio normale, la sessione inizia a controllare il movimento di alcuni oggetti nella scena e, quando si usano alcune sorgenti di input, anche il rendering dell'immagine della fotocamera fisica.

  • Aggiornamento
    Il processo di aggiornamento viene eseguito a ogni frame nel ciclo di rendering di Unity. In base ai risultati delle funzionalità AR in uso, modifica a ogni frame il transform della fotocamera virtuale (in alcune sorgenti di input), dell'origin e dei target tracciati. Il momento esatto dell'esecuzione cambia a seconda del dispositivo, ma avviene sempre prima del rendering.

  • Arresto
    L'arresto interrompe il funzionamento delle funzionalità AR, gli oggetti nella scena non sono più controllati dalla sessione e i dati delle sorgenti di input non vengono più elaborati.

  • Deinizializzazione
    La deinizializzazione libera alcune risorse globali, senza scaricare le librerie dinamiche. Dopo la deinizializzazione, i componenti AR non saranno più utilizzabili.

Nota

Tutte le funzionalità AR possono essere usate solo dopo ARSession.StartSession.

Ciclo di vita predefinito della sessione

flowchart LR
  uload("BeforeSceneLoad")
  ustart("MonoBehaviour.Start")
  udestroy("MonoBehaviour.OnDestroy")
  oi{Initialize<br>OnStartup}
  ostart{AutoStart}
  i[Inizializzazione]
  start[StartSession]
  update(update)
  stop[StopSession]
  
  uload -.-> ustart -.-> udestroy
  uload --> oi -. true .-> i
  ustart --> ostart -. true .-> start
  udestroy --> stop
  i --> start --> update --> stop

Il ciclo di vita della sessione è in genere determinato dal momento in cui vengono chiamate le interfacce. Con le impostazioni predefinite, la sessione eseguirà automaticamente queste azioni nei seguenti momenti:

Stato della sessione

ARSession.State descrive lo stato della sessione. Una sessione ha i seguenti stati:

Stato Descrizione
None Stato iniziale, la sessione non è stata avviata né assemblata
Broken La sessione è danneggiata, ad esempio a causa di un errore di assemblaggio
Assembling Durante l'assemblaggio, che può durare normalmente alcuni frame
Assembled Assemblaggio completato con successo, ma non ancora avviato
Ready La sessione è stata avviata con successo, questo stato dura solo un frame
Running La sessione è in esecuzione
Paused La sessione è in pausa

Di solito lo stato della sessione cambia quando si chiamano interfacce come avvio e arresto. Durante l'esecuzione, se si verifica un errore grave, la sessione può entrare nello stato Broken. Una sessione in stato Broken non può riprendersi e deve essere arrestata e riavviata.

Lo stato della sessione consente di capire se la sessione è utilizzabile. La maggior parte delle funzionalità può essere usata solo quando la sessione è in stato Ready o Running.

Stato del tracking del movimento

ARSession.TrackingStatus descrive lo stato del tracking del movimento della sessione e indica la qualità del tracking del movimento del dispositivo. Gli stati possibili sono:

Stato Descrizione
Optional<MotionTrackingStatus>.Empty La funzionalità di tracking del movimento non è abilitata o la sessione non è in esecuzione
NotTracking Il risultato del tracking del movimento non è disponibile; il motivo può essere l'inizializzazione, la perdita del tracking o il relocalization
Limited Il tracking del movimento è valido ma il risultato non è ottimale; il motivo può essere una texture troppo debole nell'area corrente o un movimento troppo rapido
Tracking La qualità del tracking del movimento è buona
Nota

Nel concetto di AR Foundation, il tracking del movimento è considerato una funzionalità obbligatoria, quindi il suo stato di tracking è unito allo stato della sessione. Nel sistema EasyAR, invece, il tracking del movimento è opzionale, quindi il suo stato è separato e può anche essere vuoto.

Dove si trova lo stato di tracking delle altre funzioni AR

Poiché le funzioni AR possono tracciare più oggetti contemporaneamente, lo stato del tracking immagine e quello delle altre funzioni AR non si trovano nella sessione, ma nei componenti target.

È possibile usare TargetController.IsTracked per verificare se il target è in stato di tracking, oppure usare gli eventi TargetController.TargetFound e TargetController.TargetLost per adattare la logica del contenuto dell'app quando lo stato di tracking cambia.

Passi successivi

Creazione

Controllo dell'esecuzione

Accesso ai componenti e ai risultati

Riferimenti ai componenti