Wiadomości o usługach

Tworzenie przewodnika po rzeczywistości mieszanej za pomocą Androida XR, interfejsu Geospatial API i Gemini

Czas czytania: 6 min

Na tegorocznej konferencji Google I/O ogłosiliśmy aktualizację dotyczącą przestrzennych doświadczeń: interfejs Geospatial API jest teraz dostępny w wersji podglądowej w ARCore dla Jetpack XR. Dzięki wprowadzeniu do Androida XR systemu pozycjonowania wizualnego (VPS) od Google platforma ta umożliwia przypisywanie treści cyfrowych do świata fizycznego z dokładnością poniżej metra i precyzyjną orientacją w obsługiwanych obszarach*. Aby pokazać, jakie możliwości daje interfejs Geospatial API, nasz zespół stworzył wersję demonstracyjną: XR Geospatial Tour.

Wyobraź sobie, że wchodzisz do nowego miasta, zakładasz przewodowe okulary XR (np. nadchodzące XREAL Project Aura) i od razu masz do dyspozycji kompetentnego lokalnego przewodnika, który Cię oprowadza. Nie musisz wpatrywać się w mapę 2D – modele 3D delikatnie wskazują Ci drogę, a inteligentny głos opowiada o zabytkach, które masz przed sobą. Połączyliśmy interfejsy Geospatial API, Gemini API z Firebase AI Logic, Google Maps Groundingpakiet SDK Jetpack XR, aby stworzyć wciągającą wycieczkę pieszą bez użycia rąk.

Zastrzeżenie: aplikacje Video i Tour Guide służą wyłącznie do celów demonstracyjnych. Niektóre sekwencje zostały skrócone. Przedstawiony sprzęt może być w fazie rozwoju. Szczegóły produktu końcowego mogą się różnić.

Przyjrzyjmy się szczegółom implementacji i sposobowi, w jaki połączyliśmy te interfejsy API, aby stworzyć globalne rozwiązanie przestrzenne.

1. Określanie lokalizacji użytkownika za pomocą interfejsu ARCore Geospatial API (VPS)

Zwiększ komfort nawigacji w XR, łącząc moc GPS z precyzją VPS. Dokładność i precyzyjna orientacja, które zapewnia VPS, umożliwiają dopasowanie punktów orientacyjnych 3D do rzeczywistego świata.

Dlatego interfejs Geospatial API na Androidzie XR może pomóc Ci w tworzeniu niestandardowych rozwiązań. Dzięki zaawansowanemu systemowi rozpoznawania obrazów VPS próbuje podać GeospatialPose (w tym szerokość geograficzną, długość geograficzną i kierunek), która jest dokładniejsza niż GPS.

Oto jak pobieramy pozycję geoprzestrzenną użytkownika, mapując orientację urządzenia na współrzędne geoprzestrzenne:

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

Cała usługa zależy od dokładności tych danych, dlatego monitorujemy horizontalAccuracyorientationYawAccuracy, dopóki nie osiągną one odpowiednich wartości. Jeśli użytkownik znajduje się w pomieszczeniu lub w nierozpoznanym obszarze, prosimy go o „wyjście na zewnątrz w miejsce publiczne i rozejrzenie się”.

2. Tworzenie planu podróży za pomocą Gemini API i powiązania ze źródłem informacji w Mapach Google

Gdy uzyskamy lokalizację, używamy interfejsu Gemini API za pomocą Firebase AI Logic, aby poprosić model Gemini o pełnienie roli lokalnego przewodnika. Przekazujemy do modelu współrzędne użytkownika i prosimy go o wygenerowanie uporządkowanej odpowiedzi w formacie JSON zawierającej pobliskie wycieczki piesze:

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

Duże modele językowe świetnie generują szczegółowe opisy, ale czasami mogą podawać nieprawidłowe współrzędne szerokości i długości geograficznej. Aby rozwiązać ten problem, użyliśmy interfejsu Google Maps Grounding, który pozwala osadzić AI w kontekście.

3. Głos, który Cię poprowadzi: Gemini 2.5 TTS

Aby przewodnik sprawiał wrażenie, że jest obecny w danym miejscu, wprowadziliśmy dynamiczne komentarze głosowe.

Za pomocą gemini-2.5-flash-tts model możemy skonfigurować ustawienia generowania modelu tak, aby zwracał dane audio zamiast samego tekstu. Aby poprosić o 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. Ożywianie treści w 3D za pomocą Jetpack XR

Ostatnim elementem układanki jest wyświetlanie tych danych w polu widzenia użytkownika. Pakiet Jetpack XR SDK ułatwia przejście z dwuwymiarowego interfejsu Androida na obliczenia przestrzenne.

Do tworzenia komponentów przestrzennych użyliśmy Jetpack Compose na potrzeby XR. Aby przedstawić punkty orientacyjne podczas wycieczki, stworzyliśmy komponent InfoSphere, który zawiera model GltfModel trójwymiarowej kuli unoszącej się w przestrzeni. Można z nią wchodzić w interakcję, aby wyświetlać informacje.

Za pomocą pakietu Jetpack XR SDK możemy umieszczać modele 3D obok interfejsu Compose za pomocą komponentów SpatialBoxSceneCoreEntity. Użyliśmy też komponentu InteractableComponent, aby reagować na kliknięcia użytkownika.

Łącząc AnimatedSpatialVisibility w przypadku tradycyjnych powierzchni interfejsu Compose z elementami 3D SceneCoreEntity, możemy bezproblemowo łączyć dane ze światem fizycznym.

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

Poznaj możliwości Androida XR już dziś

Tworzenie aplikacji XR Geospatial Tour pokazało nam, że dla deweloperów Androida bariera wejścia w przypadku przestrzennych rozwiązań na skalę światową jest niższa niż kiedykolwiek. Interfejs Geospatial API jest teraz dostępny w wersji przedpremierowej na Androidzie XR, dzięki czemu Twoje aplikacje mogą bezproblemowo rozpoznawać otaczający je świat fizyczny. Łącząc interfejsy API Compose for XR z precyzyjnymi danymi o lokalizacji z VPS i możliwościami generatywnymi Gemini, możemy tworzyć rozwiązania, które rozumieją zarówno to, gdzie znajduje się użytkownik, jak i to, na co patrzy.

Aby ułatwić Ci praktyczne zapoznanie się z Androidem XR, otwieramy nabór do Programu dla deweloperów Androida XR, który obejmuje XREAL Project Aura. Od dziś możesz zgłosić się po zestaw deweloperski XREAL Project Aura lub zestaw deweloperski okularów z wyświetlaczem, który udostępnimy w najbliższych miesiącach.

*Zastrzeżenie: funkcja dostępna na wybranych urządzeniach. Wymagane jest połączenie z internetem. Wymaga zgodnych aplikacji i platform. Wyniki mogą się różnić.

Czytaj dalej