Controlar el proceso de seguimiento de mega
Este artículo describe cómo controlar las diversas funciones y parámetros en el proceso de seguimiento de mega para satisfacer las necesidades de diferentes escenarios de aplicación.
Antes de comenzar
Flujo de trabajo del rastreador
El flujo de trabajo del rastreador es el siguiente:
flowchart LR
subgraph startup_graph[Arranque]
direction TB
sstart((inicio de sesión))
create[creación nativa]
load(cargar objetivo)
init_g[[inicialización]]
end
subgraph init_graph[Inicialización]
direction TB
init_{6DoF inicializado con éxito<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>intervalo de solicitud excedido}
localize[localización en la nube]
localize_{bloque localizado y<br>bloque cargado}
tracking_g[[seguimiento]]
end
subgraph tracking_graph[Seguimiento]
direction TB
tracking[[seguimiento continuo]]
localizet_{localización activada y<br>intervalo de solicitud excedido}
localize2[localización en la nube]
localize2_{bloque localizado y<br>bloque cargado}
localization_g2[[localización inicial]]
end
subgraph stopping_graph[Detención]
direction TB
unload(descargar objetivo)
dispose[destrucción nativa]
sstop([sesión detenida])
end
sstart --> create --> load --> init_g
init --> init_ --> |Sí| localization_g
localize --> localize_ --> |Sí| tracking_g
localize_ --> |No| localize__ --> |Sí| localize
unload --> dispose --> sstop
init_ --> |No| init
tracking --> localizet_ --> |Sí| localize2 --> localize2_ --> |Sí| 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:
- Arranque:
- Después de que se inicia la sesión, se crea el rastreador en la capa nativa.
- El objetivo en sí se carga en el rastreador correspondiente después de su propio Start().
- Inicialización:
- Cuando se utiliza una fuente de frames 6DoF, se entra en el proceso de inicialización de seguimiento local.
- Cuando se utiliza una fuente de frames no 6DoF, se omite la fase de inicialización y se pasa directamente a la fase de localización inicial.
- Este proceso puede llevar algo de tiempo, relacionado con la complejidad de la escena y la capacidad de rendimiento del dispositivo, y generalmente está relacionado con el algoritmo utilizado subyacente a la fuente de frames.
- En la configuración predeterminada, el contenido de esta fase no se muestra, este comportamiento se puede controlar a través de las opciones del componente ActiveController.
- Localización inicial:
- Si la localización está activada y se excede el intervalo de solicitud, el rastreador envía una solicitud de localización a la nube.
- Si la localización tiene éxito y el bloque correspondiente al ID devuelto por el servicio de localización está cargado, se entra en la fase de seguimiento; si el bloque no está cargado, se continúa esperando a que se complete la carga del bloque y a la siguiente solicitud de localización.
- Si la localización falla, el rastreador continúa esperando la siguiente solicitud de localización.
- Este proceso puede llevar algo de tiempo, dependiendo de la facilidad de localización de la escena y las condiciones de la red.
- En la configuración predeterminada, el contenido de esta fase no se muestra, este comportamiento se puede controlar a través de las opciones del componente ActiveController.
- Si la localización está activada y se excede el intervalo de solicitud, el rastreador envía una solicitud de localización a la nube.
- Seguimiento:
- El rastreador continúa rastreando el bloque actual.
- Si la localización está activada y se excede el intervalo de solicitud, el rastreador envía una solicitud de localización a la nube.
- Si la localización tiene éxito y el ID devuelto por el servicio de localización no ha cambiado, se continúa el seguimiento; si el ID ha cambiado y el bloque está cargado, se cambia al nuevo bloque y se continúa el seguimiento; si el ID ha cambiado y el bloque no está cargado, se continúa esperando a que se complete la carga del bloque y a la siguiente solicitud de localización.
- Si la localización falla, el rastreador continúa rastreando el bloque actual y espera la siguiente solicitud de localización.
- En la configuración predeterminada, en esta fase solo se muestra el contenido bajo el nodo del objetivo que está en estado de seguimiento (TargetController.IsTracked ==
true), este comportamiento se puede controlar a través de las opciones del componente ActiveController.
- Detención:
- Después de que se detiene la sesión, el objetivo se descarga y el rastreador en la capa nativa se destruye.
Ajustar el nivel de soporte del dispositivo
La propiedad MegaTrackerFrameFilter.MinInputFrameLevel de MegaTrackerFrameFilter se utiliza para especificar el nivel mínimo de dispositivo compatible con Mega.
![]()
Mega puede ejecutarse en casi todos los tipos de fuentes de datos de fotogramas, pero diferentes fuentes de datos de fotogramas tienen diferentes efectos en el rendimiento del seguimiento.
Por defecto, Mega selecciona la fuente de datos de fotogramas de nivel más alto compatible con el dispositivo para realizar el seguimiento. La sesión compatible con Mega configurada por defecto ya está configurada con fuentes de datos de fotogramas compatibles con 6DoF y 5DoF.
Para que Mega admita una fuente de datos de fotogramas de un nivel específico durante su ejecución, se deben cumplir dos condiciones:
- La fuente de datos de fotogramas requerida debe estar en el grupo de fuentes de datos de fotogramas opcionales de la sesión.
- El valor de MegaTrackerFrameFilter.MinInputFrameLevel debe ser mayor o igual al nivel CameraTransformType de la fuente de datos de fotogramas requerida.
Por ejemplo, para admitir seguimiento 3DoF en una sesión por defecto, se necesita:
- Agregar ThreeDofCameraDeviceFrameSource al grupo de fuentes de datos de fotogramas de la sesión.
- Modificar MegaTrackerFrameFilter.MinInputFrameLevel a ThreeDof.
Otro ejemplo, para eliminar el soporte de seguimiento 5DoF en una sesión por defecto, se necesita:
- Eliminar InertialCameraDeviceFrameSource del grupo de fuentes de datos de fotogramas de la sesión.
- Modificar MegaTrackerFrameFilter.MinInputFrameLevel a SixDof (incluso sin modificar, debido a la falta de una fuente de datos de fotogramas 5DoF, 5DoF no se utilizará).
Cuando no hay una fuente de datos de fotogramas disponible que cumpla las condiciones, el ensamblaje de la sesión fallará.
Conoce el estado actual del sistema
Bajo la configuración de sesión predeterminada, los mensajes de la interfaz de usuario se muestran en la pantalla, que contienen información sobre el estado de seguimiento de Mega.
Cuando la localización es exitosa, la información del servicio Mega incluirá el texto de estado Found; cuando falla, incluirá el texto de estado NotFound.
Los bloques cargados se mostrarán como Block [scnObj=<objName>] (<trackingStatus>): <name> (<id>). Donde <objName> es el nombre del objeto de escena correspondiente al bloque, <name> es el nombre del bloque y <id> es el ID del bloque. trackingStatus puede ser Tracking o NotTracking, indicando si el bloque está siendo rastreado actualmente.
![]()
Cuando la localización es exitosa, la información de los bloques localizados pero no cargados se mostrará como Block [scnObj=?]: <name> (<id>).
![]()
Consejo
NotFound es un estado normal, que ocurre con frecuencia durante todo el proceso de trabajo de Mega, y el seguimiento continúa cuando aparece este estado. Por lo general, no es necesario un manejo especial del estado NotFound en el desarrollo de aplicaciones.
Usando el evento MegaTrackerFrameFilter.LocalizationRespond se puede obtener el estado de localización actual, para saber si el sistema ha encontrado el objetivo de seguimiento.
El siguiente código muestra cómo usar este evento, así como métodos comunes para manejar estados excepcionales que requieren atención de la aplicación:
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 está despertando, es necesario que el usuario final espere.
}
if (status == MegaTrackerLocalizationStatus.QpsLimitExceeded)
{
// Se excedió el límite de QPS, algunos usuarios finales fallarán aleatoriamente en la localización (calidad general de seguimiento disminuida)
// En este caso, generalmente se necesita pagar para aumentar el límite de QPS y garantizar la calidad de seguimiento con el volumen actual de usuarios.
}
if (status == MegaTrackerLocalizationStatus.ApiTokenExpired)
{
// Token expirado, esto solo ocurre cuando se accede al servicio usando la interfaz de Token
// Para abordar este problema, la aplicación necesita solicitar un Token a su propio backend y llamar a MegaTrackerFrameFilter.UpdateToken para actualizarlo.
}
}
Si la aplicación encuentra frecuentemente el estado MegaTrackerLocalizationStatus.RequestTimeout, generalmente indica que la conexión de red del dispositivo al servicio es deficiente. Se recomienda optimizar el entorno de red para mejorar la calidad del seguimiento. En escenarios donde no se puede mejorar la red, se puede considerar aumentar el tiempo de espera de la solicitud.
Nota
No es posible obtener la pose devuelta por la localización a través de este evento.
De hecho, la pose devuelta por la localización no es necesaria en el desarrollo de aplicaciones. EasyAR calculará una pose más precisa a través de algoritmos locales después de que la localización regrese y la devolverá para que los desarrolladores la usen, y esta pose ya se refleja en el transform del bloque. Puede consultar Obtener los resultados de ejecución de la sesión.
Pausar y reanudar
Las funciones de seguimiento y localización de Mega se pueden pausar y reanudar por separado.
Pausar el seguimiento
Establezca MegaTrackerFrameFilter.enabled en false para pausar el seguimiento.
Por defecto, después de pausar el seguimiento, todo el contenido bajo los nodos de bloque se ocultará.
Pausar la localización
Establecer MegaTrackerFrameFilter.EnableLocalization en false para pausar la localización.
Advertencia
Pausar la localización afectará el efecto de seguimiento, generalmente no se recomienda modificarlo. Úselo bajo la guía del soporte técnico de EasyAR.
Si la localización se pausó durante la ejecución de la aplicación, asegúrese de mencionar este punto al informar problemas a EasyAR.
Servicios y control de solicitudes
Puedes controlar el comportamiento de las solicitudes de servicio modificando los parámetros del componente MegaTrackerFrameFilter.
Intervalo de solicitud y tiempo de espera
Seleccione el objeto Mega Tracker bajo la sesión, modifique las opciones bajo Request Time Parameters para ajustar el intervalo de solicitud del servicio y el tiempo de espera.
![]()
En el script, puede modificar MegaTrackerFrameFilter.RequestTimeParameters para lograr el mismo efecto.
Advertencia
Modificar el intervalo de solicitud afectará el efecto de seguimiento, generalmente no se recomienda modificarlo. Úselo bajo la guía del soporte técnico de EasyAR.
Si el intervalo de solicitud se modificó durante la ejecución de la aplicación, asegúrese de mencionar este punto al informar problemas a EasyAR.
Cambiar la base de datos de localización
Usa MegaTrackerFrameFilter.SwitchEndPoint para cambiar la base de datos de localización en tiempo de ejecución. Al usar esta interfaz, la imagen de la cámara y la sesión no se interrumpirán.
Temas relacionados
- Prácticas recomendadas de sesión de AR para Mega presenta cómo crear y configurar una sesión de AR para Mega
- Agregar objetivos de seguimiento de Mega presenta cómo agregar el bloque de objetivo de seguimiento de Mega y cómo cargar el modelo del bloque en el editor de Unity para ayudar en el desarrollo
- Agregar un grupo de fuentes de datos de fotogramas presenta cómo modificar el grupo de fuentes de datos de fotogramas de la sesión
- Obtener los resultados de ejecución de la sesión presenta cómo obtener los resultados de seguimiento del componente de sesión
- Mensajes de UI presenta cómo usar mensajes de UI para mostrar el estado de la sesión