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

Temps de lecture : 7 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 de positionnement visuel (VPS) 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 découvrir ce que l'API Geospatial peut offrir, notre équipe a créé une démo : la visite XR Geospatial.

Imaginez que vous arrivez dans une nouvelle ville, que vous mettez une paire de lunettes XR filaires (comme les XREAL Project Aura à venir) et qu'un guide local expérimenté vous fait visiter les lieux. 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 géospatiales, 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.

 

 

Avis de non-responsabilité : Les applications Video et Tour Guide sont fournies à des fins de démonstration uniquement. Certaines séquences ont été raccourcies. Le matériel pré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 montrons 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 réalité étendue en combinant la puissance du GPS et la précision du VPS. La justesse et l'orientation précise fournies par le VPS permettent aux points de cheminement 3D de s'aligner 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}")
}

Toute l'expérience reposant sur cette précision, 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 lui demandons de "se rendre dans un espace public extérieur et de regarder autour de lui".

2. Élaborer 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 guidées à 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 soit vraiment présent, nous avons implémenté des voix off dynamiques.

En utilisant 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 facilite la transition d'une UI Android 2D vers 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 le long de la visite, nous avons créé un composable appelé InfoSphere, qui contient un GltfModel d'une sphère 3D flottant dans l'espace et avec laquelle il est possible d'interagir pour afficher des informations.

À l'aide du SDK Jetpack XR, nous pouvons placer des modèles 3D à côté de l'UI Compose à l'aide de SpatialBox et 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 des données au monde physique de manière fluide.

@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 les possibilités d'Android XR dès aujourd'hui

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 preview sur Android XR, vos applications peuvent comprendre le monde physique qui les entoure de manière fluide. En combinant les API de Compose for XR avec les données de localisation de 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 XREAL Project Aura 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 à lire