Table of Contents

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

fundamentals dataflow input 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.

fundamentals dataflow

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

fundamentals dataflow feedback

Data flow helper classes

Porte di invio e ricezione del data flow. Ogni componente deve includere queste porte.

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

Conversione del data flow

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.

fundamentals dataflow single ImageTracker

Di seguito è mostrato l'uso di un singolo ImageTracker, che può essere usato per riconoscere e fare tracking di planar image targets ripetuti.

fundamentals dataflow multiple ImageTracker

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

fundamentals dataflow SparseSpatialMap

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.

fundamentals dataflow Sparse-DenseSpatialMap