Table of Contents

Entrada do Unity AR —— AR Session

A session de AR é a entrada para todas as funções AR. Pelo conteúdo a seguir, você entenderá os conceitos básicos, a composição e o fluxo de execução da AR Session, além de sua relação com a AR Session do Unity AR Foundation. Você também verá como o fluxo de dados do EasyAR Sense funciona no Unity.

O que é AR Session

Todos os processos de AR, como rastreamento de objetos, são executados na biblioteca nativa, isto é, dentro do EasyAR Sense. A session é o principal ponto de entrada das funções AR no Unity. Ela gerencia o processo e o estado de execução do sistema AR, incluindo a leitura de dados de câmeras físicas e sensores, a análise do mundo real, o controle do movimento e da renderização da câmera virtual na cena e de outros objetos.

flowchart LR
  A((Imagens<br>e outros dados))
  B[Session]
  C([Camera])
  O([Origin])
  T([Target])
  A --> B
  B -. transform .-> C
  B -. transform .-> O
  B -. transform .-> T

[Opcional] session do EasyAR e session do AR Foundation

O session do EasyAR é o componente central para usar EasyAR no Unity e pode funcionar de forma independente de qualquer função AR de terceiros ou do sistema. Já a session do AR Foundation faz parte do framework Unity XR e só pode usar funções fornecidas por plugins Unity XR, como ARKit ou ARCore.

flowchart TD
  A1[EasyAR<br>AR Session]
  A2[EasyAR Sense]
  A1 --> A2

  B1[AR Foundation<br>AR Session]
  B2[ARKit Plugin]
  B3[ARCore Plugin]
  B1 --> B2
  B1 --> B3

Ao usar EasyAR, normalmente não é necessário instalar e usar AR Foundation ao mesmo tempo. Funções como rastreamento de imagem e rastreamento de movimento são fornecidas independentemente pelo EasyAR Sense.

Em alguns casos, pode ser necessário combinar o EasyAR Sense com o AR Foundation para aproveitar funções e interfaces adicionais fornecidas pelo AR Foundation, como detecção de planos em alguns dispositivos. Nesse caso, o EasyAR Sense interage com o motor Unity por meio das interfaces fornecidas pelo AR Foundation.

No entanto, como o EasyAR oferece mais funções e adaptação de dispositivos mais completa do que a AR do sistema, usar apenas AR Foundation geralmente não alcança o mesmo efeito que o EasyAR.

Composição da session

Uma session típica é composta principalmente pelas seguintes partes:

  • frame source: componente que fornece imagens da câmera física e dados de sensores; às vezes esses componentes também fornecem dados de rastreamento de movimento. Por exemplo, CameraDeviceFrameSource e MotionTrackerFrameSource
  • frame filter(s): componente que fornece uma função AR específica, como ImageTrackerFrameFilter
  • camera: objeto de câmera virtual na cena
  • origin: objeto de origem do rastreamento de movimento
Nota

No conceito do AR Foundation, o rastreamento de movimento é tratado como função obrigatória, portanto ele sempre fornece um origin.
No sistema EasyAR, o rastreamento de movimento é uma função opcional, portanto o origin também é opcional.

[Opcional] Fluxo de dados da session

Fluxo de dados é um dos conceitos centrais do EasyAR Sense. Ele não afeta o desenvolvimento de aplicativos AR no Unity. Se você quiser entender mais profundamente o princípio de funcionamento da session, pode ler esta seção.

No Unity, uma session normalmente representa um fluxo de dados do EasyAR Sense.

flowchart LR
  S[Frame Source]
  R[Input Frame Recorder<br>Video Input Frame Recorder]
  ift[iFrameThrottler]
  iff[iFrameFork]
  i2f[i2FAdapter]
  fb[fbFrameFork]  
  i2o[i2OAdapter]

  FOT[Object Tracker]
  FIT[Image Tracker]
  FMT[Mega Tracker]
  FSSM[Sparse Spatial Map]
  FST[Surface Tracker]
  FDS[Dense Spatial Map]
  FCR[Cloud Recognizer]
  
  ofj[oFrameJoin]
  off[oFrameFork]
  ofb[oFrameBuffer]

  O(( ))
  ODS(( ))
  OCR(( ))

  S ==> R ==> ift ==> iff
  iff --> i2f
  i2f --> fb
  fb -.-> FOT -.-> ofj
  fb -.-> FIT -.-> ofj
  iff ==> i2o ==> ofj ==> off ==> ofb ==> O
  iff -.-> FMT -.-> ofj
  iff -.-> FSSM -.-> ofj
  iff -.-> FST -.-> ofj
  iff -.-> FDS -.-> ODS
  iff -.-> FCR -.-> OCR
  off --> i2f
  ofb --> ift

Esse fluxo de dados é criado durante o processo de inicialização da session. Na figura, exceto pelos caminhos de dados em negrito, a conexão das demais partes depende dos componentes AR habilitados durante a inicialização.

Portanto, ao modificar os componentes habilitados na session, é possível alterar com flexibilidade a estrutura e as funções do fluxo de dados, e também habilitar várias funções AR ao mesmo tempo de forma conveniente. Esse método será apresentado em detalhes nos parágrafos seguintes.

Fluxo da session

flowchart LR
  i[Inicialização<br>Initialize]
  a[Montagem<br>Assemble]
  starta["Início (montada)<br>StartSession(Assembled)"]
  start[Início<br>StartSession]
  update((Atualização<br>update))
  stop[Parar<br>StopSession]
  di[Desinicialização<br>Deinitialize]

  i --> a --> starta --> update --> stop --> di
  i --> start --> update

  • Inicialização
    A inicialização é o processo de iniciar o EasyAR Sense usando a license key. Antes da inicialização, apenas uma parte muito pequena das interfaces do EasyAR Sense pode ser usada. Depois da inicialização, as funções AR são ativadas.

  • Montagem (Assembling)
    O processo de montagem seleciona componentes adequados na cena de acordo com a configuração das opções de montagem e os conecta em uma unidade de trabalho completa. Normalmente esse processo é concluído automaticamente na inicialização, mas também pode ser chamado manualmente antes da inicialização por meio da interface de montagem. Depois que a montagem é concluída, é possível iniciar uma session já montada para pular o processo de montagem e acelerar a inicialização.
    Outro uso importante do processo de montagem é determinar a disponibilidade dos componentes AR e das fontes de entrada, escolhendo a fonte de entrada mais adequada entre todas as candidatas. Essa etapa também pode ser usada para determinar se a session atual pode rodar no dispositivo atual.

    O processo de montagem é dividido em duas etapas

    1. A primeira etapa inicia a atualização da lista de suporte de dispositivos e, depois de aguardar um tempo fixo conforme a configuração, começa a montagem. Se após a espera da primeira etapa a lista de suporte de dispositivos já tiver sido atualizada, o processo de montagem termina;
    2. Caso contrário, o processo de montagem entra na segunda etapa, que será executada depois que a lista de suporte de dispositivos terminar de atualizar. Nessa etapa, se a frame source disponível passar de nenhuma frame source disponível na primeira etapa para existir uma frame source disponível, e a session tiver falhado ao iniciar após a primeira etapa, haverá uma tentativa de reiniciar a session.

    Independentemente de a lista de dispositivos ter terminado de atualizar na primeira etapa, a session continuará as etapas seguintes depois que a primeira etapa for concluída.

  • Inicialização da execução
    A inicialização da execução é o processo de começar a execução das funções AR. Antes disso, os componentes funcionais de AR não processam nenhum dado. Depois de uma inicialização normal, a session começa a controlar o movimento de alguns objetos na cena e, ao usar algumas fontes de entrada, controla a renderização da imagem da câmera física.

  • Atualização
    O processo de atualização é executado a cada quadro do loop de renderização do Unity. Ele modifica a cada quadro o transform da câmera virtual (em algumas fontes de entrada), do origin e dos targets rastreados, de acordo com os resultados de execução das funções AR atuais. O momento de execução da atualização não é igual em diferentes dispositivos, mas sempre ocorre antes da renderização.

  • Parada
    A parada encerra a execução das funções AR. Os objetos da cena deixam de ser controlados pela session, e os dados da fonte de entrada deixam de ser processados.

  • Desinicialização
    A desinicialização libera parte dos recursos globais, mas não descarrega bibliotecas dinâmicas. Depois dela, os componentes funcionais de AR não poderão ser usados.

Nota

Todas as funções AR só podem ser usadas depois de ARSession.StartSession.

Ciclo de vida padrão da session

flowchart LR
  uload("BeforeSceneLoad")
  ustart("MonoBehaviour.Start")
  udestroy("MonoBehaviour.OnDestroy")
  oi{Initialize<br>OnStartup}
  ostart{AutoStart}
  i[Inicialização<br>Initialize]
  start[Início<br>StartSession]
  update((Atualização<br>update))
  stop[Parar<br>StopSession]
  
  uload -.-> ustart -.-> udestroy
  uload --> oi -. true .-> i
  ustart --> ostart -. true .-> start
  udestroy --> stop
  i --> start --> update --> stop

O ciclo de vida da session geralmente é determinado pelo momento em que as interfaces são chamadas. Com as configurações padrão, a session executa automaticamente nos seguintes momentos:

Estado da session

ARSession.State descreve o estado da session. Uma session possui os seguintes estados:

Estado Descrição
None Estado inicial; a session não foi iniciada nem montada
Broken A session foi quebrada por motivos como falha de montagem
Assembling Em processo de montagem, que normalmente pode durar alguns quadros
Assembled Montagem concluída com sucesso, mas ainda não iniciada
Ready A session foi iniciada com sucesso; este estado dura apenas um quadro
Running A session está em execução
Paused A session está pausada

Normalmente, o estado da session muda ao chamar interfaces como iniciar e parar. Durante a execução, se ocorrer um erro grave, a session também pode entrar no estado Broken. Uma session que entrou no estado Broken não pode voltar a executar; é necessário chamar parada e depois reiniciá-la.

É possível entender pelo estado da session se a session atual está em um estado utilizável. A grande maioria das funções só pode ser usada nos estados Ready ou Running.

Estado do rastreamento de movimento

ARSession.TrackingStatus descreve o estado de rastreamento de movimento da session. Ele representa a qualidade do rastreamento de movimento do dispositivo e possui estes estados:

Estado Descrição
Optional<MotionTrackingStatus>.Empty A função de rastreamento de movimento não está habilitada ou a session não está em execução
NotTracking O resultado do rastreamento de movimento não está disponível; o motivo pode ser inicialização, perda de rastreamento ou relocalização
Limited O rastreamento de movimento é válido, mas o resultado não é muito bom; o motivo pode ser textura fraca na área atual ou movimento rápido demais
Tracking A qualidade do rastreamento de movimento é boa
Nota

No conceito do AR Foundation, o rastreamento de movimento é tratado como função obrigatória, portanto seu estado de rastreamento foi mesclado ao estado da session.
No sistema EasyAR, o rastreamento de movimento é uma função opcional; portanto, o estado de rastreamento existe de forma independente e pode estar vazio.

Onde está o estado de rastreamento de outras funções AR

Como uma função AR pode rastrear vários objetos ao mesmo tempo, o estado de rastreamento de imagem e os estados de rastreamento de outras funções AR não ficam na session, mas sim nos componentes de target rastreado.

É possível usar TargetController.IsTracked para saber se o target rastreado está em estado de rastreamento, ou usar os eventos TargetController.TargetFound e TargetController.TargetLost para ajustar a lógica de conteúdo do aplicativo quando o estado de rastreamento muda.

Próximos passos

Criar

Controlar execução

Acessar componentes e resultados

Referência de componentes