Android XR, Geospatial API, Gemini를 사용하여 혼합 현실 투어 가이드 빌드
전문 길이: 7분
올해 Google I/O에서 공간 경험 업데이트가 발표되었습니다. 이제 Geospatial API를 Jetpack XR용 ARCore에서 미리보기로 사용할 수 있습니다. Android XR은 Google의 VPS (Visual Positioning System)를 Android XR에 도입하여 지원되는 지역에서 디지털 콘텐츠를 실제 세계에 1미터 미만의 정확도로 고정하고 정확한 방향을 지정할 수 있습니다.* Geospatial API로 무엇을 할 수 있는지 알아보기 위해 Google팀은 XR Geospatial Tour라는 데모를 빌드했습니다.
새로운 도시에 도착해 유선 XR 안경 (예: 출시 예정인 XREAL Project Aura)을 착용하면 현지 사정에 밝은 가이드가 즉시 주변을 안내해 준다고 상상해 보세요. 2D 지도를 응시할 필요가 없습니다. 대신 3D 모델이 경로를 부드럽게 안내하고 지능형 음성이 바로 앞에 있는 역사적 랜드마크에 대해 알려줍니다. Geospatial API, Firebase AI Logic을 사용하는 Gemini API, Google 지도 그라운딩, Jetpack XR SDK를 결합하여 핸즈프리 몰입형 도보 투어 환경을 만들었습니다.
면책조항: 동영상 및 투어 가이드 애플리케이션은 데모용으로만 제공됩니다. 일부 장면이 단축되었습니다. 표시된 하드웨어는 개발 중일 수 있으며 최종 제품 세부정보는 다를 수 있습니다.
구현 세부정보를 살펴보고 이러한 API를 함께 연결하여 전 세계 규모의 공간 경험을 구축하는 방법을 보여드리겠습니다.
1. ARCore Geospatial API (VPS)로 사용자 위치 정확하게 파악하기
GPS의 강력한 기능과 VPS의 정밀도를 결합하여 XR의 탐색 환경을 개선하세요. VPS의 정확성과 정밀한 방향을 통해 3D 웨이포인트가 실제 세계와 정렬될 수 있습니다.
이러한 이유로 Android XR의 Geospatial API를 사용하면 맞춤 환경을 빌드할 수 있습니다. VPS는 고급 컴퓨터 비전을 사용하여 GPS보다 정확한 GeospatialPose (위도, 경도, 방향 포함)를 제공하려고 합니다.
다음은 기기의 방향을 지리정보 좌표에 매핑하여 사용자의 지리정보 포즈를 가져오는 방법입니다.
// 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}") }
전체 환경이 이 정확도에 의존하므로 horizontalAccuracy와 orientationYawAccuracy가 기준을 충족할 때까지 모니터링합니다. 사용자가 실내에 있거나 인식되지 않는 지역에 있는 경우 '실외 공공장소로 이동하여 주변을 둘러보세요'라는 메시지가 표시됩니다.
2. Gemini API 및 Google 지도 그라운딩으로 여행 일정 만들기
위치를 파악한 후 Firebase AI Logic을 사용하는 Gemini API를 사용하여 Gemini 모델이 현지 여행 가이드 역할을 하도록 프롬프트를 표시합니다. 사용자의 좌표를 모델에 전달하고 근처의 도보 투어가 포함된 구조화된 JSON 응답을 출력하도록 요청합니다.
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.")
대규모 언어 모델은 풍부한 설명을 생성하는 데 탁월하지만 때로는 정확한 위도/경도 좌표에 할루시네이션 현상이 발생할 수 있습니다. 이 문제를 해결하기 위해 Google 지도 기반 그라운딩을 사용하여 AI를 그라운딩했습니다.
3. 음성으로 안내: Gemini 2.5 TTS
투어 가이드가 실제로 존재하는 것처럼 느껴지도록 동적 음성 해설을 구현했습니다.
gemini-2.5-flash-tts model를 사용하면 텍스트 대신 오디오 데이터를 기본적으로 반환하도록 모델 생성 구성을 구성할 수 있습니다. 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. Jetpack XR로 3D로 생생하게 구현하기
마지막 퍼즐 조각은 이 데이터를 사용자의 시야에 렌더링하는 것입니다. Jetpack XR SDK를 사용하면 2D Android UI에서 공간 컴퓨팅으로 직관적으로 전환할 수 있습니다.
XR용 Jetpack Compose를 사용하여 공간 구성요소를 빌드했습니다. 투어의 관심 지점을 나타내기 위해 InfoSphere라는 컴포저블을 빌드했습니다. 여기에는 공간에 떠 있고 상호작용하여 정보를 표시할 수 있는 3D 구체의 GltfModel이 포함되어 있습니다.
Jetpack XR SDK를 사용하면 SpatialBox 및 SceneCoreEntity를 사용하여 Compose UI와 함께 3D 모델을 배치할 수 있습니다. 또한 InteractableComponent를 사용하여 사용자 탭에 응답했습니다.
기존 Compose UI 표면용 AnimatedSpatialVisibility를 SceneCoreEntity 3D 요소와 결합하여 데이터를 실제 세계에 원활하게 혼합할 수 있습니다.
@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() } }) } } ) } }
Android XR로 오늘 할 수 있는 작업 알아보기
XR Geospatial Tour 앱을 빌드하면서 Android 개발자가 세계 규모의 공간 경험을 만드는 데 필요한 진입 장벽이 그 어느 때보다 낮다는 것을 알게 되었습니다. 이제 Android XR에서 미리보기로 제공되는 Geospatial API를 사용하면 앱이 주변의 실제 세계를 원활하게 이해할 수 있습니다. Compose for XR의 API를 VPS의 고정밀 위치 데이터 및 Gemini의 생성 기능과 결합하면 사용자의 위치와 사용자가 보고 있는 대상을 모두 이해하는 환경을 만들 수 있습니다.
Android XR을 직접 체험해 볼 수 있도록 Android XR Developer Catalyst Program의 신청을 시작합니다. 이 프로그램에는 XREAL Project Aura가 포함됩니다. 오늘부터 앞으로 몇 달 동안 XREAL 프로젝트 Aura 개발자 키트 또는 디스플레이 글라스 개발자 키트에 액세스할 수 있도록 신청할 수 있습니다.
*면책 조항: 일부 기기에서 사용할 수 있습니다. 인터넷에 연결되어 있어야 합니다. 호환되는 앱 및 서비스에서 작동합니다. 결과는 다를 수 있습니다.
-
어두운 방에서 좋아하는 소셜 미디어 피드를 스크롤하고 있는데 갑자기 HDR 동영상이 표시되는 경험은 누구나 한 번쯤 겪어봤을 것입니다. 너무 밝아서 눈을 가늘게 뜨거나 자막을 읽기 위해 화면 밝기를 낮춰야 할 수도 있습니다.
Tibian Elsheikh, Jeffrey Jose • 전문 길이: 2분 -
오늘 Android 17이 출시되며 지원되는 대부분의 Pixel 기기에서 사용할 수 있습니다. 향후 몇 개월 내에 Android 17을 실행하는 새 기기가 출시될 예정입니다.
Matthew McCullough • 전문 길이: 13분 -
제품 소식3월에 Google은 실제 Android 개발 작업을 위한 LLM 리더보드인 Android Bench를 도입했습니다. 이후 Google은 광고주의 의견을 바탕으로 오픈 가중치 모델을 평가하고 리더보드에 비용 및 효율성 측정기준을 추가하는 등 벤치마크를 개선했습니다.
Zoe Lopez-Latorre • 3분 읽기
Android 개발 관련 최신 정보를 이메일로 받아 보세요.