Actualités sur les produits

Créer un guide touristique en réalité mixte avec Android XR, l'API Geospatial et Gemini

Temps de lecture : 6 min

Lors de la conférence Google I/O de cette année, nous avons annoncé une mise à jour pour les expériences spatiales : l'API Geospatial est désormais disponible en version preview dans ARCore pour Jetpack XR. En intégrant le système VPS (Visual Positioning System) de Google à Android XR, Android XR permet d'ancrer du contenu numérique dans le monde physique avec une précision inférieure au mètre et une orientation précise dans les zones compatibles*. Pour explorer les possibilités offertes par l'API Geospatial, notre équipe a créé une démo : la visite géospatiale XR.

Imaginez que vous arrivez dans une nouvelle ville, que vous mettez une paire de lunettes XR filaires (comme les futures XREAL Project Aura) et que vous êtes instantanément accompagné par un guide local bien informé. Plus besoin de regarder une carte en 2D : des modèles 3D vous guident en douceur, et une voix intelligente vous parle des monuments historiques qui se trouvent juste devant vous. Nous avons combiné les API Geospatial, l'API Gemini avec Firebase AI Logic, l'ancrage Google Maps et le SDK Jetpack XR pour créer une expérience de visite à pied immersive et mains libres.

Clause de non-responsabilité : La vidéo et l'application Tour Guide sont fournies à des fins de démonstration uniquement. Certaines séquences ont été raccourcies. Le matériel représenté peut être en cours de développement. Les informations détaillées sur le produit final peuvent varier.

Examinons les détails de l'implémentation et voyons comment nous avons associé ces API pour créer une expérience spatiale à l'échelle mondiale.

1. Localiser l'utilisateur avec l'API ARCore Geospatial (VPS)

Améliorez votre expérience de navigation en XR en combinant la puissance du GPS avec la précision du VPS. La précision et l'orientation exacte du VPS permettent d'aligner les points de cheminement 3D sur le monde physique.

C'est pourquoi l'API Geospatial sur Android XR peut vous aider à créer des expériences personnalisées. En utilisant la vision par ordinateur avancée, le VPS tente de fournir une GeospatialPose (incluant la latitude, la longitude et le cap) plus précise que le GPS.

Voici comment nous récupérons la pose géospatiale de l'utilisateur en mappant l'orientation de l'appareil à une coordonnée géospatiale :

// Retrieve the current geospatial pose from the ARCore session
val result = geospatial.createGeospatialPoseFromPose(arDevice.state.value.devicePose)
if (result is CreateGeospatialPoseFromPoseSuccess) {
    val pose = result.pose
    Log.d("VPS", "Accurate Location: ${pose.latitude}, ${pose.longitude}")
}

Comme l'expérience globale dépend de cette précision, nous surveillons les valeurs horizontalAccuracy et orientationYawAccuracy jusqu'à ce qu'elles atteignent nos seuils. Si l'utilisateur se trouve à l'intérieur ou dans une zone non reconnue, nous l'invitons à se rendre dans un espace public extérieur et à regarder autour de lui.

2. Créer l'itinéraire avec l'API Gemini et l'ancrage Google Maps

Une fois que nous avons une position, nous utilisons l'API Gemini avec Firebase AI Logic pour demander au modèle Gemini d'agir comme un guide touristique local. Nous transmettons les coordonnées de l'utilisateur au modèle et lui demandons de générer une réponse JSON structurée contenant les visites à pied à proximité :

   val configForTools = ToolConfig(
      functionCallingConfig = null,
      retrievalConfig = retrievalConfig {
        latLng = FirebaseLatLng(pose.latitude, pose.longitude)
        languageCode = "en"
      }
    )

    val responseJsonSchema = Schema.obj(
      mapOf(
        "locationIntro" to Schema.string(),
        "tours" to Schema.array(
          Schema.obj(
            mapOf(
              "title" to Schema.string(),
              "description" to Schema.string(),
              "stops" to Schema.array(
                Schema.obj(
                  mapOf(
                    "name" to Schema.string(),
                    "detailedName" to Schema.string(),
                    "description" to Schema.string()
                  )
                )
              )
            )
          )
        )
      )
    )

    val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
      modelName = "gemini-3.5-flash",
      tools = listOf(Tool.googleMaps()),
      generationConfig = generationConfig {
        responseMimeType = "application/json"
        responseSchema = responseJsonSchema
      }
    )

   val result = model.generateContent("The user is at latitude ${pose.latitude} and longitude ${pose.longitude}. Generate exactly 3 diverse tours near this location (e.g., historical, food, nature). All tour ideas should be walking distance only.")

Les grands modèles de langage sont très efficaces pour générer des descriptions détaillées, mais ils peuvent parfois halluciner des coordonnées de latitude/longitude exactes. Pour résoudre ce problème, nous avons utilisé l'ancrage Google Maps pour ancrer l'IA.

3. Une voix pour vous guider : Gemini 2.5 TTS

Pour que le guide touristique semble vraiment présent, nous avons implémenté des voix off dynamiques.

Grâce à gemini-2.5-flash-tts model, nous pouvons configurer notre configuration de génération de modèle pour qu'elle renvoie nativement des données audio au lieu de simplement du texte. Voici comment demander le ResponseModality.AUDIO :

val ttsModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-2.5-flash-tts",
        generationConfig = generationConfig {
            // Instruct the model to return Audio
            responseModalities = listOf(ResponseModality.AUDIO)
        }
    )

val response = ttsModel.generateContent("Say in a neutral but positive voice:\n$prompt")

// Extract the raw audio bytes from the response
val audioBytes = response.candidates.firstOrNull()?.content?.parts
    ?.filterIsInstance<InlineDataPart>()
    ?.firstOrNull { it.mimeType.contains("audio") }?.inlineData

4. Donner vie à votre application en 3D avec Jetpack XR

La dernière pièce du puzzle consiste à afficher ces données dans le champ de vision de l'utilisateur. Le SDK Jetpack XR permet de passer de manière intuitive d'une UI Android 2D à l'informatique spatiale.

Nous avons utilisé Jetpack Compose pour XR afin de créer des composants spatiaux. Pour représenter les points d'intérêt de la visite, nous avons créé un composable appelé InfoSphere, qui contient un GltfModel d'un globe 3D qui flotte dans l'espace et avec lequel l'utilisateur peut interagir pour afficher des informations.

Le SDK Jetpack XR nous permet de placer des modèles 3D à côté de l'interface utilisateur Compose à l'aide de SpatialBox et de SceneCoreEntity. Nous avons également utilisé InteractableComponent pour répondre aux gestes des utilisateurs.

En combinant AnimatedSpatialVisibility pour les surfaces d'UI Compose traditionnelles avec les éléments 3D SceneCoreEntity, nous pouvons intégrer parfaitement les données dans le monde physique.

@Composable
fun InfoSphere(
    content: InfoBubbleContent,
    session: Session,
    sphereModel: GltfModel,
    isSelected: Boolean,
    onClick: () -> Unit
) {
    // SpatialBox lets us arrange 3D components and SpatialPanels together
    SpatialBox(
        SubspaceModifier
            .offset(x = 2.dp, y = 1.dp, z = (-3).dp) // Positioned in 3D space
    ) {
        // Smoothly animate the visibility of our 2D Compose UI Panel
        AnimatedSpatialVisibility(visible = isSelected) {
            SpatialPanel {
                InfoBubble(content) // Regular 2D Compose UI
            }
        }
        // Render our interactive 3D sphere
        SceneCoreEntity(
            factory = {
                GltfModelEntity.create(session, sphereModel).also { entity ->
                    // Make the 3D model respond to user taps
                    entity.addComponent(InteractableComponent.create(session) { inputEvent ->
                        if (inputEvent.action == InputEvent.Action.UP) {
                            onClick()
                        }
                    })
                }
            }
        )
    }
}

Découvrez dès aujourd'hui les possibilités d'Android XR

La création de l'application XR Geospatial Tour nous a montré que la barrière à l'entrée pour les expériences spatiales à l'échelle mondiale est plus basse que jamais pour les développeurs Android. L'API Geospatial est désormais disponible en preview sur Android XR. Vos applications peuvent ainsi comprendre parfaitement le monde physique qui les entoure. En combinant les API de Compose pour XR avec les données de localisation haute précision du VPS et les capacités génératives de Gemini, nous pouvons créer des expériences qui comprennent à la fois où se trouve l'utilisateur et ce qu'il regarde.

Pour vous aider à vous familiariser avec Android XR, nous sommes ravis d'ouvrir les candidatures au programme Android XR Developer Catalyst, qui inclut le Project Aura de XREAL. Dès aujourd'hui, vous pouvez demander à accéder à un kit de développement XREAL Project Aura ou à notre kit de développement de lunettes avec affichage au cours des prochains mois. 

*Avis de non-responsabilité : Disponible sur certains appareils. Connexion Internet requise. Fonctionne sur les applis et surfaces compatibles. Les résultats peuvent varier. 

Continuer la lecture