Creare una guida turistica in realtà mista con Android XR, l'API Geospatial e Gemini

7 minuti di lettura

Alla conferenza Google I/O di quest'anno, abbiamo annunciato un aggiornamento per le esperienze spaziali: l' API Geospatial è ora disponibile in anteprima in ARCore per Jetpack XR. Portando il sistema di posizionamento visivo (VPS) di Google su Android XR, Android XR consente di ancorare i contenuti digitali al mondo fisico con una precisione inferiore al metro e un orientamento preciso nelle aree supportate.* Per esplorare le potenzialità dell'API Geospatial, il nostro team ha creato una demo: il tour spaziale XR.

Immagina di entrare in una nuova città, indossare un paio di occhiali XR connessi (come il prossimo XREAL Project Aura) e avere immediatamente una guida locale esperta che ti mostri i dintorni. Non devi fissare una mappa 2D, ma i modelli 3D ti guidano delicatamente lungo il percorso e una voce intelligente ti racconta i punti di riferimento storici proprio di fronte a te. Abbiamo combinato le API Geospatiall'API Gemini utilizzando Firebase AI LogicGoogle Maps Groundingl'SDK Jetpack XR per creare un'esperienza di tour a piedi immersiva e a mani libere.

 

 

Dichiarazione di non responsabilità: il video e l'applicazione Guida turistica sono solo a scopo dimostrativo. Alcune sequenze sono state accorciate. L'hardware raffigurato potrebbe essere in fase di sviluppo; i dettagli del prodotto finale potrebbero variare.

Esaminiamo i dettagli dell'implementazione e mostriamo come abbiamo collegato queste API per creare un'esperienza spaziale su scala mondiale.

1. Individuare l'utente con l'API ARCore Geospatial (VPS)

Migliora l'esperienza di navigazione su XR combinando la potenza del GPS con la precisione del VPS. La precisione e l'orientamento preciso offerti dal VPS consentono ai waypoint 3D di allinearsi al mondo fisico.

Per questo motivo, l'API Geospatial su Android XR può aiutarti a creare esperienze personalizzate. Utilizzando la computer vision avanzata, il VPS tenta di fornire una GeospatialPose (inclusi latitudine, longitudine e direzione) più precisa del GPS.

Ecco come recuperiamo la posa spaziale dell'utente mappando l'orientamento del dispositivo con una coordinata spaziale:

// 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}")
}

Poiché l'intera esperienza si basa su questa precisione, monitoriamo horizontalAccuracy e orientationYawAccuracy finché non raggiungono le nostre soglie. Se l'utente si trova al chiuso o in un'area non riconosciuta, gli chiediamo di "camminare verso uno spazio pubblico all'aperto e guardarsi intorno".

2. Creare l'itinerario con l'API Gemini e Google Maps Grounding

Una volta individuata una località, utilizziamo l' API Gemini con Firebase AI Logic per chiedere al modello Gemini di fungere da guida turistica locale. Passiamo le coordinate dell'utente al modello e gli chiediamo di restituire una risposta JSON strutturata contenente i tour a piedi nelle vicinanze:

   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.")

I modelli linguistici di grandi dimensioni sono ottimi per generare descrizioni dettagliate, ma a volte possono inventare coordinate di latitudine/longitudine esatte. Per risolvere questo problema, abbiamo utilizzato Google Maps Grounding per ancorare l'AI.

3. Una voce che ti guida: Gemini 2.5 TTS

Per far sentire la guida turistica davvero presente, abbiamo implementato voiceover dinamici.

Utilizzando il gemini-2.5-flash-tts model, possiamo configurare la configurazione di generazione del modello in modo che restituisca in modo nativo i dati audio anziché solo il testo. Ecco come puoi richiedere 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. Dare vita al mondo in 3D con Jetpack XR

L'ultimo pezzo del puzzle è il rendering di questi dati nel campo visivo dell'utente. L'SDK Jetpack XR semplifica la transizione da un'interfaccia utente Android 2D al computing spaziale.

Abbiamo utilizzato Jetpack Compose per XR per creare componenti spaziali. Per rappresentare i punti di interesse lungo il tour, abbiamo creato un elemento componibile chiamato InfoSphere, che contiene un GltfModel di un globo 3D che fluttua nello spazio e con cui è possibile interagire per visualizzare le informazioni.

Utilizzando l'SDK Jetpack XR, possiamo posizionare i modelli 3D insieme all'interfaccia utente Compose utilizzando SpatialBoxSceneCoreEntity. Abbiamo anche utilizzato InteractableComponent per rispondere ai tocchi dell'utente.

Combinando AnimatedSpatialVisibility per le superfici dell'interfaccia utente Compose tradizionali con gli elementi 3D SceneCoreEntity, possiamo integrare senza problemi i dati nel mondo fisico.

@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()
                        }
                    })
                }
            }
        )
    }
}

Esplora le potenzialità di Android XR oggi stesso

La creazione dell'app XR Geospatial Tour ci ha dimostrato che la barriera all'ingresso per le esperienze spaziali su scala mondiale è più bassa che mai per gli sviluppatori Android. Con l'API Geospatial ora disponibile in anteprima su Android XR, le tue app possono comprendere senza problemi il mondo fisico che le circonda. Combinando le API di _Compose for XR_ con i dati sulla posizione ad alta precisione del VPS e le funzionalità generative di Gemini, possiamo creare esperienze che comprendano sia la posizione dell'utente sia ciò che sta guardando.

Per aiutarti a utilizzare Android XR, siamo felici di aprire le candidature per l' Android XR Developer Catalyst Program, che include XREAL Project Aura. A partire da oggi, puoi richiedere l'accesso a un kit di sviluppo XREAL Project Aura o al nostro kit di sviluppo per occhiali con display nei prossimi mesi.

*Dichiarazione di non responsabilità: disponibile solo su alcuni dispositivi. È necessaria una connessione a internet. Funziona su app e piattaforme compatibili. I risultati possono variare.

Continua a leggere