Table of Contents

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

fundamentals dataflow input output

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.

fundamentals dataflow

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

fundamentals dataflow feedback

Clases auxiliares de flujo de datos

Puertos de emisión/recepción para flujos. Cada componente debe incluir estos puertos:

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

Transformación del flujo de datos

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:

fundamentals dataflow single ImageTracker

Uso con un solo ImageTracker, para reconocer/seguir imágenes planas repetitivas:

fundamentals dataflow multiple ImageTracker

Uso de SparseSpatialMap, para crear/ubicar/seguir mapas espaciales dispersos:

fundamentals dataflow SparseSpatialMap

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

fundamentals dataflow Sparse-DenseSpatialMap