Table of Contents

Controlar el proceso de seguimiento de Mega

Este articulo presenta como controlar las funciones y parametros del proceso de seguimiento de Mega para satisfacer las necesidades de distintos escenarios de aplicacion.

Antes de empezar

Flujo de trabajo del tracker

El flujo de trabajo del tracker es el siguiente:

flowchart LR
  subgraph startup_graph[Inicio]
    direction TB
    sstart((session iniciada))
    create[Creación nativa]
    load(Cargar target)
    init_g[[Inicialización]]
  end
  
  subgraph init_graph[Inicialización]
    direction TB
    init_{Inicialización 6DoF correcta<br>o no 6DoF}
    init[[Proceso de inicialización de seguimiento local]]
    localization_g[[Localización inicial]]
  end

  subgraph localization_graph[Localización inicial]
    direction TB
    localize__{Localización activada y<br>superado el intervalo de solicitud}
    localize[Localización en la nube]
    localize_{Localizado en block y<br>block cargado}
    tracking_g[[Seguimiento]]
  end
  
  subgraph tracking_graph[Seguimiento]
    direction TB
    tracking[[Seguimiento continuo]]
  
    localizet_{Localización activada y<br>superado el intervalo de solicitud}
    localize2[Localización en la nube]
    localize2_{Localizado en block y<br>block cargado}
    localization_g2[[Localización inicial]]
  end

  subgraph stopping_graph[Detener]
    direction TB
    unload(Descargar target)
    dispose[Destrucción nativa]
    sstop([session detenida])
  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

El flujo se divide aproximadamente en varias fases:

  • Inicio:
    • Despues de que la session se inicie, se crea el tracker de la capa nativa.
    • Despues de Start() del propio target, se carga en el tracker correspondiente.
  • Inicializacion:
    • Al usar un frame source 6DoF, entra en el proceso de inicializacion de seguimiento local.
    • Al usar un frame source no 6DoF, se omite la fase de inicializacion y se entra directamente en la fase de localizacion inicial.
    • Este proceso puede tardar cierto tiempo, relacionado con la complejidad de la escena y el rendimiento del dispositivo, y normalmente tambien con el algoritmo usado por la capa inferior del frame source.
    • Con la configuracion predeterminada, el contenido de esta fase no se muestra. Puede controlar este comportamiento mediante las opciones del componente ActiveController.
  • Localizacion inicial:
    • Si la localizacion esta habilitada y se supera el intervalo de solicitud, el tracker enviara una solicitud de localizacion a la nube.
      • Tras localizar correctamente, si el block correspondiente al id devuelto por el servicio de localizacion ya esta cargado, se entra en la fase de seguimiento; si el block no esta cargado, se sigue esperando a que termine la carga del block y a la siguiente solicitud de localizacion.
      • Tras fallar la localizacion, el tracker sigue esperando la siguiente solicitud de localizacion.
    • Este proceso puede tardar cierto tiempo, dependiendo de la facilidad de localizacion de la escena, la calidad de captura y mapeo de los datos y el estado de red.
    • Con la configuracion predeterminada, el contenido de esta fase no se muestra. Puede controlar este comportamiento mediante las opciones del componente ActiveController.
  • Seguimiento:
    • El tracker seguira continuamente el block actual.
    • Si la localizacion esta habilitada y se supera el intervalo de solicitud, el tracker enviara una solicitud de localizacion a la nube.
      • Tras localizar correctamente, si el id devuelto por el servicio de localizacion no cambia, continua el seguimiento; si el id cambia y el block ya esta cargado, cambia al nuevo block y continua el seguimiento; si el id cambia y el block no esta cargado, sigue esperando a que termine la carga del block y a la siguiente solicitud de localizacion.
      • Tras fallar la localizacion, el tracker sigue siguiendo el block actual y espera la siguiente solicitud de localizacion.
    • Con la configuracion predeterminada, en esta fase solo se muestra el contenido bajo el nodo target que esta en estado de seguimiento (TargetController.IsTracked == true). Puede controlar este comportamiento mediante las opciones del componente ActiveController.
  • Detencion:
    • Despues de que la session se detiene, el target se descarga y el tracker de la capa nativa se destruye.

Ajustar el nivel de compatibilidad del dispositivo

La propiedad MegaTrackerFrameFilter.MinInputFrameLevel de MegaTrackerFrameFilter se usa para especificar el nivel minimo de dispositivo admitido por Mega.

alt text

Mega puede ejecutarse sobre casi todos los tipos de fuentes de datos de fotogramas, pero distintas fuentes de datos de fotogramas afectan de forma diferente al efecto de seguimiento.

De forma predeterminada, Mega elegira para seguimiento la fuente de datos de fotogramas de mayor nivel admitida por el dispositivo. La session compatible con Mega con configuracion predeterminada ya esta configurada con fuentes de datos de fotogramas que admiten 6DoF y 5DoF.

Para admitir en runtime de Mega una fuente de datos de fotogramas de cierto nivel, deben cumplirse dos condiciones:

Por ejemplo, para admitir seguimiento 3DoF en la session predeterminada, debe:

Otro ejemplo: para eliminar la compatibilidad con seguimiento 5DoF en la session predeterminada, debe:

Cuando no hay ninguna fuente de datos de fotogramas disponible que cumpla las condiciones, el ensamblaje de la session fallara.

Conocer el estado actual del sistema

Con la configuracion predeterminada de session, los mensajes UI se muestran en pantalla e incluyen informacion del estado de seguimiento de Mega.

Cuando la localizacion tiene exito, la informacion del servicio Mega contiene el texto de estado Found; cuando falla, contiene el texto de estado NotFound.

Los blocks ya cargados se muestran como Block [scnObj=<objName>] (<trackingStatus>): <name> (<id>). Donde <objName> es el nombre del objeto de escena correspondiente al block, <name> es el nombre del block y <id> es el ID del block. trackingStatus puede ser Tracking o NotTracking, que indican respectivamente si el block actual esta siendo seguido.

alt text alt text

Cuando la localizacion tiene exito, la informacion del block localizado pero no cargado se muestra como Block [scnObj=?]: <name> (<id>).

alt text

Consejo

NotFound es un estado normal y aparece con frecuencia durante todo el funcionamiento de Mega. Cuando aparece este estado, el seguimiento sigue continuando. Normalmente no es necesario tratar especialmente el estado NotFound durante el desarrollo de la aplicacion.

Puede usar el evento MegaTrackerFrameFilter.LocalizationRespond para obtener el estado actual de localizacion y asi saber si el sistema ha encontrado el target de seguimiento.

El codigo siguiente muestra como usar este evento y como tratar estados anormales comunes a los que la aplicacion debe prestar atencion:

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)
    {
        // el servicio se esta activando; el usuario final debe esperar
    }

    if (status == MegaTrackerLocalizationStatus.QpsLimitExceeded)
    {
        // se ha superado el limite de QPS; algunos usuarios finales pueden fallar aleatoriamente al localizarse (la calidad general del tracking disminuye)
        // normalmente se debe pagar para aumentar el limite de QPS y garantizar la calidad de tracking con el volumen actual de usuarios
    }

    if (status == MegaTrackerLocalizationStatus.ApiTokenExpired)
    {
        // el Token ha caducado; esto solo ocurre al acceder al servicio mediante la interfaz de Token
        // para resolverlo, la aplicacion debe solicitar un Token a su propio backend y llamar a MegaTrackerFrameFilter.UpdateToken para actualizarlo
    }
}

Si la aplicacion encuentra con frecuencia el estado MegaTrackerLocalizationStatus.RequestTimeout, normalmente indica que el estado de red del dispositivo al conectar con el servicio no es bueno. Se recomienda optimizar el entorno de red para mejorar la calidad de seguimiento. Si no se puede mejorar la red, puede considerar aumentar el timeout de solicitud.

Nota

No se puede obtener el pose devuelto por la localizacion mediante este evento.

De hecho, el pose devuelto por la localizacion no es necesario en el desarrollo de aplicaciones. EasyAR calcula mediante algoritmos locales un pose mas preciso despues de la respuesta de localizacion y lo devuelve al desarrollador. Ese pose ya se refleja en el transform del block; puede consultar obtener resultados de ejecucion de la session.

Pausar y continuar

Las funciones de seguimiento y localizacion de Mega se pueden pausar y continuar por separado.

Pausar seguimiento

Establecer MegaTrackerFrameFilter.enabled en false puede pausar el seguimiento.

De forma predeterminada, despues de pausar el seguimiento, se ocultara todo el contenido bajo todos los nodos block.

Pausar localizacion

Establecer MegaTrackerFrameFilter.EnableLocalization en false puede pausar la localizacion.

Advertencia

Pausar la localizacion afectara el efecto de seguimiento y normalmente no se recomienda modificarlo. Uselo bajo la guia del soporte tecnico de EasyAR.

Si la localizacion se pauso durante la ejecucion de la aplicacion, indiquelo obligatoriamente al informar problemas a EasyAR.

Control de servicio y solicitudes

Puede controlar el comportamiento de solicitudes al servicio modificando los parametros del componente MegaTrackerFrameFilter.

Seleccionar biblioteca de localizacion

Seleccione el objeto Mega Tracker bajo la session y modifique las opciones bajo Service para ajustar la biblioteca de localizacion conectada. Esta opcion debe configurarse antes de iniciar la session.

Con la configuracion predeterminada, Access Source es Global Config; la configuracion del servicio usa la configuracion global. Los parametros del servicio pueden modificarse en Project Settings > EasyAR > Sense > Mega > Mega Block. Esta configuracion afecta a todas las sessions que usan esta configuracion global.

alt text

Consejo

La configuracion del servicio se puede obtener desde EasyAR Developer Center.
Mega Config Detail

Si necesita usar distintas bibliotecas de localizacion en distintas sessions, puede establecer Access Source en API Key y luego modificar los parametros del servicio abajo.

alt text

En script, puede modificar MegaTrackerFrameFilter.ServiceAccessSource y MegaTrackerFrameFilter.ServiceAccessData para lograr el mismo efecto.

Por ejemplo, el codigo siguiente muestra como configurar antes del inicio de la session el tracker para conectar con el servicio usando parametros de runtime:

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

Intervalo y timeout de solicitudes

Seleccione el objeto Mega Tracker bajo la session y modifique las opciones bajo Request Time Parameters para ajustar el intervalo de solicitudes al servicio y el timeout.

alt text

En script, puede modificar MegaTrackerFrameFilter.RequestTimeParameters para lograr el mismo efecto.

Advertencia

Modificar el intervalo de solicitud afectara el efecto de seguimiento y normalmente no se recomienda. Uselo bajo la guia del soporte tecnico de EasyAR.

Si el intervalo de solicitud se modifico durante la ejecucion de la aplicacion, indiquelo obligatoriamente al informar problemas a EasyAR.

Cambiar biblioteca de localizacion

Puede usar MegaTrackerFrameFilter.SwitchEndPoint para cambiar de biblioteca de localizacion durante la ejecucion. Al usar esta interfaz, la imagen de la camara y la session no se interrumpen.

Temas relacionados