Table of Contents

Fluxo de dados AR

Este artigo apresenta o fluxo de dados no EasyAR Sense. O EasyAR Sense utiliza uma API baseada em componentes, onde os componentes são interligados por meio de um fluxo de dados.

Dados de entrada e saída

fundamentals dataflow input output

InputFrame: Quadro de entrada. Contém imagem, parâmetros da câmera, carimbo de data/hora, transformação da câmera em relação ao sistema de coordenadas mundial e estado de rastreamento. Os parâmetros da câmera, carimbo de data/hora, transformação e estado de rastreamento são opcionais, mas componentes algorítmicos específicos podem ter requisitos particulares para a entrada.

OutputFrame: Quadro de saída. Contém o quadro de entrada e os resultados de processamento sincronizado dos componentes.

FeedbackFrame: Quadro de feedback. Contém um quadro de entrada e um quadro de saída histórico, utilizado por componentes de processamento sincronizado com feedback, como ImageTracker.

Componentes de câmera

CameraDevice: Câmera padrão em Windows, Mac, iOS, Android.

ARKitCameraDevice: Implementação padrão do ARKit no iOS.

ARCoreCameraDevice: Implementação padrão do ARCore no Android.

MotionTrackerCameraDevice: Implementa rastreamento de movimento, calculando as coordenadas 6DoF do dispositivo através de fusão de múltiplos sensores. (Suporte apenas para Android)

ThreeDofCameraDevice: Adiciona orientação 3DoF à câmera padrão.

InertialCameraDevice: Adiciona orientação 3DoF e translação plana baseada em estimativa inercial à câmera padrão.

custom camera device: Implementação personalizada de câmera.

Componentes algorítmicos

Componentes de processamento sincronizado com feedback: Exigem resultados a cada quadro de saída de imagem da câmera e necessitam do resultado do quadro anterior para evitar interferências mútuas.

  • ImageTracker: Implementa a detecção e rastreamento de imagens planas.

  • ObjectTracker: Implementa a detecção e rastreamento de objetos 3D.

Componentes de processamento síncrono: Requerem resultados de saída a cada quadro junto com a imagem da câmera.

  • SurfaceTracker: Implementa o rastreamento de superfícies ambientais.
  • SparseSpatialMap: Implementa o mapa espacial esparso, fornecendo a capacidade de escanear o espaço físico enquanto gera um mapa de nuvem de pontos e realiza localização em tempo real.
  • MegaTracker: Implementa o posicionamento espacial Mega.

Componentes de processamento assíncrono: Não requerem resultados de saída a cada quadro junto com a imagem da câmera.

  • CloudRecognizer: Implementa o reconhecimento em nuvem.
  • DenseSpatialMap: Implementa o mapa espacial denso, que pode ser usado para alcançar efeitos como colisão e oclusão.

Verificação de disponibilidade de componentes

Todos os componentes possuem uma função isAvailable, que pode ser usada para verificar se o componente está disponível.

Situações em que um componente não está disponível incluem:

  • Não implementado no sistema operacional atual.
  • Dependências necessárias ausentes, como ARKit, ARCore.
  • Componente inexistente na variante atual da versão, por exemplo, em versões simplificadas.
  • Componente indisponível sob a licença atual.

É essencial verificar a disponibilidade antes de usar um componente e implementar fallback ou exibir avisos conforme necessário.

Fluxo de dados

Os componentes são interligados conforme ilustrado abaixo.

fundamentals dataflow

Existe uma utilização especial de entrada como quadro de feedback, conforme mostrado abaixo.

fundamentals dataflow feedback

Classes auxiliares de fluxo de dados

Portas de emissão e recepção do fluxo de dados; cada componente deve incluir essas portas.

Divisão e união de fluxo de dados

  • InputFrameFork: Divide um InputFrame em múltiplos emitidos em paralelo.

  • OutputFrameFork: Divide um OutputFrame em múltiplos emitidos em paralelo.

  • OutputFrameJoin: Combina múltiplos OutputFrame em um, e mescla todos os resultados em Results. Atenção: as ligações de suas múltiplas entradas não devem ser feitas enquanto os dados estão fluindo, caso contrário pode entrar num estado sem saída. (Recomenda-se concluir as ligações do fluxo de dados antes de iniciar a Câmara.)

  • FeedbackFrameFork: Divide um FeedbackFrame em múltiplos emitidos em paralelo.

Limitação e armazenamento em buffer do fluxo de dados

Transformação do fluxo de dados

Limitação de quantidade de InputFrame

CameraDevice pode configurar bufferCapacity, definindo o número máximo de InputFrame emitidos. O valor padrão atual é 8.

Câmeras personalizadas podem usar BufferPool para implementação.

A quantidade necessária de InputFrame para cada componente está documentada na API de cada componente.

Quantidade insuficiente de InputFrame pode causar bloqueio do fluxo de dados, resultando em travamento da renderização.

Quantidade insuficiente pode também manifestar-se como renderização inicial fluida, mas travamento após alternar para segundo plano ou pausar/reiniciar componentes. Testes devem cobrir esses cenários.

Conectar e desconectar

Não é recomendado conectar ou desconectar durante a operação do fluxo de dados.

Se necessário durante a operação, a conexão/desconexão deve ocorrer apenas em bordas de corte (onde a remoção separaria o fluxo), nunca em arestas de loop (considerando o fluxo como grafo não direcionado), na entrada de OutputFrameJoin ou no sideInput de InputFrameThrottler. Caso contrário, pode ocorrer bloqueio em nós como OutputFrameJoin e InputFrameThrottler.

Componentes algorítmicos possuem funções start/stop. Quando parado (stop), os quadros não são processados, mas ainda são emitidos sem resultados.

Utilizações típicas

Abaixo, utilização de um único ImageTracker, adequada para reconhecimento e rastreamento de imagens de plano não repetitivo.

fundamentals dataflow single ImageTracker

Abaixo, utilização de um único ImageTracker, adequada para reconhecimento e rastreamento de imagens de plano repetitivo.

fundamentals dataflow multiple ImageTracker

Abaixo, utilização de SparseSpatialMap, adequada para construção de mapa espacial esparso, localização e rastreamento.

fundamentals dataflow SparseSpatialMap

Abaixo, utilização simultânea de SparseSpatialMap e DenseSpatialMap, adequada para construção de mapa esparso, localização, rastreamento e geração de mapa espacial denso.

fundamentals dataflow Sparse-DenseSpatialMap