XR_ANDROID_trackables_qr_code
Chaîne de nom
XR_ANDROID_trackables_qr_code
Type d'extension
Extension d'instance
Numéro d'extension enregistré
709
Révision
1
État de ratification
Non ratifié
Dépendances d'extension et de version
XR_ANDROID_trackables
État d'obsolescence
- Obsolète en raison de l'extension
XR_EXT_spatial_marker_tracking
Date de dernière modification
2025-02-05
État de la propriété intellectuelle
Aucune réclamation connue concernant la propriété intellectuelle.
Participants
Christopher Doer, Google
Levana Chen, Google
Jared Finder, Google
Spencer Quin, Google
Nihav Jain, Google
Diego Tipaldi, Google
Ken Mackay, Google
Daniel Guttenberg, Qualcomm
Présentation
Cette extension permet le suivi physique des codes QR et le décodage des données des codes QR.
Autorisations
Les applications Android doivent disposer de l'autorisation android.permission.SCENE_UNDERSTANDING_COARSE dans leur fichier manifeste, car cette extension dépend de XR_ANDROID_trackables et expose la géométrie de l'environnement. L'autorisation android.permission.SCENE_UNDERSTANDING_COARSE est considérée comme dangereuse.
(niveau de protection : dangereux)
Inspecter la capacité du système
La structure XrSystemQrCodeTrackingPropertiesANDROID est définie comme suit :
typedef struct XrSystemQrCodeTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsQrCodeTracking;
XrBool32 supportsQrCodeSizeEstimation;
uint16_t maxQrCodeCount;
} XrSystemQrCodeTrackingPropertiesANDROID;
Description des membres
typecorrespond au XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans le noyau OpenXR ni dans cette extension.supportsQrCodeTrackingest unXrBool32indiquant si le système actuel fournit une fonctionnalité de suivi des codes QR.supportsQrCodeSizeEstimationest unXrBool32indiquant si le système actuel fournit une estimation de la taille des codes QR.maxQrCodeCountcorrespond au nombre maximal total de codes QR qui peuvent être suivis simultanément.
Une application peut vérifier si le système est capable de suivre les codes QR en étendant XrSystemProperties avec la structure XrSystemQrCodeTrackingPropertiesANDROID lors de l'appel de xrGetSystemProperties . L'environnement d'exécution doit renvoyer XR_ERROR_FEATURE_UNSUPPORTED pour la création d'un outil de suivi des codes QR si et seulement si supportsQrCodeTracking est XR_FALSE .
Si un environnement d'exécution est compatible avec le suivi des codes QR, maxQrCodeCount doit être au moins égal à 1. Si un environnement d'exécution n'est pas compatible avec le suivi des codes QR, maxQrCodeCount doit être égal à 0.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_qr_codedoit être activée avant d'utiliser XrSystemQrCodeTrackingPropertiesANDROID. -
typedoit êtreXR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROID -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Suivre les codes QR
Cette extension ajoute XR_TRACKABLE_TYPE_QR_CODE_ANDROID à XrTrackableTypeANDROID .
L'application peut créer un XrTrackableTrackerANDROID en appelant xrCreateTrackableTrackerANDROID et en spécifiant XR_TRACKABLE_TYPE_QR_CODE_ANDROID comme type de suivi dans XrTrackableTrackerCreateInfoANDROID :: trackableType pour suivre les codes QR.
L'environnement d'exécution doit renvoyer XR_ERROR_FEATURE_UNSUPPORTED si XrTrackableTrackerCreateInfoANDROID :: trackableType est XR_TRACKABLE_TYPE_QR_CODE_ANDROID et que XrSystemQrCodeTrackingPropertiesANDROID :: supportsQrCodeTracking renvoie XR_FALSE via xrGetSystemProperties .
La structure XrTrackableQrCodeConfigurationANDROID est définie comme suit :
typedef struct XrTrackableQrCodeConfigurationANDROID {
XrStructureType type;
void* next;
XrQrCodeTrackingModeANDROID trackingMode;
float qrCodeEdgeSize;
} XrTrackableQrCodeConfigurationANDROID;
Description des membres
typecorrespond au XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans le noyau OpenXR ni dans cette extension.trackingModeest un XrQrCodeTrackingModeANDROID indiquant le mode de suivi souhaité.qrCodeEdgeSizeindique la taille du bord du code QR en mètres. Si la valeur est zéro, l'environnement d'exécution estime la taille du code QR en ligne.
L'application doit définir une configuration valide en ajoutant un XrTrackableQrCodeConfigurationANDROID à la chaîne suivante de XrTrackableTrackerCreateInfoANDROID . Sinon, l'environnement d'exécution doit renvoyer XR_ERROR_VALIDATION_FAILURE .
Si l'environnement d'exécution est compatible avec l'estimation de la taille des codes QR, l'application peut définir XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize sur 0.0 pour indiquer l'utilisation de l'estimation de la taille.
Si l'environnement d'exécution n'est pas compatible avec l'estimation de la taille des codes QR, l'application doit définir XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize sur une valeur positive. Sinon, l'environnement d'exécution doit renvoyer XR_ERROR_VALIDATION_FAILURE .
L'environnement d'exécution doit filtrer la sortie de xrGetAllTrackablesANDROID pour qu'elle corresponde à trackingMode . Si XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize n'est pas défini sur 0.0, l'environnement d'exécution doit uniquement renvoyer les codes QR qui correspondent à cette taille. Si XrTrackableQrCodeConfigurationANDROID :: qrCodeEdgeSize est défini sur 0.0, l'environnement d'exécution doit renvoyer tous les codes QR dont la taille est estimée.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_qr_codedoit être activée avant d'utiliser XrTrackableQrCodeConfigurationANDROID -
typedoit êtreXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures . Voir aussi : XrTrackableQrCodeVersionFilterQCOM -
trackingModedoit être une valeur XrQrCodeTrackingModeANDROID valide.
L'enum XrQrCodeTrackingModeANDROID décrit les modes de suivi compatibles des codes QR.
typedef enum XrQrCodeTrackingModeANDROID {
XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID = 0,
XR_QR_CODE_TRACKING_MODE_STATIC_ANDROID = 1,
XR_QR_CODE_TRACKING_MODE_ANCHORED_QCOM = 1000314000,
XR_QR_CODE_TRACKING_MODE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrQrCodeTrackingModeANDROID;
Description des énumérants
XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID: suivi des codes QR dynamiques. Ce mode offre la plus grande précision et fonctionne sur les codes QR statiques et en mouvement, mais il consomme également le plus d'énergie.XR_QR_CODE_TRACKING_MODE_STATIC_ANDROID: suivi des codes QR statiques. Ce mode est principalement utile pour les codes QR connus pour être statiques, ce qui entraîne une consommation d'énergie inférieure à celle du mode dynamique.XR_QR_CODE_TRACKING_MODE_ANCHORED_QCOM: ce mode doit être utilisé pour les codes QR statiques. Contrairement au mode statique, ce mode ne suit le code QR qu'une seule fois, puis met à jour les positions des instances suivies uniquement en fonction de la position de l'appareil. Par conséquent, le suivi continue même si le code QR sort du champ de vision du cadre de référence. Cela entraîne une consommation d'énergie minimale une fois le code QR suivi. (Ajouté par l'extensionXR_QCOM_trackables_qr_code_operations)
Obtenir des codes QR
La fonction xrGetTrackableQrCodeANDROID est définie comme suit :
XrResult xrGetTrackableQrCodeANDROID(
XrTrackableTrackerANDROID tracker,
const XrTrackableGetInfoANDROID* getInfo,
XrTrackableQrCodeANDROID* qrCodeOutput);
Description des paramètres
trackercorrespond au XrTrackableTrackerANDROID à interroger.getInfocorrespond au XrTrackableGetInfoANDROID contenant les informations utilisées pour obtenir le code QR pouvant être suivi.qrCodeOutputest un pointeur vers la structure XrTrackableQrCodeANDROID dans laquelle le code QR pouvant être suivi est renvoyé.
L'environnement d'exécution doit renvoyer XR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROID si le type de suivi du XrTrackableANDROID n'est pas XR_TRACKABLE_TYPE_QR_CODE_ANDROID ou si le type de suivi du XrTrackableTrackerANDROID n'est pas XR_TRACKABLE_TYPE_QR_CODE_ANDROID .
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_qr_codedoit être activée avant d'appeler xrGetTrackableQrCodeANDROID. -
trackerdoit être un descripteur XrTrackableTrackerANDROID valide. -
getInfodoit être un pointeur vers une structure XrTrackableGetInfoANDROID valide. -
qrCodeOutputdoit être un pointeur vers une structure XrTrackableQrCodeANDROID.
Codes renvoyés
XR_SUCCESSXR_SESSION_LOSS_PENDING
XR_ERROR_FUNCTION_UNSUPPORTEDXR_ERROR_HANDLE_INVALIDXR_ERROR_INSTANCE_LOSTXR_ERROR_LIMIT_REACHEDXR_ERROR_MISMATCHING_TRACKABLE_TYPE_ANDROIDXR_ERROR_RUNTIME_FAILUREXR_ERROR_SESSION_LOSTXR_ERROR_SIZE_INSUFFICIENTXR_ERROR_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
La structure XrTrackableQrCodeANDROID est définie comme suit :
typedef struct XrTrackableQrCodeANDROID {
XrStructureType type;
void* next;
XrTrackingStateANDROID trackingState;
XrTime lastUpdatedTime;
XrPosef centerPose;
XrExtent2Df extents;
uint32_t bufferCapacityInput;
uint32_t bufferCountOutput;
char* buffer;
} XrTrackableQrCodeANDROID;
Description des membres
typecorrespond au XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures. Aucune structure de ce type n'est définie dans le noyau OpenXR ni dans cette extension.trackingStatecorrespond au XrTrackingStateANDROID du code QR.lastUpdatedTimecorrespond auXrTimede la dernière mise à jour du code QR. SilastUpdatedTimeest modifié par rapport au dernier appel, tous les autres champs peuvent avoir été modifiés.centerPosecorrespond au XrPosef du code QR situé dans XrTrackableGetInfoANDROID ::baseSpace. Le code QR se trouve dans le plan XZ, X pointant vers la droite du code QR, Z pointant vers le bas et Y sortant du code QR comme normale.extentscorrespond aux dimensions XrExtent2Df du code QR. La limite du cadre de délimitation se trouve aux points suivants :centerPose+/- (extents/ 2).bufferCapacityInputcorrespond à la capacité dubufferou à0pour récupérer la capacité requise.bufferCountOutput: sibufferCapacityInputest0, l'environnement d'exécution écrit la taille de la mémoire tampon requise dansbufferCountOutput. Sinon, il contient le nombre total d'éléments écrits dansbuffer. Si les données du code QR n'ont pas encore été décodées, l'environnement d'exécution doit définir bufferCountOutput sur 0.bufferest un pointeur vers un tableau decharpour écrire les données décodées du code QR. Si l'application ne se soucie pas des données décodées du code QR, elle peut transmettrenullptret omettre le deuxième appel à deux appels. Les données du code QR sont renvoyées sous forme de chaîne UTF-8 terminée par une valeur nulle.- Consultez la section Paramètres de taille de la mémoire tampon pour obtenir une description détaillée de la récupération de la taille
bufferrequise.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_qr_codedoit être activée avant d'utiliser XrTrackableQrCodeANDROID -
typedoit êtreXR_TYPE_TRACKABLE_QR_CODE_ANDROID -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures . Voir aussi : XrTrackableQrCodeVersionQCOM -
trackingStatedoit être une valeur XrTrackingStateANDROID valide. - Si
bufferCapacityInputn'est pas0,bufferdoit être un pointeur vers un tableau de valeurs charbufferCapacityInput
Exemple de code pour obtenir des codes QR pouvant être suivis
L'exemple de code suivant montre comment obtenir des codes QR pouvant être suivis.
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrGetSystemProperties xrGetSystemProperties; // previously initialized
PFN_xrCreateTrackableTrackerANDROID xrCreateTrackableTrackerANDROID; // previously initialized
PFN_xrGetAllTrackablesANDROID xrGetAllTrackablesANDROID; // previously initialized
PFN_xrGetTrackableQrCodeANDROID xrGetTrackableQrCodeANDROID; // previously initialized
PFN_xrDestroyTrackableTrackerANDROID xrDestroyTrackableTrackerANDROID; // previously initialized
XrTime updateTime; // Time used for the current frame's simulation update.
XrSpace appSpace; // Space created for XR_REFERENCE_SPACE_TYPE_LOCAL.
// Inspect system capability
XrSystemQrCodeTrackingPropertiesANDROID qrCodeProperty {
.type = XR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROID,
.next = nullptr,
};
XrSystemProperties systemProperties {
.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &qrCodeProperty,
};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (!qrCodeProperty.supportsQrCodeTracking) {
// QR code tracking is not supported.
return;
}
// Create a trackable tracker for QR code tracking.
// If the runtime does not support size estimation, configures QR code edge size of 0.1m.
XrTrackableQrCodeConfigurationANDROID configuration {
.type = XR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID,
.next = nullptr,
.trackingMode = XR_QR_CODE_TRACKING_MODE_DYNAMIC_ANDROID,
.qrCodeEdgeSize = qrCodeProperty.supportsQrCodeSizeEstimation ? 0.0f : 0.1f,
};
XrTrackableTrackerCreateInfoANDROID createInfo {
.type = XR_TYPE_TRACKABLE_TRACKER_CREATE_INFO_ANDROID,
.next = &configuration,
.trackableType = XR_TRACKABLE_TYPE_QR_CODE_ANDROID
};
XrTrackableTrackerANDROID qrCodeTracker;
auto res = xrCreateTrackableTrackerANDROID(session, &createInfo, &qrCodeTracker);
if (res == XR_ERROR_PERMISSION_INSUFFICIENT) {
// Handle permission requests.
}
CHK_XR(res);
// Get QR codes.
std::vector<XrTrackableANDROID> trackables(qrCodeProperty.maxQrCodeCount);
std::vector<XrTrackableQrCodeANDROID> qrCodes(qrCodeProperty.maxQrCodeCount, {
.type = XR_TYPE_TRACKABLE_QR_CODE_ANDROID,
.next = nullptr,
.bufferCountOutput = 0,
});
uint32_t qrCodeSize = 0;
CHK_XR(xrGetAllTrackablesANDROID(qrCodeTracker, qrCodeProperty.maxQrCodeCount, &qrCodeSize,
trackables.data()));
for (int i = 0; i < qrCodeSize; i++) {
XrTrackableGetInfoANDROID getInfo {
.type = XR_TYPE_TRACKABLE_GET_INFO_ANDROID,
.next = nullptr,
.trackable = trackables.at(i),
.baseSpace = appSpace,
.time = updateTime,
};
CHK_XR(xrGetTrackableQrCodeANDROID(qrCodeTracker, &getInfo, &qrCodes[i]));
if (qrCodes[i].bufferCountOutput > 0) {
// Allocate the buffer if it is not already allocated.
if (qrCodes[i].bufferCapacityInput == 0) {
qrCodes[i].buffer = new char[qrCodes[i].bufferCountOutput];
qrCodes[i].bufferCapacityInput = qrCodes[i].bufferCountOutput;
CHK_XR(xrGetTrackableQrCodeANDROID(qrCodeTracker, &getInfo, &qrCodes[i]));
}
}
}
// Release trackable tracker.
CHK_XR(xrDestroyTrackableTrackerANDROID(qrCodeTracker));
Nouvelles commandes
Nouvelles structures
- XrTrackableQrCodeANDROID
Extension de XrSystemProperties :
Extension de XrTrackableTrackerCreateInfoANDROID :
Nouveaux enums
Nouvelles constantes enum
XR_ANDROID_TRACKABLES_QR_CODE_EXTENSION_NAMEXR_ANDROID_trackables_qr_code_SPEC_VERSIONExtension de XrStructureType :
XR_TYPE_SYSTEM_QR_CODE_TRACKING_PROPERTIES_ANDROIDXR_TYPE_TRACKABLE_QR_CODE_ANDROIDXR_TYPE_TRACKABLE_QR_CODE_CONFIGURATION_ANDROID
Extension de XrTrackableTypeANDROID :
XR_TRACKABLE_TYPE_QR_CODE_ANDROID
Problèmes
Historique des versions
Révision 1, 05/02/2025 (Levana Chen)
- Description initiale de l'extension.