Flujo de datos en AR
Este artículo presenta el flujo de datos en EasyAR Sense. EasyAR Sense utiliza API basadas en componentes, donde los componentes se interconectan mediante flujos de datos.
Datos de entrada y salida

InputFrame: Frame de entrada. Contiene imagen, parámetros de cámara, marca de tiempo, transformación de la cámara respecto al sistema de coordenadas mundial y estado de seguimiento. Los parámetros de cámara, marca de tiempo, transformación y estado de seguimiento son opcionales, pero ciertos componentes algorítmicos tienen requisitos específicos para la entrada.
OutputFrame: Frame de salida. Contiene el frame de entrada y los resultados de salida de los componentes de procesamiento sincronizado.
FeedbackFrame: Frame de retroalimentación. Contiene un frame de entrada y un frame de salida histórico, utilizado para componentes de procesamiento sincronizado con retroalimentación como ImageTracker.
Componentes de cámara
CameraDevice: Cámara predeterminada en Windows, Mac, iOS, Android.
ARKitCameraDevice: Implementación predeterminada de ARKit en iOS.
ARCoreCameraDevice: Implementación predeterminada de ARCore en Android.
MotionTrackerCameraDevice: Implementa seguimiento de movimiento, calculando coordenadas 6DoF del dispositivo mediante fusión multisensor. (Solo para Android)
ThreeDofCameraDevice: Amplía la cámara predeterminada con orientación 3DoF.
InertialCameraDevice: Amplía la cámara predeterminada con orientación 3DoF y traslación plana basada en estimación inercial.
Dispositivo de cámara personalizado: Implementación de cámara personalizada.
Componentes algorítmicos
Componentes de procesamiento sincronizado con retroalimentación: Requieren emitir resultados sincronizados con cada frame de imagen de cámara, y necesitan resultados del frame anterior para evitar interferencias mutuas.
ImageTracker: Implementa la detección y seguimiento de imagenes planas.
ObjectTracker: Implementa la detección y seguimiento de objetos 3D.
Componentes de procesamiento sincrónico: Requieren resultados de salida con cada fotograma de la imagen de la cámara.
- SurfaceTracker: Implementa el seguimiento de superficies ambientales.
- SparseSpatialMap: Implementa el mapa espacial disperso, proporcionando la capacidad de escanear el espacio físico mientras se genera un mapa de nube de puntos y se realiza la localización en tiempo real.
- MegaTracker: Implementa la localización espacial Mega.
Componentes de procesamiento asincrónico: No requieren resultados de salida con cada fotograma de la imagen de la cámara.
- CloudRecognizer: Implementa el reconocimiento en la nube.
- DenseSpatialMap: Implementa el mapa espacial denso, que se puede utilizar para lograr efectos como colisión y oclusión.
Verificación de disponibilidad de componentes
Todos los componentes tienen una función isAvailable para determinar si están disponibles.
Casos de componente no disponible:
No implementado en el sistema operativo actual.
Dependencias requeridas ausentes (ej: ARKit, ARCore).
Componente no presente en la variante actual (ej: versiones ligeras sin ciertas funciones).
Componente no disponible con la licencia actual.
Es imprescindible verificar la disponibilidad antes de usar un componente, implementando alternativas o mostrando advertencias.
Flujo de datos
La conexión entre componentes se muestra a continuación.

Existe un uso especial con frames de retroalimentación, como se muestra:

Clases auxiliares de flujo de datos
Puertos de emisión/recepción para flujos. Cada componente debe incluir estos puertos:
SignalSink / SignalSource: Recibe/emite una señal (sin datos).
InputFrameSink / InputFrameSource: Recibe/emite un InputFrame.
OutputFrameSink / OutputFrameSource: Recibe/emite un OutputFrame.
FeedbackFrameSink / FeedbackFrameSource: Recibe/emite un FeedbackFrame.
División y unión del flujo de datos
InputFrameFork: Divide un InputFrame en varios y los emite en paralelo.
OutputFrameFork: Divide un OutputFrame en varios y los emite en paralelo.
OutputFrameJoin: Combina múltiples OutputFrame en uno solo, fusionando todos los resultados en
Results. Es importante señalar que las conexiones de sus múltiples entradas no deben realizarse mientras hay datos fluyendo, de lo contrario podría entrar en un estado sin salida. (Se recomienda completar las conexiones del flujo de datos antes de iniciar la Cámara).FeedbackFrameFork: Divide un FeedbackFrame en varios y los emite en paralelo.
Limitación y almacenamiento en búfer del flujo de datos
InputFrameThrottler: Recibe y emite InputFrame, pero solo emite uno a la vez. Solo emitirá el siguiente InputFrame después de recibir una señal de activación. Si se reciben múltiples InputFrame, los posteriores pueden sobrescribir a los anteriores.
OutputFrameBuffer: Recibe OutputFrame y los almacena en búfer, esperando a ser consultados por el usuario. Puede emitir una señal cuando recibe un OutputFrame.
Conectando la señal emitida por OutputFrameBuffer a InputFrameThrottler, se completa el proceso completo de limitación de velocidad.
Transformación del flujo de datos
InputFrameToOutputFrameAdapter: Puede empaquetar directamente un InputFrame en un OutputFrame, para renderización y visualización.
InputFrameToFeedbackFrameAdapter: Puede empaquetar un InputFrame y un FeedbackFrame en un FeedbackFrame, para componentes de procesamiento sincronizado de tipo feedback.
Limitación de cantidad de InputFrame
CameraDevice permite configurar bufferCapacity, que es el número máximo de InputFrame emitidos. El valor predeterminado actual es 8.
Las cámaras personalizadas pueden implementarse usando BufferPool.
La cantidad de InputFrame requerida por cada componente se documenta en sus respectivas APIs.
Si hay insuficientes InputFrame, el flujo puede bloquearse causando congelamiento en el renderizado.
Este problema puede manifestarse al reiniciar componentes o cambiar entre primer/segundo plano. Las pruebas deben cubrir estos escenarios.
Conexión y desconexión
No se recomienda conectar/desconectar durante la operación del flujo de datos.
Si es necesario hacerlo en tiempo de ejecución, debe realizarse solo en bordes de corte (que al removerlos dividirían el flujo), no en bordes que formen ciclos (considerando el flujo como grafo no dirigido), ni en entradas de OutputFrameJoin o sideInput de InputFrameThrottler. De lo contrario, podría bloquearse el flujo en nodos como OutputFrameJoin o InputFrameThrottler.
Los componentes algorítmicos tienen funciones start/stop. Al detenerlos (stop), los frames pasan sin procesarse pero siguen emitiéndose, aunque sin resultados.
Usos típicos
Uso con un solo ImageTracker, para reconocer/seguir imágenes planas no repetitivas:
![]()
Uso con un solo ImageTracker, para reconocer/seguir imágenes planas repetitivas:
![]()
Uso de SparseSpatialMap, para crear/ubicar/seguir mapas espaciales dispersos:

Uso simultáneo de SparseSpatialMap y DenseSpatialMap, para crear/ubicar mapas dispersos y generar mapas densos:
