Ar-datenfluss
Dieser Artikel beschreibt den Datenfluss in EasyAR Sense. EasyAR Sense verwendet eine komponentenbasierte API, wobei Komponenten über Datenflüsse verbunden sind.
Eingabe- und ausgabedaten

InputFrame: Eingaberahmen. Enthält Bild, Kamera-Parameter, Zeitstempel, Transformation der Kamera relativ zum Weltkoordinatensystem und Tracking-Status. Kamera-Parameter, Zeitstempel, Transformation und Tracking-Status sind optional, aber bestimmte Algorithmuskomponenten haben spezifische Anforderungen an die Eingabe.
OutputFrame: Ausgaberahmen. Enthält den Eingaberahmen und die Ausgabeergebnisse synchron verarbeitender Komponenten.
FeedbackFrame: Feedback-Rahmen. Enthält einen Eingaberahmen und einen historischen Ausgaberahmen, verwendet für Feedback-basierte synchron verarbeitende Komponenten wie ImageTracker.
Kamera-komponenten
CameraDevice: Standardkamera unter Windows, Mac, iOS, Android.
ARKitCameraDevice: Standardimplementierung von ARKit unter iOS.
ARCoreCameraDevice: Standardimplementierung von ARCore unter Android.
MotionTrackerCameraDevice: Implementiert Bewegungstracking und berechnet die 6DoF-Koordinaten des Geräts durch Multisensorfusion. (Nur Android unterstützt)
ThreeDofCameraDevice: Fügt der Standardkamera 3DoF-Orientierung hinzu.
InertialCameraDevice: Fügt der Standardkamera 3DoF-Orientierung und eine auf Trägheitsschätzung basierende planare Translation hinzu.
Custom camera device: Benutzerdefinierte Kameraimplementierung.
Algorithmus-komponenten
Feedback-basierte synchron verarbeitende Komponenten: Benötigen die Ausgabe von Kamerabildern pro Frame und die Verarbeitungsergebnisse des vorherigen Frames, um gegenseitige Interferenzen zu vermeiden.
- ImageTracker:Realisiert die Erkennung und Verfolgung von ebenenbildern.
- ObjectTracker:Realisiert die Erkennung und Verfolgung von 3D-objekten.
Synchron verarbeitende komponenten:Müssen die Ergebnisse mit jedem Kamerabild pro Frame ausgeben.
- SurfaceTracker:Realisiert die Verfolgung von umgebungsoberflächen.
- SparseSpatialMap:Realisiert Sparse spatial map und bietet die Fähigkeit, einen physischen Raum zu scannen, gleichzeitig eine punktwolkenkarte zu generieren und in Echtzeit zu lokalisieren.
- MegaTracker:Realisiert die Mega-raumortung.
Asynchron verarbeitende komponenten:Müssen die Ergebnisse nicht mit jedem Kamerabild pro Frame ausgeben.
- CloudRecognizer:Realisiert cloud-erkennung.
- DenseSpatialMap:Realisiert Dense spatial map und kann für Effekte wie Kollision, Okklusion usw. verwendet werden.
Verfügbarkeitsprüfung der komponenten
Alle Komponenten haben eine isAvailable-Funktion, um zu prüfen, ob die Komponente verfügbar ist.
Gründe für die Nichtverfügbarkeit einer Komponente sind:
- Nicht implementiert auf dem aktuellen Betriebssystem.
- Erforderliche Abhängigkeiten fehlen, z.B. ARKit, ARCore.
- Die Komponente existiert nicht in der aktuellen Variante, z.B. fehlen einige Funktionen in schlanken Versionen.
- Die Komponente ist unter der aktuellen Lizenz nicht verfügbar.
Es ist zwingend erforderlich, die Verfügbarkeit einer Komponente zu prüfen, bevor sie verwendet wird, und entsprechende Fallback-Lösungen oder Hinweise bereitzustellen.
Datenfluss
Die Verbindungsweise der Komponenten ist unten dargestellt.

Es gibt eine spezielle Verwendung von Feedback-Frames als Eingabe, wie unten gezeigt.

Datenfluss-hilfsklassen
Datenfluss-Sende- und -Empfangsports. Jede Komponente benötigt diese Ports.
SignalSink / SignalSource: Empfangen/Senden eines Signals (ohne Daten).
InputFrameSink / InputFrameSource: Empfangen/Senden eines InputFrame.
OutputFrameSink / OutputFrameSource: Empfangen/Senden eines OutputFrame.
FeedbackFrameSink / FeedbackFrameSource: Empfangen/Senden eines FeedbackFrame.
Verzweigung und zusammenführung von datenströmen
InputFrameFork: Teilt ein InputFrame auf und sendet es parallel an mehrere Ausgänge.
OutputFrameFork: Teilt ein OutputFrame auf und sendet es parallel an mehrere Ausgänge.
OutputFrameJoin: Kombiniert mehrere OutputFrame zu einem einzigen und fasst alle Ergebnisse in
Resultszusammen. Es ist wichtig, dass Verbindungen zu mehreren Eingängen nicht gleichzeitig mit aktivem Datenfluss hergestellt werden, da dies zu einem Blockieren des Ausgangs führen kann. (Empfohlen: Verbindungen vor dem Starten der Kamera herstellen.)FeedbackFrameFork: Teilt ein FeedbackFrame auf und sendet es parallel an mehrere Ausgänge.
Drosselung und pufferung von datenströmen
InputFrameThrottler: Empfängt und sendet InputFrame, gibt jedoch jeweils nur einen Frame weiter. Erst nach Empfang eines Triggersignals wird der nächste Frame gesendet. Bei mehreren empfangenen Frames können nachfolgende Frames vorherige überschreiben.
OutputFrameBuffer: Empfängt OutputFrame, puffert sie und wartet auf Abfrage durch den Benutzer. Beim Empfang eines Frames kann ein Signal gesendet werden.
Durch Verbinden des Signals vom OutputFrameBuffer mit dem InputFrameThrottler wird der gesamte Drosselungsprozess abgeschlossen.
Umwandlung von datenströmen
InputFrameToOutputFrameAdapter: Kann ein InputFrame direkt in ein OutputFrame verpacken, z.B. für die Anzeige.
InputFrameToFeedbackFrameAdapter: Kann ein InputFrame und ein FeedbackFrame zu einem neuen FeedbackFrame kombinieren, für die Verwendung in Feedback-Synchronisationskomponenten.
Beschränkung der inputframe-anzahl
CameraDevice kann bufferCapacity setzen, d.h. die maximale Anzahl ausgegebener InputFrame. Der aktuelle Standardwert ist 8.
Benutzerdefinierte Kameras können BufferPool verwenden.
Die Anzahl der benötigten InputFrame pro Komponente ist in der API-Dokumentation der jeweiligen Komponente zu finden.
Wenn nicht genügend InputFrame vorhanden sind, kann der Datenfluss ins Stocken geraten, was zu Render-Verzögerungen führt.
Ein Mangel an InputFrame kann auch dazu führen, dass das Rendering beim ersten Start nicht stockt, aber nach einem Wechsel in den Hintergrund oder nach Pause/Start der Komponenten ins Stocken gerät. Tests müssen dies abdecken.
Verbinden und trennen
Das Verbinden und Trennen während des laufenden Datenflusses wird nicht empfohlen.
Wenn Verbindungen während des Betriebs getrennt oder hergestellt werden müssen, ist darauf zu achten, dass dies nur an "Schnittkanten" (Kanten, deren Entfernung den Datenfluss in zwei Teile teilen würde) erfolgen darf. Es darf nicht an Kanten in Schleifen (wenn der Datenfluss als ungerichteter Graph betrachtet wird), an den Eingängen von OutputFrameJoin oder am SideInput von InputFrameThrottler erfolgen. Andernfalls kann der Datenfluss in einen Zustand geraten, in dem er an Knoten wie OutputFrameJoin und InputFrameThrottler hängen bleibt und keine Ausgabe mehr liefert.
Algorithmuskomponenten haben Start/Stop-Funktionen. Im gestoppten Zustand werden Frames nicht verarbeitet, aber dennoch durch die Komponente ausgegeben, allerdings ohne Ergebnisse.
Typische verwendungen
Unten ist die Verwendung eines einzelnen ImageTracker dargestellt, geeignet zur Erkennung und Verfolgung nicht wiederholbarer Planar-Targets.
![]()
Unten ist die Verwendung eines einzelnen ImageTracker dargestellt, geeignet zur Erkennung und Verfolgung wiederholbarer Planar-Targets.
![]()
Unten ist die Verwendung von SparseSpatialMap dargestellt, geeignet zur Erstellung, Lokalisierung und Verfolgung einer Sparse Spatial Map.

Unten ist die gleichzeitige Verwendung von SparseSpatialMap und DenseSpatialMap dargestellt, geeignet zur Erstellung einer Sparse Spatial Map, Lokalisierung, Verfolgung und Generierung einer Dense Spatial Map.
