Table of Contents

Controlar o processo de rastreamento Mega

Este artigo apresenta como controlar os vários recursos e parâmetros durante o processo de rastreamento Mega para atender às necessidades de diferentes cenários de aplicação.

Antes de começar

Fluxo de trabalho do tracker

O fluxo de trabalho do tracker é o seguinte:

flowchart LR
  subgraph startup_graph[Início]
    direction TB
    sstart((session iniciada))
    create[Criação nativa]
    load(Carregar target)
    init_g[[Inicialização]]
  end
  
  subgraph init_graph[Inicialização]
    direction TB
    init_{Inicialização 6DoF bem-sucedida<br>ou não 6DoF}
    init[[Processo de inicialização do rastreamento local]]
    localization_g[[Localização inicial]]
  end

  subgraph localization_graph[Localização inicial]
    direction TB
    localize__{Localização ativada e<br>intervalo de request excedido}
    localize[Localização em nuvem]
    localize_{Localizado no block e<br>block carregado}
    tracking_g[[Rastreamento]]
  end
  
  subgraph tracking_graph[Rastreamento]
    direction TB
    tracking[[Rastreamento contínuo]]
  
    localizet_{Localização ativada e<br>intervalo de request excedido}
    localize2[Localização em nuvem]
    localize2_{Localizado no block e<br>block carregado}
    localization_g2[[Localização inicial]]
  end

  subgraph stopping_graph[Parar]
    direction TB
    unload(Descarregar target)
    dispose[Destruição nativa]
    sstop([session parada])
  end

  sstart --> create --> load --> init_g
  init --> init_ --> |Yes| localization_g
  localize --> localize_ --> |Yes| tracking_g
  localize_ --> |No| localize__ --> |Yes| localize
  unload --> dispose --> sstop
  init_ --> |No| init

  tracking --> localizet_ --> |Yes| localize2 --> localize2_ --> |Yes| tracking
  localizet_ --> |No| tracking
  localize2_ --> |No| localization_g2

  startup_graph --> init_graph
  init_graph --> localization_graph
  localization_graph --> tracking_graph
  tracking_graph --> localization_graph
  tracking_graph --> stopping_graph

O processo é dividido aproximadamente em várias etapas:

  • Inicialização:
    • Depois que a session é iniciada, o tracker da camada nativa é criado.
    • Depois de Start() do próprio target, ele é carregado no tracker correspondente.
  • Inicialização:
    • Ao usar uma frame source 6DoF, entra-se no processo de inicialização do rastreamento local.
    • Ao usar uma frame source não 6DoF, a etapa de inicialização é ignorada e o processo entra diretamente na etapa de localização inicial.
    • Esse processo pode levar algum tempo, está relacionado à complexidade da cena e à capacidade de desempenho do dispositivo, e geralmente também depende do algoritmo usado na camada inferior da frame source.
    • Na configuração padrão, o conteúdo dessa etapa não é exibido. Você pode controlar esse comportamento por meio das opções do componente ActiveController.
  • Localização inicial:
    • Se a localização estiver ativada e o intervalo de solicitação tiver sido excedido, o tracker enviará uma solicitação de localização à nuvem.
      • Depois que a localização for bem-sucedida, se o block correspondente ao id retornado pelo serviço de localização já tiver sido carregado, entra-se na etapa de rastreamento; se o block não tiver sido carregado, continua-se aguardando o carregamento do block e a próxima solicitação de localização.
      • Depois que a localização falha, o tracker continua aguardando a próxima solicitação de localização.
    • Esse processo pode levar algum tempo, dependendo da facilidade de localização da cena, da qualidade da coleta e do mapeamento dos dados e das condições de rede.
    • Na configuração padrão, o conteúdo dessa etapa não é exibido. Você pode controlar esse comportamento por meio das opções do componente ActiveController.
  • Rastreamento:
    • O tracker rastreia continuamente o block atual.
    • Se a localização estiver ativada e o intervalo de solicitação tiver sido excedido, o tracker enviará uma solicitação de localização à nuvem.
      • Depois que a localização for bem-sucedida, se o id retornado pelo serviço de localização não tiver mudado, o rastreamento continuará; se o id tiver mudado e o block já tiver sido carregado, ele será alternado para o novo block e o rastreamento continuará; se o id tiver mudado e o block não tiver sido carregado, continua-se aguardando o carregamento do block e a próxima solicitação de localização.
      • Depois que a localização falha, o tracker continua rastreando o block atual e aguarda a próxima solicitação de localização.
    • Na configuração padrão, nessa etapa apenas o conteúdo sob o nó target em estado de rastreamento (TargetController.IsTracked == true) é exibido. Você pode controlar esse comportamento por meio das opções do componente ActiveController.
  • Parada:
    • Depois que a session para, o target é descarregado e o tracker da camada nativa é destruído.

Ajustar o nível de suporte do dispositivo

A propriedade MegaTrackerFrameFilter.MinInputFrameLevel de MegaTrackerFrameFilter é usada para especificar o nível mínimo de dispositivo suportado pelo Mega.

alt text

O Mega pode ser executado em quase todos os tipos de fonte de dados de frames, mas diferentes fontes de dados de frames têm impactos diferentes no efeito de rastreamento.

Por padrão, o Mega escolhe a fonte de dados de frames de nível mais alto suportada pelo dispositivo para rastreamento. A session com suporte ao Mega na configuração padrão já foi configurada com suporte a fontes de dados de frames 6DoF e 5DoF.

Para oferecer suporte a uma fonte de dados de frames de determinado nível durante a execução do Mega, duas condições precisam ser atendidas:

Por exemplo, para oferecer suporte ao rastreamento 3DoF na session padrão, é necessário:

Outro exemplo: para remover o suporte a rastreamento 5DoF na session padrão, é necessário:

Quando nenhuma fonte de dados de frames que atenda às condições estiver disponível, a montagem da session falhará.

Entender o estado atual do sistema

Na configuração padrão da session, as mensagens de UI são exibidas na tela, incluindo informações do estado de rastreamento do Mega.

Quando a localização é bem-sucedida, as informações do serviço Mega conterão o texto de estado Found; quando a localização falha, as informações do serviço Mega conterão o texto de estado NotFound.

Blocks já carregados serão exibidos como Block [scnObj=<objName>] (<trackingStatus>): <name> (<id>). Nele, <objName> é o nome do objeto de cena correspondente ao block, <name> é o nome do block, e <id> é o ID do block. trackingStatus pode ser Tracking ou NotTracking, indicando respectivamente se o block atual está sendo rastreado.

alt text alt text

Quando a localização é bem-sucedida, as informações do block localizado mas não carregado serão exibidas como Block [scnObj=?]: <name> (<id>).

alt text

Dica

NotFound é um estado normal e aparece com frequência durante todo o processo de trabalho do Mega. Quando esse estado aparece, o rastreamento continua. Normalmente, no desenvolvimento de aplicativos, não é necessário tratar o estado NotFound de forma especial.

O evento MegaTrackerFrameFilter.LocalizationRespond pode ser usado para obter o estado atual da localização e, assim, entender se o sistema encontrou o alvo de rastreamento.

O código a seguir mostra como usar esse evento e como tratar estados anormais comuns que exigem atenção do aplicativo:

private void Awake()
{
    megaTracker.LocalizationRespond += HandleLocalizationStatusChange;
}
        
private void HandleLocalizationStatusChange(MegaLocalizationResponse response)
{
    var status = response.Status;
    wakingUpCount = status == MegaTrackerLocalizationStatus.WakingUp ? wakingUpCount + 1 : 0;
    if (wakingUpCount >= 5)
    {
        // o servico esta sendo ativado; o usuario final precisa aguardar
    }

    if (status == MegaTrackerLocalizationStatus.QpsLimitExceeded)
    {
        // o limite de QPS foi excedido; alguns usuarios finais podem falhar aleatoriamente na localizacao (a qualidade geral do tracking diminui)
        // normalmente e necessario pagar para aumentar o limite de QPS e garantir a qualidade do tracking com o volume atual de usuarios
    }

    if (status == MegaTrackerLocalizationStatus.ApiTokenExpired)
    {
        // Token expirado; isso ocorre apenas ao acessar o servico pela interface Token
        // para resolver isso, o aplicativo deve solicitar um Token ao seu proprio backend e chamar MegaTrackerFrameFilter.UpdateToken para atualiza-lo
    }
}

Se o aplicativo encontrar com frequência o estado MegaTrackerLocalizationStatus.RequestTimeout, isso geralmente indica que as condições de rede do dispositivo para conectar-se ao serviço não são boas. Recomenda-se otimizar o ambiente de rede para melhorar a qualidade do rastreamento. Em cenários em que as condições de rede não podem ser melhoradas, considere aumentar o tempo limite da solicitação.

Nota

Não é possível obter o pose retornado pela localização por meio desse evento.

Na verdade, o pose retornado pela localização não é necessário no desenvolvimento de aplicativos. Depois que a localização retorna, o EasyAR calcula por meio de algoritmos locais um pose mais preciso e o retorna para uso pelo desenvolvedor. Esse pose já está refletido no transform do block. Consulte obter os resultados de execução da session.

Pausar e continuar

As funções de rastreamento e localização do Mega podem ser pausadas e continuadas separadamente.

Pausar rastreamento

Definir MegaTrackerFrameFilter.enabled como false pausa o rastreamento.

Por padrão, depois que o rastreamento é pausado, todo o conteúdo sob os nós de block fica oculto.

Pausar localização

Definir MegaTrackerFrameFilter.EnableLocalization como false pausa a localização.

Aviso

Pausar a localização afetará o efeito de rastreamento e, em geral, não é recomendado. Use sob orientação do suporte técnico da EasyAR.

Se a localização tiver sido pausada durante a execução do aplicativo, informe isso ao relatar problemas à EasyAR.

Controle de serviço e solicitações

Você pode controlar o comportamento de solicitação do serviço modificando os parâmetros do componente MegaTrackerFrameFilter.

Selecionar biblioteca de localização

Selecione o objeto Mega Tracker sob a session e modifique as opções em Service para ajustar a biblioteca de localização conectada. Essa opção deve ser definida antes da session iniciar.

Na configuração padrão, Access Source é Global Config; a configuração de serviço usa a configuração global. Os parâmetros de serviço podem ser modificados em EasyAR > Sense > Mega > Mega Block em Project Settings. Essa configuração afetará todas as sessions que usam essa configuração global.

alt text

Dica

A configuração do serviço pode ser obtida no Centro de Desenvolvimento EasyAR.
Mega Config Detail

Se for necessário usar diferentes bibliotecas de localização em diferentes sessions, defina Access Source como API Key e modifique os parâmetros de serviço abaixo.

alt text

Em scripts, você pode modificar MegaTrackerFrameFilter.ServiceAccessSource e MegaTrackerFrameFilter.ServiceAccessData para obter o mesmo efeito.

Por exemplo, o código a seguir mostra como configurar, antes da inicialização da session, o tracker para usar parâmetros de runtime ao conectar-se ao serviço:

megaTracker.ServiceType = easyar.MegaApiType.Block;
megaTracker.ServiceAccessSource = easyar.MegaServiceAccessSourceType.APIKey;
megaTracker.ServiceAccessData = new easyar.APIKeyAccessData
{
    ServerAddress = serverAddress,
    APIKey = apiKey,
    APISecret = apiSecret,
    AppID = appID
};

Intervalo de solicitação e timeout

Selecione o objeto Mega Tracker sob a session e modifique as opções em Request Time Parameters para ajustar o intervalo de tempo e o timeout das solicitações ao serviço.

alt text

Em scripts, você pode modificar MegaTrackerFrameFilter.RequestTimeParameters para obter o mesmo efeito.

Aviso

Modificar o intervalo de solicitação afetará o efeito de rastreamento e, em geral, não é recomendado. Use sob orientação do suporte técnico da EasyAR.

Se o intervalo de solicitação tiver sido modificado durante a execução do aplicativo, informe isso ao relatar problemas à EasyAR.

Alternar biblioteca de localização

Use MegaTrackerFrameFilter.SwitchEndPoint para alternar a biblioteca de localização em runtime. Ao usar essa interface, a imagem da câmera e a session não serão interrompidas.

Tópicos relacionados