Controlar o processo de rastreamento Mega
Este artigo apresenta como controlar as várias funcionalidades e parâmetros no processo de rastreamento Mega para atender às necessidades de diferentes cenários de aplicação.
Antes de começar
- Verifique se minha biblioteca de localização está funcionando?
Fluxo de trabalho do tracker
O fluxo de trabalho do tracker é o seguinte:
flowchart LR
subgraph startup_graph[Inicialização]
direction TB
sstart((Início da sessão))
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 de rastreamento local]]
localization_g[[Localização inicial]]
end
subgraph localization_graph[Localização inicial]
direction TB
localize__{Localização ativada e<br>tempo limite de solicitação excedido}
localize[Localização na nuvem]
localize_{Localizado em um bloco e<br>bloco carregado}
tracking_g[[Rastreamento]]
end
subgraph tracking_graph[Rastreamento]
direction TB
tracking[[Rastreamento contínuo]]
localizet_{Localização ativada e<br>tempo limite de solicitação excedido}
localize2[Localização na nuvem]
localize2_{Localizado em um bloco e<br>bloco carregado}
localization_g2[[Localização inicial]]
end
subgraph stopping_graph[Parada]
direction TB
unload(Descarregar target)
dispose[Destruição nativa]
sstop([Parada da sessão])
end
sstart --> create --> load --> init_g
init --> init_ --> |Sim| localization_g
localize --> localize_ --> |Sim| tracking_g
localize_ --> |Não| localize__ --> |Sim| localize
unload --> dispose --> sstop
init_ --> |Não| init
tracking --> localizet_ --> |Sim| localize2 --> localize2_ --> |Sim| tracking
localizet_ --> |Não| tracking
localize2_ --> |Não| localization_g2
startup_graph --> init_graph
init_graph --> localization_graph
localization_graph --> tracking_graph
tracking_graph --> localization_graph
tracking_graph --> stopping_graph
O fluxo é dividido em vários estágios:
- Inicialização:
- Após o início da sessão, o tracker da camada nativa é criado.
- Após o Start() do target, ele é carregado no tracker correspondente.
- Inicialização:
- Ao usar a fonte de quadro 6DoF, entra-se no processo de inicialização de rastreamento local.
- Ao usar uma fonte de quadro não 6DoF, a fase de inicialização é pulada e se passa diretamente para a fase de localização inicial.
- Esse processo pode levar algum tempo, dependendo da complexidade da cena e da capacidade de desempenho do dispositivo, e geralmente está relacionado ao algoritmo usado na camada inferior da fonte de quadro.
- Na configuração padrão, o conteúdo dessa fase não é exibido. Isso pode ser controlado pelas opções do componente ActiveController.
- Localização inicial:
- Se a localização estiver ativada e o tempo limite de solicitação for excedido, o tracker enviará uma solicitação de localização para a nuvem.
- Após a localização bem - sucedida, se o bloco correspondente ao ID retornado pelo serviço de localização estiver carregado, entra - se na fase de rastreamento; se o bloco não estiver carregado, continua - se esperando o término do carregamento do bloco e a próxima solicitação de localização.
- Após a falha na localização, o tracker continua esperando a próxima solicitação de localização.
- Esse processo pode levar algum tempo, dependendo da facilidade de localização da cena e da condição da rede.
- Na configuração padrão, o conteúdo dessa fase não é exibido. Isso pode ser controlado pelas opções do componente ActiveController.
- Se a localização estiver ativada e o tempo limite de solicitação for excedido, o tracker enviará uma solicitação de localização para a nuvem.
- Rastreamento:
- O tracker rastreia continuamente o bloco atual.
- Se a localização estiver ativada e o tempo limite de solicitação for excedido, o tracker enviará uma solicitação de localização para a nuvem.
- Após a localização bem - sucedida, se o ID retornado pelo serviço de localização não mudar, continua - se o rastreamento; se o ID mudar e o bloco estiver carregado, muda - se para o novo bloco e continua - se o rastreamento; se o ID mudar e o bloco não estiver carregado, continua - se esperando o término do carregamento do bloco e a próxima solicitação de localização.
- Após a falha na localização, o tracker continua rastreando o bloco atual e espera a próxima solicitação de localização.
- Na configuração padrão, apenas o conteúdo do nó do target em estado de rastreamento (TargetController.IsTracked ==
true) é exibido. Isso pode ser controlado pelas opções do componente ActiveController.
- Parada:
- Após a parada da sessão, o target é descarregado e o tracker da camada nativa é destruído.
Ajustar o nível de suporte do dispositivo
A propriedade MegaTrackerFrameFilter.MinInputFrameLevel do MegaTrackerFrameFilter é usada para especificar o nível mínimo de dispositivo suportado pelo Mega.
![]()
O Mega pode ser executado em quase todos os tipos de fontes de dados de quadros, mas diferentes fontes de dados de quadros têm diferentes impactos no efeito de rastreamento.
Por padrão, o Mega selecionará a fonte de dados de quadros de nível mais alto suportada pelo dispositivo para rastreamento. A sessão que suporta o Mega na configuração padrão já está configurada com fontes de dados de quadros que suportam 6DoF e 5DoF.
Para suportar um determinado nível de fonte de dados de quadros durante a execução do Mega, são necessárias duas condições:
- A fonte de dados de quadros necessária está no grupo de fontes de dados de quadros opcionais da sessão.
- MegaTrackerFrameFilter.MinInputFrameLevel é maior ou igual ao nível CameraTransformType da fonte de dados de quadros necessária.
Por exemplo, para suportar o rastreamento 3DoF na sessão padrão, é necessário:
- Adicionar ThreeDofCameraDeviceFrameSource ao grupo de fontes de dados de quadros da sessão.
- Modificar MegaTrackerFrameFilter.MinInputFrameLevel para ThreeDof.
Outro exemplo, para remover o suporte ao rastreamento 5DoF na sessão padrão, é necessário:
- Remover InertialCameraDeviceFrameSource do grupo de fontes de dados de quadros da sessão.
- Modificar MegaTrackerFrameFilter.MinInputFrameLevel para SixDof (mesmo que não seja modificado, devido à ausência de fonte de dados de quadros 5DoF, o 5DoF não será usado).
Quando não houver fonte de dados de quadros que atenda às condições disponível, a montagem da sessão falhará.
Conhecer o estado atual do sistema
Na configuração padrão da sessão, as mensagens da interface do usuário são exibidas na tela, contendo informações sobre o status de rastreamento do Mega.
Quando o posicionamento é bem-sucedido, a informação do serviço Mega conterá o texto de status Found; quando o posicionamento falha, a informação do serviço Mega conterá o texto de status NotFound.
Os blocos carregados são exibidos como Block [scnObj=<objName>] (<trackingStatus>): <name> (<id>). Onde <objName> é o nome do objeto de cena correspondente ao bloco, <name> é o nome do bloco e <id> é o ID do bloco. O trackingStatus pode ser Tracking ou NotTracking, indicando respectivamente se o bloco está sendo rastreado no momento.
![]()
Quando o posicionamento é bem-sucedido, as informações de blocos que foram posicionados, mas não carregados, são exibidas como Block [scnObj=?]: <name> (<id>).
![]()
Dica
NotFound é um estado normal que ocorre frequentemente durante todo o processo de trabalho do Mega. Quando esse estado aparece, o rastreamento ainda continua. Normalmente, o desenvolvimento de aplicativos não requer tratamento especial para o estado NotFound.
Usando o evento MegaTrackerFrameFilter.LocalizationRespond é possível obter o status de posicionamento atual, para saber se o sistema encontrou o alvo de rastreamento no momento.
O código a seguir demonstra como usar esse evento, bem como métodos de tratamento para estados de exceção 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 serviço está acordando, o usuário final precisa aguardar
}
if (status == MegaTrackerLocalizationStatus.QpsLimitExceeded)
{
// QPS excedeu o limite, alguns usuários finais podem falhar no posicionamento aleatoriamente (qualidade geral do rastreamento diminui)
// Geralmente é necessário pagar para aumentar o limite de QPS para garantir a qualidade do rastreamento com o volume atual de usuários
}
if (status == MegaTrackerLocalizationStatus.ApiTokenExpired)
{
// Token expirado, isso só ocorre ao usar a interface de Token para acessar o serviço
// Para resolver esse problema, o aplicativo precisa solicitar seu próprio backend para obter o Token e chamar MegaTrackerFrameFilter.UpdateToken para atualizá-lo
}
}
Se o aplicativo frequentemente encontra o estado MegaTrackerLocalizationStatus.RequestTimeout, geralmente indica que a conexão de rede do dispositivo com o serviço é ruim. Recomenda-se otimizar o ambiente de rede para melhorar a qualidade do rastreamento. Em cenários onde a condição da rede não pode ser melhorada, considere aumentar o tempo limite da solicitação.
Nota
Não é possível obter a pose retornada pelo posicionamento por meio desse evento.
Na verdade, a pose retornada pelo posicionamento não é necessária no desenvolvimento de aplicativos. O EasyAR calculará uma pose mais precisa por meio de algoritmos locais após o retorno do posicionamento e a fornecerá aos desenvolvedores para uso. Essa pose já está refletida no transform do bloco. Consulte Obter o resultado da execução da sessão.
Pausar e continuar
As funções de rastreamento e localização do Mega podem ser pausadas e retomadas separadamente.
Pausar o rastreamento
Definir MegaTrackerFrameFilter.enabled como false pode pausar o rastreamento.
Por padrão, depois que o rastreamento é pausado, todo o conteúdo nos nós do bloco será ocultado.
Pausar localização
Defina MegaTrackerFrameFilter.EnableLocalization como false para pausar a localização.
Aviso
Pausar a localização afetará o efeito de rastreamento, geralmente não é recomendado modificar. Use sob a orientação do suporte técnico da EasyAR.
Se a localização foi pausada durante a execução da aplicação, certifique-se de mencionar este ponto ao fornecer feedback à EasyAR.
Controle de serviços e solicitações
É possível controlar o comportamento da solicitação de serviços modificando os parâmetros do componente MegaTrackerFrameFilter.
Intervalo de solicitação e tempo limite
Selecione o objeto Mega Tracker na sessão e modifique as opções em Request Time Parameters para ajustar o intervalo de tempo e o tempo limite das solicitações ao serviço.
![]()
No script, você pode modificar MegaTrackerFrameFilter.RequestTimeParameters para obter o mesmo efeito.
Aviso
Modificar o intervalo de solicitação afeta o desempenho do rastreamento. Geralmente, não é recomendado fazer essa modificação. Use-o apenas sob a orientação do suporte técnico da EasyAR.
Se o intervalo de solicitação for modificado durante a execução do aplicativo, certifique-se de informar isso ao relatar problemas à EasyAR.
Trocar o banco de localização
Use MegaTrackerFrameFilter.SwitchEndPoint para trocar o banco de localização em tempo de execução. Quando esse método é usado, a imagem da câmera e a sessão não serão interrompidas.
Tópicos relacionados
- Práticas recomendadas para a sessão AR do Mega apresenta como criar e configurar uma sessão AR para o Mega.
- Adicionar alvos de rastreamento do Mega apresenta como adicionar o bloco de alvo de rastreamento do Mega e como carregar o modelo do bloco no editor do Unity para auxiliar no desenvolvimento.
- Adicionar um grupo de fontes de quadros apresenta como modificar o grupo de fontes de quadros da sessão.
- Obter os resultados da execução da sessão apresenta como obter os resultados de rastreamento do componente da sessão.
- Mensagens da UI apresenta como usar as mensagens da UI para exibir o status da sessão.