Tworzenie przewodnika w rzeczywistości mieszanej za pomocą Androida XR, interfejsu Geospatial API i Gemini
Czas czytania: 6 min
Podczas tegorocznej konferencji Google I/O ogłosiliśmy aktualizację dotyczącą funkcji przestrzennych: interfejs Geospatial API jest teraz dostępny w wersji testowej w ARCore for Jetpack XR. Dzięki wprowadzeniu systemu pozycjonowania wizualnego (VPS) Google na Androida XR, Android XR umożliwia zakotwiczanie treści cyfrowych w świecie fizycznym z dokładnością do metra i precyzyjną orientacją w obsługiwanych obszarach*. Aby sprawdzić, jakie możliwości daje Geospatial API, nasz zespół stworzył wersję demonstracyjną: XR Geospatial Tour.
Wyobraź sobie, że przyjeżdżasz do nowego miasta, zakładasz przewodowe okulary XR (takie jak nadchodzący XREAL Project Aura) i od razu masz do dyspozycji kompetentnego lokalnego przewodnika, który oprowadza Cię po okolicy. Nie musisz patrzeć na mapę 2D – zamiast tego modele 3D delikatnie prowadzą Cię po trasie, a inteligentny głos opowiada o historycznych zabytkach, które masz przed sobą. Połączyliśmy interfejsy Geospatial API, interfejs Gemini API z Firebase AI Logic, Google Maps Grounding i pakiet SDK Jetpack XR, aby stworzyć immersyjną wycieczkę pieszą obsługiwaną bez użycia rąk.
Wyłączenie odpowiedzialności: film i aplikacja 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ć.
Omówimy szczegóły implementacji i pokażemy, jak połączyliśmy te interfejsy API, aby stworzyć środowisko przestrzenne na skalę światową.
1. Określanie lokalizacji użytkownika za pomocą ARCore Geospatial API (VPS)
Ulepsz nawigację na urządzeniu XR, łącząc możliwości GPS z precyzją VPS. Dokładność i precyzyjna orientacja, które zapewnia VPS, umożliwiają dopasowanie punktów orientacyjnych 3D do świata fizycznego.
Dlatego interfejs Geospatial API na Androidzie XR może pomóc Ci w tworzeniu niestandardowych rozwiązań. Dzięki zaawansowanemu rozpoznawaniu obrazów VPS próbuje podać GeospatialPose (w tym szerokość i długość geograficzną oraz kierunek), który jest dokładniejszy 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}") }
Ponieważ całe działanie zależy od tej dokładności, monitorujemy horizontalAccuracy i orientationYawAccuracy, dopóki nie osiągną naszych progów. Jeśli użytkownik znajduje się w pomieszczeniu lub w nierozpoznanym obszarze, prosimy go o „wyjście na zewnątrz i rozejrzenie się”.
2. Tworzenie planu podróży za pomocą Gemini API i powiązania ze źródłami informacji w Mapach Google
Gdy mamy już lokalizację, używamy interfejsu Gemini API z Firebase AI Logic, aby poprosić model Gemini o odgrywanie roli lokalnego przewodnika. Przekazujemy współrzędne użytkownika do modelu i prosimy go o wygenerowanie uporządkowanej odpowiedzi JSON zawierającej informacje o pobliskich wycieczkach pieszych:
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ą bogate opisy, ale czasami mogą podawać nieprawdziwe współrzędne szerokości i długości geograficznej. Aby rozwiązać ten problem, użyliśmy uziemienia Map Google do uziemienia AI.
3. Głos, który Cię poprowadzi: Gemini 2.5 TTS
Aby przewodnik wydawał się naprawdę obecny, wprowadziliśmy dynamiczne podkłady głosowe.
Za pomocą gemini-2.5-flash-tts model możemy skonfigurować konfigurację generowania modelu, aby natywnie zwracała dane audio, a nie tylko tekst. 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. Przedstawianie świata w 3D za pomocą Jetpack XR
Ostatnim elementem układanki jest renderowanie tych danych w polu widzenia użytkownika. Pakiet Jetpack XR SDK umożliwia intuicyjne przejście z interfejsu 2D na Androidzie na obliczenia przestrzenne.
Do utworzenia komponentów przestrzennych użyliśmy Jetpack Compose for XR. Aby przedstawić ciekawe miejsca na trasie, utworzyliśmy element kompozycyjny o nazwie InfoSphere, który zawiera GltfModel kuli 3D unoszącej się w przestrzeni. Można z nią wejść w interakcję, aby wyświetlić informacje.
Za pomocą pakietu Jetpack XR SDK możemy umieszczać modele 3D obok interfejsu Compose, korzystając z SpatialBox i SceneCoreEntity. Użyliśmy też komponentu InteractableComponent, aby reagować na kliknięcia użytkownika.
Dzięki połączeniu AnimatedSpatialVisibility w przypadku tradycyjnych interfejsów Compose z elementami 3D SceneCoreEntity możemy płynnie łą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 bariera wejścia dla deweloperów aplikacji na Androida, którzy chcą tworzyć przestrzenne doświadczenia na skalę światową, jest niższa niż kiedykolwiek. Dzięki interfejsowi Geospatial API, który jest już dostępny w wersji testowej na Androidzie XR, Twoje aplikacje mogą bezproblemowo rozumieć otaczający je świat fizyczny. Dzięki połączeniu interfejsów API Compose for XR z bardzo dokładnymi danymi o lokalizacji z VPS i możliwościami generatywnymi Gemini możemy tworzyć rozwiązania, które rozumieją, gdzie znajduje się użytkownik i na co patrzy.
Aby pomóc Ci w praktycznym poznaniu Androida XR, z przyjemnością otwieramy nabór do programu Android XR Developer Catalyst Program, który obejmuje projekt XREAL Aura. Od dziś możesz ubiegać się o dostęp do zestawu deweloperskiego XREAL Project Aura lub zestawu deweloperskiego okularów z wyświetlaczem, który otrzymasz w najbliższych miesiącach.
*Wyłączenie odpowiedzialności: funkcja dostępna na wybranych urządzeniach. Wymagane jest połączenie z internetem. Wymaga zgodnych aplikacji i platform. Wyniki mogą się różnić.
-
Wiadomości o usłudzeW miarę jak rozwój agentów przyspiesza, inżynieria Androida osiąga nowy, ekscytujący etap: przechodzi od wspomagania uzupełniania kodu do agentów wykonujących zadania od początku do końca pod Twoim kierunkiem. Masz pełną swobodę i elastyczność w wyborze modeli i agentów, których używasz.
Jason Buchel • Czas czytania: 3 min -
Wiadomości o usłudzeDziś przedstawiliśmy, jak zamierzamy realizować naszą wizję „więcej niż sklep” w kolejnym rozdziale. Od karty Ty, która jest teraz osobistą bazą dla ponad 250 milionów aktywnych użytkowników miesięcznie, po ujednoliconą platformę do gier łączącą ponad 700 milionów profili graczy – Google Play jest zawsze tam, gdzie użytkownicy.
Paul Feng • Czas czytania: 3 min -
Wiadomości o usłudzeDzięki Googlebook chcemy pomóc użytkownikom wyrażać siebie i uzyskać dostęp do tych narzędzi.
Cyrus Stoller • Czas czytania: 2 min
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.