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 des expériences spatiales : l'API Geospatial est désormais disponible en aperçu 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é. Vous n'avez pas besoin de regarder une carte 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 guidée 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. Grâce à la vision par ordinateur avancée, le VPS tente de fournir une GeospatialPose (y compris 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 sur 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'ensemble de l'expérience repose sur cette justesse, nous surveillons horizontalAccuracy et orientationYawAccuracy jusqu'à ce qu'ils 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 se sente vraiment présent, nous avons implémenté des voix off dynamiques.

À l'aide de gemini-2.5-flash-tts model, nous pouvons configurer notre configuration de génération de modèle pour renvoyer des données audio de manière native au lieu de texte uniquement. 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 à vos idées 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 intuitivement 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 le seuil d'entrée pour les expériences spatiales à l'échelle mondiale n'a jamais été aussi bas pour les développeurs Android. L'API Geospatial étant désormais disponible en aperçu sur Android XR, vos applications peuvent comprendre de manière fluide 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 inscriptions au Programme Catalyst pour les développeurs Android XR, qui inclut XREAL Project Aura. À partir d'aujourd'hui, vous pouvez demander à accéder à un kit de développement Project Aura XREAL ou à notre kit de développement de lunettes d'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