Implémentation de caméra personnalisée dans unity —— Source de données d'images externes
Grâce à la source de données d'images externes (ExternalFrameSource), les développeurs peuvent étendre l'implémentation de caméra d'EasyAR Sense pour prendre en charge des appareils de réalité virtuelle spécifiques ou d'autres périphériques d'entrée. Le contenu suivant décrit la structure de type et les définitions d'interface de la source de données d'images externes.
Avant de commencer
- Comprendre les concepts fondamentaux d'une caméra personnalisée.
- Comprendre les concepts fondamentaux, les types et la méthode de sélection lors de l'exécution d'une source de trames.
Types de sources de trames externes
---
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 diagramme ci-dessus illustre la structure de type des sources de trames externes.
Selon les données d'entrée, les sources de trames externes peuvent être divisées en deux catégories principales :
- Extension d'entrée d'image et de données de mouvement des périphériques
- Implémenté en héritant de ExternalDeviceMotionFrameSource : le périphérique et son SDK fournissent un suivi de mouvement 6DoF. La transformation de la caméra virtuelle et les autres contrôles sont effectués par le SDK du périphérique.
- Implémenté en héritant de ExternalDeviceRotationFrameSource : le périphérique et son SDK fournissent un suivi de rotation 3DoF. La transformation de la caméra virtuelle et les autres contrôles sont effectués par le SDK du périphérique.
- Extension d'entrée d'image
- Implémenté en héritant de ExternalImageStreamFrameSource : fournit uniquement une entrée d'image. La transformation de la caméra virtuelle et les autres contrôles sont effectués par EasyAR.
Lors de l'intégration de ces sources de trames externes, les fonctionnalités AR disponibles diffèrent :
- Extension d'entrée d'image et de données de mouvement des périphériques ExternalDeviceMotionFrameSource
- Mega
- Suivi de mouvement (fourni par le périphérique lui-même)
- Carte spatiale éparse
- Carte spatiale dense
- Suivi d'image (avec fusion de mouvement)
- Reconnaissance d'image cloud
- Suivi d'objet (avec fusion de mouvement)
- Extension d'entrée d'image et de données de mouvement des périphériques ExternalDeviceRotationFrameSource
- Mega
- Suivi d'image (sans fusion de mouvement)
- Reconnaissance d'image cloud
- Suivi d'objet (sans fusion de mouvement)
- Extension d'entrée d'image ExternalImageStreamFrameSource
- Suivi d'image (sans fusion de mouvement)
- Reconnaissance d'image cloud
- Suivi d'objet (sans fusion de mouvement)
Définition d'interface pour les sources de données de trame externes
Lors de la création d'une source de données de trame externe, les interfaces correspondantes doivent être implémentées. Les définitions de ces interfaces et leur mode d'utilisation sont présentées ci-dessous.
Définition de l'appareil
FrameSource.IsHMD :
Définit s'il s'agit d'un casque de réalité virtuelle
Défini sur true uniquement sur les appareils de type casque.
Si l'appareil est un casque, les informations de diagnostic s'afficheront sur une planche 3D devant la caméra plutôt que sur l'écran. Certaines fonctionnalités AR fonctionnent légèrement différemment sur les casques.FrameSource.Display :
Définit le système d'affichage
Fournit des informations comme la rotation de l'affichage actuel.
Utilisez Display.DefaultSystemDisplay ou Display.DefaultHMDDisplay pour obtenir les informations d'affichage par défaut.
Généralement, Display.DefaultHMDDisplay peut être utilisé sur les casques.
Aucun paramètre supplémentaire.
Disponibilité
- FrameSource.IsAvailable :
Disponibilité
Utilisé pour déterminer si la source d'images (frame source) est utilisable.
Si une source d'images n'est pas disponible sur l'appareil d'exécution actuel ou dans l'environnement actuel, cette valeur doit êtrefalse.
Si cette valeur est égale àOptional<bool>.Empty, la coroutine FrameSource.CheckAvailability() sera appelée ; FrameSource.IsAvailable doit être mise à jour avant la fin de cette coroutine.
L'interface de disponibilité est utilisée lors de l'assemblage de la session (session) ; les composants non disponibles ne seront pas sélectionnés et leurs méthodes ne seront pas appelées pendant l'exécution de la session. - FrameSource.CheckAvailability() (optionnel) :
Coroutine pour vérifier la disponibilité de la source d'images
Appelée lorsque FrameSource.IsAvailable est égal à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. Spécifiez ExternalDeviceFrameSource.Origin.
- None : Le SDK de l'appareil ne définit pas d'origine.
L'origine sera alors automatiquement sélectionnée ou créée à partir de la scène, mais ne se déplacera pas.
La session ne prendra en charge que le mode centre SessionOrigin. Les développeurs d'applications doivent être très prudents quant à la façon dont ils placent les objets virtuels, car toutes les cibles et leur contenu se déplaceront toujours dans le système de coordonnées Unity, et certaines parties du contenu utilisateur (comme le système physique) ne fonctionneront pas correctement. Les objets placés dans le système de coordonnées mondial Unity ne pourront jamais apparaître au bon endroit dans aucune configuration.
ExternalDeviceFrameSource.Origin :
Objet d'origine
Définissez votre origine uniquement et seulement lorsque ExternalDeviceFrameSource.OriginType est Custom. Ne le redéfinissez pas dans les autres cas.
Caméra virtuelle
- FrameSource.Camera:
Caméra virtuelle
La caméra n'est pas contrôlée par la session. La transform et la matrice de projection de la caméra, ainsi que le rendu de l'arrière-plan de l'image, doivent être contrôlés par un code externe.
Cette caméra est uniquement utilisée sur les casques de réalité virtuelle pour afficher du texte de diagnostic dans le champ de vision.
Non requis lorsque ExternalDeviceFrameSource.OriginType est XROrigin. EasyAR utilisera automatiquement la caméra définie dans le framework XR d'Unity.
Caméra physique
- FrameSource.DeviceCameras :
Paramètres de la caméra physique
Caméras physiques fournissant des trames de données. Si les données proviennent de plusieurs caméras, la liste doit inclure toutes les caméras physiques.
Garantir que les paramètres sont accessibles lorsque FrameSource.CameraFrameStarted est true. - FrameSource.CameraFrameStarted :
Entrée de trame démarrée
Retourne true lorsque la caméra physique est prête à transmettre des données à EasyAR, et false après son arrêt. EasyAR ne fonctionne pas si cette valeur est false. Lorsqu'elle est true, les données de FrameSource.DeviceCameras doivent être accessibles et les trames transmises sans interruption. EasyAR émet un avertissement après une absence prolongée de trames pour faciliter le diagnostic.
Les paramètres doivent correspondre à ceux de la caméra physique réelle.
- FrameSourceCamera.CameraType :
Type de caméra physique
Utiliser "Arrière" (Rear) pour les cas non frontaux (ex: casques VR). - FrameSourceCamera.CameraOrientation :
Rotation horaire requise pour afficher l'image dans l'orientation naturelle
Plage : [0, 360). - FrameSourceCamera.FrameSize :
Dimensions de l'image - FrameSourceCamera.FrameRateRange :
Plage de fréquence d'images
x = limite inférieure, y = limite supérieure. - DeviceFrameSourceCamera.AxisSystem :
Système d'axes pour les poses et paramètres extrinsèques
Toutes les matrices doivent utiliser le même système. Effectuer une transformation des axes si nécessaire. - DeviceFrameSourceCamera.Extrinsics :
Paramètres extrinsèques
Généralement une matrice d'étalonnage. Son système d'axes doit correspondre à DeviceFrameSourceCamera.AxisSystem. Transformer les axes avant définition si incohérent.
Session démarrage et arrêt
- FrameSource.OnSessionStart(ARSession) :
traite l'événement de démarrage de session
Prend effet lorsque cette source d'images est sélectionnée lors de l'assemblage de la session.
Peut être utilisé pour une initialisation différée, effectuant ici les travaux d'initialisation spécifiques à la RA. - FrameSource.OnSessionStop() :
traite l'événement d'arrêt de session
Prend effet lorsque cette source d'images est sélectionnée lors de l'assemblage de la session.
Peut être utilisé pour détruire les ressources créées dans FrameSource.OnSessionStart(ARSession) et pendant l'exécution de la session, et restaurer l'état interne. L'appel de cette méthode est garanti avant la destruction de la session. Si la source d'images est détruite avant la session, cette méthode ne sera pas appelée et la session passera à l'état Broken.
ExternalDeviceMotionFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Pose, MotionTrackingStatus) :
Entrée des données de trame de caméraExternalDeviceRotationFrameSource.HandleCameraFrameData(DeviceFrameSourceCamera, double, Image, CameraParameters, Quaternion) :
Entrée des données de trame de caméra
Peut être appelé sur n'importe quel thread, à condition que les API du SDK de l'appareil soient thread-safe.
Ces données doivent correspondre à celles de l'exposition du capteur de caméra physique. Il est recommandé d'entrer des données à 30 ou 60 ips (images par seconde). Le taux de trame minimum acceptable est de 2, mais cela affectera le temps de réponse de certains algorithmes. Si possible, il est recommandé d'entrer des données en couleur, car cela améliore l'efficacité de Mega.
Pour une efficacité optimale, concevez la chaîne de données pour que les données YUV brutes soient transmises directement via une mémoire partagée, passez le pointeur de données directement à EasyAR, et faites attention à la propriété des données.ExternalDeviceMotionFrameSource.HandleRenderFrameData(double, Pose, MotionTrackingStatus) :
Entrée des données de trame de renduExternalDeviceRotationFrameSource.HandleRenderFrameData(double, Quaternion) :
Entrée des données de trame de rendu
Doit être appelé à chaque trame de rendu une fois que les données de l'appareil sont prêtes, sans sauter de trames. Ces données doivent correspondre à celles qui pilotent la caméra virtuelle Unity dans la même trame.
- ExternalFrameSource.TryAcquireBuffer(int) :
Tente d'acquérir un bloc mémoire depuis le pool
Ce bloc mémoire est généralement utilisé pour stocker les données d'image de la trame de caméra et les transmettre à EasyAR. - ExternalFrameSource.ReceivedFrameCount :
Nombre de trames de caméra reçues par EasyAR
EasyAR l'utilise pour vérifier l'intégrité de l'entrée des trames de caméra de l'appareil. Peut être utilisé pour le débogage. Si ce nombre cesse d'augmenter, cela indique généralement que l'appareil a cessé d'envoyer des données à EasyAR.
Unity messages
Lors de l'utilisation des messages suivants dans un script, assurez-vous que l'implémentation de la classe de base est appelée :
Prochaines étapes
- Lisez données de trame d'entrée externe pour comprendre les données de trame de caméra et de rendu
- Créez une extension d'entrée d'image-et-données-de-mouvement d'appareil
- Créez une extension d'entrée d'image