XR_ANDROID_trackables_marker
Chaîne de nom
XR_ANDROID_trackables_marker
Type d'extension
Extension d'instance
Numéro d'extension enregistré
708
Révision
1
État de ratification
Non ratifié
Dépendances d'extension et de version
XR_ANDROID_trackables
État d'abandon
- Obsolète en raison de l'extension
XR_EXT_spatial_marker_tracking
Date de dernière modification
03/07/2025
État de la propriété intellectuelle
Aucune réclamation connue concernant la propriété intellectuelle.
Participants
Christopher Doer, Google
Diego Tipaldi, Google
Levana Chen, Google
Jared Finder, Google
Spencer Quin, Google
Nihav Jain, Google
Ken Mackay, Google
Daniel Guttenberg, Qualcomm
Présentation
Cette extension permet le suivi des marqueurs physiques et permet aux applications d'associer efficacement du contenu XR à des marqueurs physiques.
L'extension est compatible avec les types de marqueurs courants, en particulier les marqueurs ArUco et April. Elle permet aux environnements d'exécution de prendre en charge l'estimation de la taille des marqueurs.
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 une autorisation dangereuse, c'est-à-dire que les applications doivent la demander explicitement.
(niveau de protection : dangereux)
Inspecter la capacité du système
La structure XrSystemMarkerTrackingPropertiesANDROID est définie comme suit :
typedef struct XrSystemMarkerTrackingPropertiesANDROID {
XrStructureType type;
void* next;
XrBool32 supportsMarkerTracking;
XrBool32 supportsMarkerSizeEstimation;
uint16_t maxMarkerCount;
} XrSystemMarkerTrackingPropertiesANDROID;
Description des membres
typeest le 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. Pour en savoir plus sur la chaîne de structures, consultez la structure en cours d'extension ( XrSystemProperties ).supportsMarkerTrackingest unXrBool32indiquant si le système actuel offre une fonctionnalité de suivi des marqueurs.supportsMarkerSizeEstimationest unXrBool32indiquant si le système actuel offre une fonctionnalité d'estimation de la taille des marqueurs.maxMarkerCountest le nombre maximal de marqueurs que l'environnement d'exécution peut suivre en même temps.
Une application peut vérifier si le système est capable de suivre les marqueurs en étendant XrSystemProperties avec la structure XrSystemMarkerTrackingPropertiesANDROID lors de l'appel de xrGetSystemProperties . L'environnement d'exécution doit renvoyer XR_ERROR_FEATURE_UNSUPPORTED pour la création du suivi des marqueurs si et seulement si supportsMarkerTracking est XR_FALSE .
Si un environnement d'exécution est compatible avec le suivi des marqueurs, maxMarkerCount doit être au moins égal à 1.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'utiliser XrSystemMarkerTrackingPropertiesANDROID. -
typedoit êtreXR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROID -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures
Suivi des marqueurs
Cette extension ajoute XR_TRACKABLE_TYPE_MARKER_ANDROID à XrTrackableTypeANDROID .
L'application crée un XrTrackableTrackerANDROID en appelant xrCreateTrackableTrackerANDROID et en spécifiant XR_TRACKABLE_TYPE_MARKER_ANDROID comme type de suivi dans XrTrackableTrackerCreateInfoANDROID :: trackableType, ainsi qu'en définissant une configuration valide en ajoutant un XrTrackableMarkerConfigurationANDROID à la chaîne suivante de XrTrackableTrackerCreateInfoANDROID .
L'environnement d'exécution doit renvoyer XR_ERROR_FEATURE_UNSUPPORTED si XrTrackableTrackerCreateInfoANDROID :: trackableType est XR_TRACKABLE_TYPE_MARKER_ANDROID et que XrSystemMarkerTrackingPropertiesANDROID :: supportsMarkerTracking renvoie XR_FALSE via xrGetSystemProperties .
La structure XrTrackableMarkerConfigurationANDROID est définie comme suit :
typedef struct XrTrackableMarkerConfigurationANDROID {
XrStructureType type;
void* next;
XrTrackableMarkerTrackingModeANDROID trackingMode;
uint32_t databaseCount;
const XrTrackableMarkerDatabaseANDROID* databases;
} XrTrackableMarkerConfigurationANDROID;
Description des membres
typeest le XrStructureType de cette structure.nextestNULLou un pointeur vers la structure suivante dans une chaîne de structures.trackingModeest un XrTrackableMarkerTrackingModeANDROID indiquant le mode de suivi souhaité.databaseCountest unuint32_tdécrivant le nombre d'éléments dans le tableaudatabases.databasesest un pointeur vers un tableau de XrTrackableMarkerDatabaseANDROID , contenant chacun les marqueurs souhaités d'un dictionnaire donné à suivre.
L'application doit définir une configuration valide en ajoutant un XrTrackableMarkerConfigurationANDROID à la chaîne XrTrackableTrackerCreateInfoANDROID :: next lors de l'appel de xrCreateTrackableTrackerANDROID avec XrTrackableTrackerCreateInfoANDROID :: trackableType défini sur XR_TRACKABLE_TYPE_MARKER_ANDROID . Sinon, si le type de suivi est défini comme ci-dessus, mais que la structure de configuration n'est pas présente ou n'est pas valide, l'environnement d'exécution doit renvoyer XR_ERROR_VALIDATION_FAILURE .
Si un environnement d'exécution est compatible avec l'estimation de la taille des marqueurs, l'application peut définir XrTrackableMarkerDatabaseEntryANDROID :: edgeSize sur 0 dans XrTrackableMarkerDatabaseANDROID :: entries pour indiquer l'utilisation de l'estimation de la taille. Sinon, l'application doit définir XrTrackableMarkerDatabaseEntryANDROID :: edgeSize sur une valeur positive, ou 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 et à XrTrackableMarkerDatabaseEntryANDROID :: edgeSize .
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'utiliser XrTrackableMarkerConfigurationANDROID. -
typedoit êtreXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures -
trackingModedoit être une valeur XrTrackableMarkerTrackingModeANDROID valide. -
databasesdoit être un pointeur vers un tableau dedatabaseCountstructures XrTrackableMarkerDatabaseANDROID valides. - Le
databaseCountparamètre doit être supérieur à0
L'enum XrTrackableMarkerTrackingModeANDROID décrit les modes de suivi des marqueurs compatibles.
typedef enum XrTrackableMarkerTrackingModeANDROID {
XR_TRACKABLE_MARKER_TRACKING_MODE_DYNAMIC_ANDROID = 0,
XR_TRACKABLE_MARKER_TRACKING_MODE_STATIC_ANDROID = 1,
XR_TRACKABLE_MARKER_TRACKING_MODE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrTrackableMarkerTrackingModeANDROID;
Description des énumérants
XR_TRACKABLE_MARKER_TRACKING_MODE_DYNAMIC_ANDROID: suivi des marqueurs dynamiques. Ce mode offre la plus grande justesse et fonctionne sur les repères statiques et en mouvement, mais il consomme également le plus d'énergie.XR_TRACKABLE_MARKER_TRACKING_MODE_STATIC_ANDROID: suivi des marqueurs statiques. Ce mode est principalement utile pour les marqueurs connus pour être statiques, ce qui entraîne une consommation d'énergie inférieure à celle du mode dynamique.
La structure XrTrackableMarkerDatabaseANDROID définit un dictionnaire et les ID de marqueurs correspondants à suivre.
typedef struct XrTrackableMarkerDatabaseANDROID {
XrTrackableMarkerDictionaryANDROID dictionary;
uint32_t entryCount;
const XrTrackableMarkerDatabaseEntryANDROID* entries;
} XrTrackableMarkerDatabaseANDROID;
Description des membres
dictionaryest le XrTrackableMarkerDictionaryANDROID auquel appartiennent toutes lesentries.entryCountest un uint32_t décrivant le nombre d'éléments dans le tableauentries. L'application peut définirentryCountsur0pour suivre tous les marqueurs dudictionary.entriesest un pointeur vers un tableau de XrTrackableMarkerDatabaseEntryANDROID , contenant chacun la configuration d'un marqueur à suivre.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'utiliser XrTrackableMarkerDatabaseANDROID. -
dictionarydoit être une valeur XrTrackableMarkerDictionaryANDROID valide. - Si
entryCountn'est pas0,entriesdoit être un pointeur vers un tableau deentryCountstructures XrTrackableMarkerDatabaseEntryANDROID.
L'enum XrTrackableMarkerDictionaryANDROID décrit les dictionnaires de marqueurs compatibles.
typedef enum XrTrackableMarkerDictionaryANDROID {
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_4X4_50_ANDROID = 0,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_4X4_100_ANDROID = 1,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_4X4_250_ANDROID = 2,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_4X4_1000_ANDROID = 3,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_5X5_50_ANDROID = 4,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_5X5_100_ANDROID = 5,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_5X5_250_ANDROID = 6,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_5X5_1000_ANDROID = 7,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_6X6_50_ANDROID = 8,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_6X6_100_ANDROID = 9,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_6X6_250_ANDROID = 10,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_6X6_1000_ANDROID = 11,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_7X7_50_ANDROID = 12,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_7X7_100_ANDROID = 13,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_7X7_250_ANDROID = 14,
XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_7X7_1000_ANDROID = 15,
XR_TRACKABLE_MARKER_DICTIONARY_APRILTAG_16H5_ANDROID = 16,
XR_TRACKABLE_MARKER_DICTIONARY_APRILTAG_25H9_ANDROID = 17,
XR_TRACKABLE_MARKER_DICTIONARY_APRILTAG_36H10_ANDROID = 18,
XR_TRACKABLE_MARKER_DICTIONARY_APRILTAG_36H11_ANDROID = 19,
XR_TRACKABLE_MARKER_DICTIONARY_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrTrackableMarkerDictionaryANDROID;
La structure XrTrackableMarkerDatabaseEntryANDROID configure un seul ID de marqueur d'un dictionnaire.
typedef struct XrTrackableMarkerDatabaseEntryANDROID {
int32_t id;
float edgeSize;
} XrTrackableMarkerDatabaseEntryANDROID;
Description des membres
idest l'ID de marqueur tel qu'il est indiqué dans le dictionnaire.edgeSizereprésente la taille du bord du marqueur en mètres. Si l'environnement d'exécution est compatible avec l'estimation de la taille des marqueurs, l'application peut définir cette valeur sur zéro, et la taille du marqueur sera estimée en ligne. Si cette valeur est définie sur zéro, mais que l'environnement d'exécution n'est pas compatible avec l'estimation de la taille des marqueurs, l'environnement d'exécution doit renvoyerXR_ERROR_VALIDATION_FAILURE.
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'utiliser XrTrackableMarkerDatabaseEntryANDROID.
Obtenir les marqueurs
La fonction xrGetTrackableMarkerANDROID est définie comme suit :
XrResult xrGetTrackableMarkerANDROID(
XrTrackableTrackerANDROID tracker,
const XrTrackableGetInfoANDROID* getInfo,
XrTrackableMarkerANDROID* markerOutput);
Description des paramètres
trackerest le XrTrackableTrackerANDROID à interroger.getInfoest le XrTrackableGetInfoANDROID contenant les informations utilisées pour obtenir le marqueur suivi.markerOutputest un pointeur vers la structure XrTrackableMarkerANDROID dans laquelle le marqueur 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_MARKER_ANDROID , ou si le type de suivi du XrTrackableTrackerANDROID n'est pas XR_TRACKABLE_TYPE_MARKER_ANDROID .
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'appeler xrGetTrackableMarkerANDROID -
trackerdoit être un descripteur XrTrackableTrackerANDROID valide. -
getInfodoit être un pointeur vers une structure XrTrackableGetInfoANDROID valide. -
markerOutputdoit être un pointeur vers une structure XrTrackableMarkerANDROID.
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_TIME_INVALIDXR_ERROR_VALIDATION_FAILURE
La structure XrTrackableMarkerANDROID est définie comme suit :
typedef struct XrTrackableMarkerANDROID {
XrStructureType type;
void* next;
XrTrackingStateANDROID trackingState;
XrTime lastUpdatedTime;
XrTrackableMarkerDictionaryANDROID dictionary;
int32_t markerId;
XrPosef centerPose;
XrExtent2Df extents;
} XrTrackableMarkerANDROID;
Description des membres
typeest le 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.trackingStateest le XrTrackingStateANDROID du marqueur.lastUpdatedTimeest leXrTimede la dernière mise à jour du marqueur.dictionaryest le XrTrackableMarkerDictionaryANDROID du marqueur.markerIdest l'ID de marqueur tel qu'il est indiqué dans le dictionnaire.centerPoseest le XrPosef du marqueur situé dans XrTrackableGetInfoANDROID ::baseSpace. Le marqueur se trouve dans le plan XZ, avec X pointant vers la droite du marqueur, Z pointant vers le bas et Y sortant du marqueur comme normale.extentscorrespond aux dimensions XrExtent2Df du marqueur. La limite du cadre de délimitation se trouve aux points suivants :centerPose+/- (extents/ 2).
Utilisation valide (implicite)
- L'extension
XR_ANDROID_trackables_markerdoit être activée avant d'utiliser XrTrackableMarkerANDROID -
typedoit êtreXR_TYPE_TRACKABLE_MARKER_ANDROID -
nextdoit êtreNULLou un pointeur valide vers la structure suivante dans une chaîne de structures -
trackingStatedoit être une valeur XrTrackingStateANDROID valide. -
dictionarydoit être une valeur XrTrackableMarkerDictionaryANDROID valide.
Exemple de code pour obtenir des marqueurs suivis
L'exemple de code suivant montre comment obtenir des marqueurs 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_xrGetTrackableMarkerANDROID xrGetTrackableMarkerANDROID; // 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
XrSystemMarkerTrackingPropertiesANDROID markerProperty {
.type = XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROID,
.next = nullptr,
};
XrSystemProperties systemProperties {
.type = XR_TYPE_SYSTEM_PROPERTIES,
.next = &markerProperty,
};
CHK_XR(xrGetSystemProperties(instance, systemId, &systemProperties));
if (!markerProperty.supportsMarkerTracking) {
// Marker tracking is not supported.
return;
}
// Create a trackable tracker for marker tracking.
// If the runtime does not support size estimation, configures marker edge size of 0.1m.
XrTrackableMarkerDatabaseEntryANDROID markerEntries {
.id = 0,
.edgeSize = markerProperty.supportsMarkerSizeEstimation ? 0.0f : 0.1f,
};
XrTrackableMarkerDatabaseANDROID markerDatabases {
.dictionary = XR_TRACKABLE_MARKER_DICTIONARY_ARUCO_4X4_50_ANDROID,
.entryCount = 1,
.entries = &markerEntries,
};
XrTrackableMarkerConfigurationANDROID configuration {
.type = XR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID,
.next = nullptr,
.trackingMode = XR_TRACKABLE_MARKER_TRACKING_MODE_DYNAMIC_ANDROID,
.databaseCount = 1,
.databases = &markerDatabases,
};
XrTrackableTrackerCreateInfoANDROID createInfo {
.type = XR_TYPE_TRACKABLE_TRACKER_CREATE_INFO_ANDROID,
.next = &configuration,
.trackableType = XR_TRACKABLE_TYPE_MARKER_ANDROID,
};
XrTrackableTrackerANDROID markerTracker;
auto res = xrCreateTrackableTrackerANDROID(session, &createInfo, &markerTracker);
if (res == XR_ERROR_PERMISSION_INSUFFICIENT) {
// Handle permission requests.
}
CHK_XR(res);
// Get markers.
std::vector<XrTrackableANDROID> trackables(markerProperty.maxMarkerCount);
std::vector<XrTrackableMarkerANDROID> markers(markerProperty.maxMarkerCount, {
.type = XR_TYPE_TRACKABLE_MARKER_ANDROID,
.next = nullptr,
});
uint32_t markerSize = 0;
CHK_XR(xrGetAllTrackablesANDROID(markerTracker, markerProperty.maxMarkerCount, &markerSize,
trackables.data()));
for (int i = 0; i < markerSize; i++) {
XrTrackableGetInfoANDROID getInfo {
.type = XR_TYPE_TRACKABLE_GET_INFO_ANDROID,
.next = nullptr,
.trackable = trackables[i],
.baseSpace = appSpace,
.time = updateTime,
};
CHK_XR(xrGetTrackableMarkerANDROID(markerTracker, &getInfo, &markers[i]));
// Handle markers.
}
// Release trackable tracker.
CHK_XR(xrDestroyTrackableTrackerANDROID(markerTracker));
Nouvelles commandes
Nouvelles structures
- XrTrackableMarkerANDROID
- XrTrackableMarkerDatabaseANDROID
- XrTrackableMarkerDatabaseEntryANDROID
Extension de XrSystemProperties :
Extension de XrTrackableTrackerCreateInfoANDROID :
Nouveaux enums
Nouvelles constantes d'enum
XR_ANDROID_TRACKABLES_MARKER_EXTENSION_NAMEXR_ANDROID_trackables_marker_SPEC_VERSIONExtension de XrStructureType :
XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_ANDROIDXR_TYPE_TRACKABLE_MARKER_ANDROIDXR_TYPE_TRACKABLE_MARKER_CONFIGURATION_ANDROID
Extension de XrTrackableTypeANDROID :
XR_TRACKABLE_TYPE_MARKER_ANDROID
Problèmes
Historique des versions
Révision 1, 03/07/2025 (Levana Chen)
- Description initiale de l'extension.