Implementacion de camara personalizada en Unity: fuente de datos de fotogramas externa
Mediante una fuente de datos de fotogramas externa (ExternalFrameSource), los desarrolladores pueden ampliar EasyAR Sense con una implementacion de camara personalizada para admitir headsets u otros dispositivos de entrada especificos. El contenido siguiente presenta la estructura de tipos y las definiciones de interfaz de la fuente de datos de fotogramas externa.
Antes de empezar
- Comprenda los conceptos basicos de camara personalizada.
- Comprenda los conceptos basicos, los tipos y el metodo de seleccion en tiempo de ejecucion de fuente de datos de fotogramas.
Tipos de fuente de datos de fotogramas externa
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class FrameSource {
<<abstract>>
}
class ExternalFrameSource {
<<abstract>>
}
class ExternalDeviceFrameSource {
<<abstract>>
}
class ExternalDeviceMotionFrameSource:::EasyAR {
<<abstract>>
}
class ExternalDeviceRotationFrameSource:::EasyAR {
<<abstract>>
}
class ExternalImageStreamFrameSource:::EasyAR {
<<abstract>>
}
ExternalFrameSource --|> FrameSource
ExternalDeviceFrameSource --|> ExternalFrameSource
ExternalDeviceMotionFrameSource --|> ExternalDeviceFrameSource
ExternalDeviceRotationFrameSource --|> ExternalDeviceFrameSource
ExternalImageStreamFrameSource --|> ExternalFrameSource
classDef EasyAR fill:#6e6ce6,stroke:#333,color:#fff
La figura anterior muestra la estructura de tipos de las fuentes de datos de fotogramas externas.
Segun los datos de entrada, las fuentes de datos de fotogramas externas se pueden dividir en dos categorias principales:
- Extension de entrada de imagen y datos de movimiento del dispositivo
- Se implementa heredando de ExternalDeviceMotionFrameSource: el dispositivo y su SDK proporcionan seguimiento de movimiento 6DoF. El transform de la camara virtual y otros controles los realiza el SDK del dispositivo.
- Se implementa heredando de ExternalDeviceRotationFrameSource: el dispositivo y su SDK proporcionan seguimiento de rotacion 3DoF. El transform de la camara virtual y otros controles los realiza el SDK del dispositivo.
- Extension de entrada de imagen
- Se implementa heredando de ExternalImageStreamFrameSource: solo proporciona entrada de imagen. El transform de la camara virtual y otros controles los realiza EasyAR.
Al integrar estos tipos de fuentes de datos de fotogramas externas, las funciones AR disponibles son diferentes:
- Extension de entrada de imagen y datos de movimiento del dispositivo ExternalDeviceMotionFrameSource
- Mega
- Seguimiento de movimiento (proporcionado por el propio dispositivo)
- Mapa espacial disperso
- Mapa espacial denso
- Seguimiento de imagen (admite fusion de movimiento)
- Reconocimiento de imagen en la nube
- Seguimiento de objetos (admite fusion de movimiento)
- Extension de entrada de imagen y datos de movimiento del dispositivo ExternalDeviceRotationFrameSource
- Mega
- Seguimiento de imagen (no admite fusion de movimiento)
- Reconocimiento de imagen en la nube
- Seguimiento de objetos (no admite fusion de movimiento)
- Extension de entrada de imagen ExternalImageStreamFrameSource
- Seguimiento de imagen (no admite fusion de movimiento)
- Reconocimiento de imagen en la nube
- Seguimiento de objetos (no admite fusion de movimiento)
Definicion de interfaces de fuente de datos de fotogramas externa
Al crear una fuente de datos de fotogramas externa, debe implementar las interfaces relacionadas. A continuacion se presentan sus definiciones y metodos de uso.
Definicion del dispositivo
FrameSource.IsHMD:
Define si es un headset
Establezcalo en true si y solo si el dispositivo es un headset.
Si el dispositivo es un headset, la informacion de diagnostico se mostrara en un panel 3D frente a la camara, no en la pantalla. Algunas funciones AR funcionan de forma ligeramente diferente en headsets.FrameSource.Display:
Define el sistema de visualizacion
Proporciona informacion como la rotacion de la pantalla actual.
Puede usar Display.DefaultSystemDisplay o Display.DefaultHMDDisplay para obtener la informacion de visualizacion predeterminada. Normalmente puede usar Display.DefaultHMDDisplay en un headset.
Sin configuracion adicional.
Disponibilidad
- FrameSource.IsAvailable:
Disponibilidad (Availability)
Se usa para determinar si el frame source se puede usar.
Si un frame source no esta disponible en el dispositivo o entorno de ejecucion actual, este valor debe ser false.
Si este valor es Optional<bool>.Empty, se llamara a la corrutina FrameSource.CheckAvailability(), y FrameSource.IsAvailable debe actualizarse antes de que la corrutina termine.
La interfaz de disponibilidad se usa durante el ensamblaje de la session. Los componentes no disponibles no se seleccionaran y sus metodos no se llamaran durante la ejecucion de la session. - FrameSource.CheckAvailability() (opcional):
Corrutina para comprobar si el frame source esta disponible
Se llama cuando FrameSource.IsAvailable es Optional<bool>.Empty. Antes de que esta corrutina termine, el proceso de ensamblaje de la session quedara bloqueado.
Origen de la session
ExternalDeviceFrameSource.OriginType:
Tipo de origen- XROrigin: el SDK del dispositivo usa Unity.XR.CoreUtils.XROrigin como origen.
- Custom: el SDK del dispositivo usa un origen personalizado. Debe especificarse ExternalDeviceFrameSource.Origin.
- None: el SDK del dispositivo no define un origen.
En este caso, el origen se seleccionara o creara automaticamente en la escena, pero no se movera.
La session solo admitira el modo central SessionOrigin. Los desarrolladores de la aplicacion deben tener mucho cuidado con la colocacion de objetos virtuales, porque todos los targets y el contenido bajo ellos se moveran siempre en el sistema de coordenadas de Unity, y parte del contenido del usuario, como el sistema fisico, no funcionara correctamente. Los objetos colocados en el sistema de coordenadas del mundo de Unity nunca podran mostrarse en la posicion correcta bajo ninguna configuracion.
ExternalDeviceFrameSource.Origin:
Objeto de origen
Defina su propio origen si y solo si ExternalDeviceFrameSource.OriginType es Custom. En otros casos no es necesario redefinirlo.
Camara virtual
- FrameSource.Camera:
Camara virtual
La camara no esta controlada por la session. El transform y la matriz de proyeccion de la camara, asi como el renderizado del fondo de imagen, deben controlarse mediante codigo externo.
Esta camara solo se usara en headsets para mostrar texto de diagnostico delante de los ojos.
Cuando ExternalDeviceFrameSource.OriginType es XROrigin, no es necesario definirla; EasyAR usara automaticamente la camara definida en el framework Unity XR.
Camara fisica
- FrameSource.DeviceCameras:
Parametros de camara fisica
Proporciona la camara fisica de los datos de fotogramas de camara. Si los datos de fotogramas de camara los proporcionan varias camaras, la lista debe incluir todas las camaras fisicas.
Debe asegurarse de que los parametros correctos de la camara fisica se puedan obtener cuando FrameSource.CameraFrameStarted sea true. - FrameSource.CameraFrameStarted:
Si ha empezado la entrada de fotogramas de camara
Devuelve true despues de que la camara fisica este lista y pueda introducir datos en EasyAR, y devuelve false despues de que la camara fisica deje de funcionar. Cuando FrameSource.CameraFrameStarted es false, EasyAR no funcionara. Cuando FrameSource.CameraFrameStarted es true, debe garantizarse que los datos de FrameSource.DeviceCameras sean accesibles y que se introduzcan de forma continua datos de fotogramas de camara en EasyAR. Si EasyAR detecta que no hay entrada continua de fotogramas de camara durante mucho tiempo, mostrara una advertencia para ayudar al usuario a separar causas cuando la funcion no responde.
Los parametros de la camara fisica deben coincidir con los de la camara real del dispositivo.
- FrameSourceCamera.CameraType:
Tipo de camara fisica
Para casos que normalmente no son de camara frontal, como en headsets, seleccione camara trasera. - FrameSourceCamera.CameraOrientation:
Angulo que debe rotar en sentido horario la imagen de la camara fisica al mostrarse en la orientacion natural del dispositivo
El rango es [0, 360). - FrameSourceCamera.FrameSize:
Tamano de imagen - FrameSourceCamera.FrameRateRange:
Rango de frame rate
Define x como el limite inferior del rango de frame rate e y como el limite superior. - DeviceFrameSourceCamera.AxisSystem:
Sistema de ejes usado por el pose de cabeza/camara fisica y las extrinsecas de la camara fisica
Todas las matrices deben usar el mismo sistema de ejes. Si la definicion de los datos no coincide con un sistema conocido, debe realizar una transformacion de ejes antes de pasarlos a EasyAR. - DeviceFrameSourceCamera.Extrinsics:
Extrinsecas de la camara fisica
Normalmente es la matriz calibrada. Sus ejes deben ajustarse a la definicion de DeviceFrameSourceCamera.AxisSystem. Si la definicion de ejes de las extrinsecas es distinta de la definicion de ejes del pose real, o si no se ajustan a la definicion de DeviceFrameSourceCamera.AxisSystem, debe realizar una transformacion de ejes antes de establecer este valor.
Inicio y detencion de la session
- FrameSource.OnSessionStart(ARSession):
Procesa el evento de inicio de la session
Es valido cuando este frame source se selecciona durante el ensamblaje de la session.
Puede usarse para inicializacion diferida y para realizar inicializacion especifica de AR en este metodo. - FrameSource.OnSessionStop():
Procesa el evento de detencion de la session
Es valido cuando este frame source se selecciona durante el ensamblaje de la session.
Puede usar este metodo para destruir los recursos creados por FrameSource.OnSessionStart(ARSession) y durante la ejecucion de la session, y restaurar el estado interno. Este metodo tiene garantizada su llamada antes de que la session se destruya. Si el frame source se destruye antes que la session, no se llamara y la session entrara en el estado Broken.
Entrada de fotogramas
ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus):
Introduce datos de fotogramas de camaraExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion):
Introduce datos de fotogramas de camara
Puede llamarse desde cualquier hilo siempre que las API del SDK del dispositivo sean thread-safe.
Estos datos deben coincidir con los datos en el momento de exposicion del sensor de la camara fisica. Se recomienda introducir datos a 30 o 60 fps. El frame rate minimo aceptable es 2, pero el tiempo de respuesta de algunos algoritmos se vera afectado. Siempre que se pueda obtener, se recomienda introducir datos en color, lo que ayuda al efecto de Mega.
Para lograr la maxima eficiencia, puede disenar toda la cadena de datos para que los datos YUV originales se transmitan directamente mediante memoria compartida, pasar directamente el puntero de datos a EasyAR y prestar atencion a la propiedad de los datos.ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus):
Introduce datos de fotogramas de renderizadoExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion):
Introduce datos de fotogramas de renderizado
Debe asegurarse de llamarlo en cada fotograma de renderizado despues de que los datos del dispositivo esten listos, sin saltar fotogramas. Estos datos deben coincidir con los datos de la camara virtual de Unity actual dentro del mismo fotograma que impulsa el driver.
- ExternalFrameSource.TryAcquireBuffer(int):
Intenta obtener un bloque de memoria del pool de memoria
Este bloque de memoria se usa normalmente para almacenar los datos de imagen de los fotogramas de camara e introducirlos en EasyAR. - ExternalFrameSource.ReceivedFrameCount:
Contador de fotogramas de camara recibidos por EasyAR
EasyAR lo usa para comprobar la salud de la entrada de fotogramas de la camara del dispositivo. Puede usarse durante la depuracion; si este valor deja de crecer, normalmente indica que el dispositivo ha dejado de introducir datos en EasyAR.
Mensajes de Unity
Al usar los siguientes mensajes en el script, debe tener cuidado de asegurarse de que se llama a la implementacion de la clase base:
Pasos siguientes
- Lea Datos de fotogramas de entrada externos para conocer los datos de fotogramas de camara y los datos de fotogramas de renderizado
- Cree una extension de entrada de imagen y datos de movimiento del dispositivo
- Cree una extension de entrada de imagen