AR data flow
Questo articolo introduce il data flow in EasyAR Sense. EasyAR Sense usa API componentizzate, e i componenti sono collegati tramite data flow.
Dati di input e output

InputFrame: Input frame. Contiene image, camera parameters, timestamp, camera transform relativo al world coordinate system e tracking status. Tra questi, camera parameters, timestamp, camera transform relativo al world coordinate system e tracking status sono optional, ma algorithm components specifici hanno requisiti specifici per l'input.
OutputFrame: Output frame. Contiene l'input frame e gli output results dei synchronous processing components.
FeedbackFrame: Feedback frame. Contiene un input frame e un historical output frame, ed è usato da feedback-style synchronous processing components come ImageTracker.
Camera components
CameraDevice: Default camera su Windows, Mac, iOS e Android.
ARKitCameraDevice: Implementazione default di ARKit su iOS.
ARCoreCameraDevice: Implementazione default di ARCore su Android.
MotionTrackerCameraDevice: Implementa motion tracking e calcola le 6DoF coordinates del dispositivo tramite multi-sensor fusion. (solo Android)
ThreeDofCameraDevice: Aggiunge 3DoF orientation alla default camera.
InertialCameraDevice: Aggiunge 3DoF orientation e plane translation basata su inertial estimation alla default camera.
custom camera device: Implementazione custom camera.
Algorithm components
Feedback-style synchronous processing component: deve emettere results per ogni camera image frame e richiede il processing result del frame precedente per evitare interferenze reciproche.
ImageTracker: implementa il rilevamento e il tracciamento di immagini planari.
ObjectTracker: implementa il rilevamento e il tracciamento di oggetti 3D.
Componenti di elaborazione sincrona: devono produrre risultati seguendo l'immagine della camera in ogni frame.
SurfaceTracker: implementa il tracciamento delle superfici ambientali.
SparseSpatialMap: implementa sparse spatial maps, fornendo la capacità di scansionare lo spazio fisico generando mappe point cloud ed eseguendo localizzazione in tempo reale.
MegaTracker: implementa la localizzazione spaziale Mega.
Componenti di elaborazione asincrona: non devono produrre risultati seguendo l'immagine della camera in ogni frame.
CloudRecognizer: implementa cloud recognition.
DenseSpatialMap: implementa dense spatial maps, che possono essere usate per realizzare effetti come collision e occlusion.
Controllo di availability dei componenti
Tutti i componenti hanno una funzione isAvailable, che può essere usata per determinare se il componente è disponibile.
I casi in cui un componente non è disponibile includono:
Non è implementato sull'operating system corrente.
Le dependencies richieste dal componente non esistono, ad esempio ARKit o ARCore.
Il componente non esiste nella version (variant) corrente, ad esempio alcune funzioni non esistono in determinate versioni ridotte.
Il componente non è disponibile sotto la License corrente.
Prima di usare un componente, verificare sempre se è disponibile ed eseguire il fallback o il prompt corrispondente.
Data flow
Il modo in cui i componenti sono collegati è mostrato nella figura seguente.

Esiste un uso speciale in cui l'input è un feedback frame, come mostrato di seguito.

Data flow helper classes
Porte di invio e ricezione del data flow. Ogni componente deve includere queste porte.
SignalSink / SignalSource: riceve/invia un segnale senza dati.
InputFrameSink / InputFrameSource: riceve/invia un InputFrame.
OutputFrameSink / OutputFrameSource: riceve/invia un OutputFrame.
FeedbackFrameSink / FeedbackFrameSource: riceve/invia un FeedbackFrame.
Diramazione e fusione del data flow
InputFrameFork: divide un InputFrame in più uscite parallele.
OutputFrameFork: divide un OutputFrame in più uscite parallele.
OutputFrameJoin: fonde più OutputFrame in uno e fonde tutti i risultati in Results. Si noti che le sue molteplici connessioni di input non dovrebbero essere collegate mentre i dati stanno entrando, altrimenti potrebbe entrare in uno stato in cui non può produrre output. Si consiglia di completare le connessioni data flow prima dell'avvio di Camera.
FeedbackFrameFork: divide un FeedbackFrame in più uscite parallele.
Limitazione e buffering del data flow
InputFrameThrottler: riceve e invia InputFrame, ma ne invia solo uno alla volta. Invia il successivo InputFrame solo dopo aver ricevuto un segnale di trigger. Quando vengono ricevuti più InputFrame, i InputFrame successivi possono sovrascrivere quelli precedenti.
OutputFrameBuffer: riceve e memorizza in buffer OutputFrame, attende il polling dell'utente e può inviare un segnale quando riceve un OutputFrame.
Collegare il segnale inviato da OutputFrameBuffer a InputFrameThrottler per completare l'intero processo di throttling.
Conversione del data flow
InputFrameToOutputFrameAdapter: può incapsulare direttamente un InputFrame in un OutputFrame per la visualizzazione del rendering.
InputFrameToFeedbackFrameAdapter: può incapsulare un InputFrame e un FeedbackFrame in un FeedbackFrame per componenti di elaborazione sincronizzata con feedback.
Limite del numero di InputFrame
CameraDevice può impostare bufferCapacity, cioè il numero massimo di InputFrame emessi. Il valore default corrente è 8.
Le custom cameras possono usare BufferPool per l'implementazione.
Per il numero di InputFrame richiesto da ciascun componente, consultare la API documentation di ciascun componente.
Se il numero di InputFrame è insufficiente, il data flow può bloccarsi e causare il blocco del rendering.
Se il numero di InputFrame è insufficiente, può anche verificarsi il caso in cui il rendering non si blocca al primo avvio, ma si blocca dopo il passaggio in background o dopo pause/start dei componenti. Durante i test, assicurarsi di coprire questa situazione.
Connessione e disconnessione
Non è consigliato connettere e disconnettere durante l'esecuzione del data flow.
Se è necessario connettere o disconnettere durante runtime, notare che ciò può essere fatto solo su un cut edge (dopo la rimozione di questo edge, il data flow viene diviso in due parti). Non può essere fatto su un edge in un cycle (qui cycle indica un ciclo formato dagli edges quando il data flow è considerato come undirected graph), sull'input di OutputFrameJoin o sul sideInput di InputFrameThrottler. In caso contrario, il data flow può bloccarsi su nodes come OutputFrameJoin e InputFrameThrottler, impedendo l'output.
Tutti gli algorithm components hanno funzionalità start/stop. Quando sono in stop, i frames non vengono processati, ma continuano a uscire dal componente, solo senza results.
Uso tipico
Di seguito è mostrato l'uso di un singolo ImageTracker, che può essere usato per riconoscere e fare tracking di planar image targets non ripetuti.
![]()
Di seguito è mostrato l'uso di un singolo ImageTracker, che può essere usato per riconoscere e fare tracking di planar image targets ripetuti.
![]()
Di seguito è mostrato l'uso di SparseSpatialMap, che può essere usato per implementare sparse spatial map building, localization e tracking.

Di seguito è mostrato l'uso combinato di SparseSpatialMap e DenseSpatialMap, che può essere usato per implementare sparse spatial map building, localization, tracking e dense spatial map generation.
