Créer une extension d’entrée de trame externe
Grâce à une source de trame externe (ExternalFrameSource), les développeurs peuvent étendre EasyAR Sense avec des implémentations de caméra personnalisées pour prendre en charge des appareils de tête spécifiques ou d’autres périphériques d’entrée. Le contenu suivant présente la structure des types de source de trame externe et les définitions d’interface.
Avant de commencer
- Comprendre les notions de base de caméra personnalisée.
- Comprendre les notions de base, les types et la méthode de sélection à l’exécution de source de trame.
Types de sources de trame externe
---
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
Le schéma ci-dessus montre la structure des types de sources de trame externe.
Selon les données d’entrée, les sources de trame externe peuvent être divisées en deux catégories :
- Extension d’entrée d’image et de données de mouvement de l’appareil
- Réalisée en héritant de ExternalDeviceMotionFrameSource : l’appareil et son SDK fournissent le suivi de mouvement 6DoF. Le transform de la caméra virtuelle et les autres contrôles sont gérés par le SDK de l’appareil.
- Réalisée en héritant de ExternalDeviceRotationFrameSource : l’appareil et son SDK fournissent le suivi de rotation 3DoF. Le transform de la caméra virtuelle et les autres contrôles sont gérés par le SDK de l’appareil.
- Extension d’entrée d’image
- Réalisée en héritant de ExternalImageStreamFrameSource : fournit uniquement une entrée d’image. Le transform de la caméra virtuelle et les autres contrôles sont gérés par EasyAR.
Lors de l’intégration de ces sources de trame externe, les fonctions AR disponibles diffèrent :
- Extension d’entrée d’image et de données de mouvement de l’appareil ExternalDeviceMotionFrameSource
- Mega
- Suivi de mouvement (fourni par l’appareil lui-même)
- Carte spatiale sparse
- Carte spatiale dense
- Suivi d’image (avec fusion de mouvement)
- Reconnaissance cloud d’image
- Suivi d’objet (avec fusion de mouvement)
- Extension d’entrée d’image et de données de mouvement de l’appareil ExternalDeviceRotationFrameSource
- Mega
- Suivi d’image (sans fusion de mouvement)
- Reconnaissance cloud d’image
- Suivi d’objet (sans fusion de mouvement)
- Extension d’entrée d’image ExternalImageStreamFrameSource
- Suivi d’image (sans fusion de mouvement)
- Reconnaissance cloud d’image
- Suivi d’objet (sans fusion de mouvement)
Définition de l’interface de la source de trame externe
Lors de la création d’une source de trame externe, vous devez implémenter les interfaces correspondantes. Les sections suivantes présentent ces définitions et leur usage.
Définition de l’appareil
FrameSource.IsHMD :
définir s’il s’agit d’un casqueDéfinissez à true uniquement sur un appareil de type casque. Si l’appareil est un casque, les informations de diagnostic seront affichées sur un panneau 3D devant la caméra plutôt que sur l’écran. Certaines fonctions AR se comportent différemment sur un casque.FrameSource.Display :
définir le système d’affichageFournit des informations sur la rotation de l’affichage en cours, etc. Vous pouvez utiliser Display.DefaultSystemDisplay ou Display.DefaultHMDDisplay pour obtenir les informations d’affichage par défaut. En général, Display.DefaultHMDDisplay peut être utilisé sur un casque.
Aucun réglage supplémentaire.
Disponibilité
- FrameSource.IsAvailable :
disponibilitéSert à déterminer si la frame source peut être utilisée. Si une frame source n’est pas disponible sur l’appareil ou l’environnement courant, cette valeur doit être false. Si cette valeur est Optional<bool>.Empty, la coroutine FrameSource.CheckAvailability() est appelée, et FrameSource.IsAvailable doit être mise à jour avant la fin de la coroutine. L’interface de disponibilité est utilisée lors de l’assemblage de la session. Les composants non disponibles ne seront pas sélectionnés et leurs méthodes ne seront pas appelées à l’exécution. - FrameSource.CheckAvailability() (optionnel) :
coroutine de vérification de disponibilitéAppelée lorsque FrameSource.IsAvailable vaut Optional<bool>.Empty. Le processus d’assemblage de la session est bloqué jusqu’à la fin de cette coroutine.
Origine de session
ExternalDeviceFrameSource.OriginType :
type d’origine- XROrigin : le SDK de l’appareil utilise Unity.XR.CoreUtils.XROrigin comme origine.
- Custom : le SDK de l’appareil utilise une origine personnalisée. Il faut alors préciser ExternalDeviceFrameSource.Origin.
- None : le SDK de l’appareil ne définit pas d’origine. L’origine sera alors automatiquement choisie ou créée dans la scène, mais ne se déplacera pas. La session ne prendra en charge que le mode centré SessionOrigin. Le développeur de l’application doit être très prudent quant au placement des objets virtuels, car tous les targets et leur contenu se déplaceront toujours dans le système de coordonnées Unity, et une partie du contenu utilisateur (par exemple le système physique) ne fonctionnera pas correctement. Les objets placés dans le système de coordonnées monde Unity ne pourront jamais s’afficher correctement dans aucune configuration.
ExternalDeviceFrameSource.Origin :
objet origineDéfinissez votre propre origine uniquement lorsque ExternalDeviceFrameSource.OriginType vaut Custom.
Caméra virtuelle
- FrameSource.Camera :
caméra virtuelleLa caméra n’est pas contrôlée par la session, et son transform, sa matrice de projection ainsi que le rendu du fond d’image doivent être gérés par le code externe. Cette caméra n’est utilisée que sur les casques, pour afficher certains textes de diagnostic devant l’utilisateur. Si ExternalDeviceFrameSource.OriginType vaut XROrigin, il n’est pas nécessaire de la définir, car EasyAR utilisera automatiquement la caméra définie dans le framework Unity XR.
Caméra physique
- FrameSource.DeviceCameras :
paramètres de caméra physiqueFournit la caméra physique à l’origine des données de trame caméra. Si les données proviennent de plusieurs caméras, la liste doit inclure toutes les caméras physiques. Il faut s’assurer que les bons paramètres de caméra physique sont disponibles lorsque FrameSource.CameraFrameStarted vaut true. - FrameSource.CameraFrameStarted :
indique si l’entrée des trames caméra a commencéRetourne true lorsque la caméra physique est prête et que les données peuvent être entrées dans EasyAR, et false après l’arrêt de la caméra physique. Lorsque FrameSource.CameraFrameStarted vaut false, EasyAR ne fonctionne pas. Lorsque FrameSource.CameraFrameStarted vaut true, il faut garantir que les données FrameSource.DeviceCameras sont accessibles et que les trames caméra sont entrées de manière continue dans EasyAR. Si EasyAR détecte une absence prolongée d’entrée de trames caméra, un avertissement s’affichera pour aider à isoler le problème.
Les paramètres de caméra physique doivent correspondre à ceux de la vraie caméra de l’appareil.
- FrameSourceCamera.CameraType :
type de caméra physiquePour une caméra non frontale, comme sur un casque, choisissez généralement la caméra arrière. - FrameSourceCamera.CameraOrientation :
angle de rotation horaire lorsque l’image de la caméra physique est affichée dans l’orientation naturelle de l’appareilPlage [0, 360). - FrameSourceCamera.FrameSize :
taille de l’image - FrameSourceCamera.FrameRateRange :
plage de fréquence d’imagesDéfinit x comme borne inférieure de la plage et y comme borne supérieure. - DeviceFrameSourceCamera.AxisSystem :
système d’axes utilisé pour le pose de la tête / de la caméra physique et les extrinsèques de la caméra physiqueToutes les matrices doivent utiliser le même système d’axes. Si les données ne correspondent pas à un système connu, il faut effectuer une transformation d’axes avant de les transmettre à EasyAR. - DeviceFrameSourceCamera.Extrinsics :
extrinsèques de la caméra physiqueEn général, il s’agit de la matrice d’étalonnage. Ses axes doivent être conformes à la définition de DeviceFrameSourceCamera.AxisSystem. Si la définition des axes des extrinsèques diffère de celle du pose réel ou ne correspond pas à la définition de DeviceFrameSourceCamera.AxisSystem, une transformation d’axes doit être effectuée avant de définir cette valeur.
Démarrage et arrêt de la session
- FrameSource.OnSessionStart(ARSession) :
gérer l’événement de démarrage de la sessionValide lorsque cette frame source est sélectionnée lors de l’assemblage de la session. Peut être utilisé pour une initialisation différée et pour effectuer dans cette méthode l’initialisation spécifique à l’AR. - FrameSource.OnSessionStop() :
gérer l’événement d’arrêt de la sessionValide lorsque cette frame source est sélectionnée lors de l’assemblage de la session. Cette méthode peut détruire les ressources créées par FrameSource.OnSessionStart(ARSession) et pendant l’exécution de la session, puis restaurer l’état interne. Cette méthode est garantie d’être appelée avant la destruction de la session. Si la frame source est détruite avant la session, elle ne sera pas appelée, et la session entrera dans l’état Broken.
Trame d’entrée
ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus) :
entrer les données de trame caméraExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion) :
entrer les données de trame caméraPeut être appelé depuis n’importe quel thread, tant que les API du SDK de l’appareil sont thread-safe. Ces données doivent correspondre aux données au moment où le capteur de la caméra physique a exposé. Il est recommandé d’entrer des données à 30 ou 60 fps. Le taux minimal acceptable est 2, mais le temps de réponse de certains algorithmes sera affecté. Si possible, il est recommandé d’entrer des données couleur, ce qui aide Mega. Pour une efficacité optimale, vous pouvez concevoir toute la chaîne de données pour transmettre directement les données YUV brutes via la mémoire partagée, puis les pointer directement dans EasyAR, tout en faisant attention à la propriété des données.ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus) :
entrer les données de trame de renduExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion) :
entrer les données de trame de renduIl faut s’assurer que cette méthode est appelée à chaque trame de rendu après que les données de l’appareil sont prêtes, sans sauter de trame. Ces données doivent correspondre à celles de la caméra virtuelle Unity courante dans la même trame que le pilote.
- ExternalFrameSource.TryAcquireBuffer(int) :
essayer d’obtenir un bloc mémoire depuis le poolCe bloc mémoire est généralement utilisé pour stocker les données d’image des trames caméra et les entrer dans EasyAR. - ExternalFrameSource.ReceivedFrameCount :
compteur de trames caméra reçues par EasyAREasyAR l’utilise pour vérifier l’état de santé de l’entrée des trames caméra de l’appareil. Cela peut être utilisé en débogage : si cette valeur n’augmente plus, cela signifie généralement que l’appareil a cessé d’entrer des données dans EasyAR.
Messages Unity
Lorsque vous utilisez les messages suivants dans un script, veillez à appeler l’implémentation de la classe de base :
Étapes suivantes
- Lire Données de trame d’entrée externes pour en savoir plus sur les données de trame caméra et les données de trame rendues
- Créer une extension d’entrée d’image et de mouvement de l’appareil
- Créer une extension d’entrée d’image