สร้างไกด์นำเที่ยวแบบความจริงแบบผสมด้วย Android XR, Geospatial API และ Gemini
ใช้เวลาอ่าน 7 นาที
ในงาน Google I/O ปีนี้ เราได้ประกาศการอัปเดตประสบการณ์เชิงพื้นที่ โดยตอนนี้ Geospatial API พร้อมให้บริการในรูปแบบตัวอย่างใน ARCore สำหรับ Jetpack XR แล้ว การนำระบบกำหนดตำแหน่งด้วยภาพ (VPS) ของ Google มาใช้ใน Android XR ทำให้ Android XR สามารถยึดเนื้อหาดิจิทัลกับโลกจริงได้อย่างแม่นยำในระดับต่ำกว่า 1 เมตร และมีทิศทางที่แม่นยำในพื้นที่ที่รองรับ* ทีมของเราได้สร้างการสาธิต XR Geospatial Tour เพื่อสำรวจสิ่งที่ Geospatial API ทำได้
ลองนึกภาพว่าคุณเดินเข้าไปในเมืองใหม่ สวมแว่นตา XR แบบใช้สาย (เช่น XREAL Project Aura ที่กำลังจะเปิดตัว) แล้วมี Local Guide ท้องถิ่นที่มีความรู้คอยนำชมในทันที คุณไม่จำเป็นต้องจ้องมองแผนที่ 2 มิติ แต่โมเดล 3 มิติจะนำทางคุณอย่างนุ่มนวล และเสียงอัจฉริยะจะบอกคุณเกี่ยวกับสถานที่สำคัญทางประวัติศาสตร์ที่อยู่ตรงหน้า เราได้รวม Geospatial API, Gemini API โดยใช้ตรรกะ AI ของ Firebase, การอ้างอิงพื้นฐานของ Google Maps และ Jetpack XR SDK เพื่อสร้างประสบการณ์ทัวร์เดินชมแบบดื่มด่ำโดยไม่ต้องใช้มือ
ข้อจำกัดความรับผิด: แอปพลิเคชันวิดีโอและแอปพลิเคชันไกด์นำเที่ยวมีไว้เพื่อการสาธิตเท่านั้น ลำดับขั้นตอนบางอย่างมีการตัดให้สั้นลง ฮาร์ดแวร์ที่แสดงอาจอยู่ระหว่างการพัฒนา รายละเอียดผลิตภัณฑ์ขั้นสุดท้ายอาจแตกต่างออกไป
มาดูรายละเอียดการติดตั้งใช้งานและวิธีที่เราเชื่อมโยง API เหล่านี้เข้าด้วยกันเพื่อสร้างประสบการณ์เชิงพื้นที่ระดับโลก
1. ระบุตำแหน่งผู้ใช้ด้วย ARCore Geospatial API (VPS)
ยกระดับประสบการณ์การนำทางใน XR ด้วยการรวมพลังของ GPS เข้ากับความแม่นยำของ VPS ความแม่นยำและการวางแนวที่แน่นอนซึ่งมาพร้อมกับ VPS ช่วยให้จุดอ้างอิง 3 มิติสอดคล้องกับโลกจริง
ด้วยเหตุนี้ Geospatial API ใน Android XR จึงช่วยให้คุณสร้างประสบการณ์การใช้งานที่กำหนดเองได้ VPS ใช้การมองเห็นด้วยคอมพิวเตอร์ขั้นสูงเพื่อพยายามให้ GeospatialPose (รวมถึงละติจูด ลองจิจูด และส่วนหัว) ที่แม่นยำกว่า GPS
วิธีที่เราดึงท่าทางเชิงพื้นที่ของผู้ใช้โดยการแมปการวางแนวของอุปกรณ์กับพิกัดเชิงพื้นที่มีดังนี้
// 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 Maps
เมื่อทราบตำแหน่งแล้ว เราจะใช้ Gemini API โดยใช้ Firebase AI Logic เพื่อแจ้งให้โมเดล 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 Maps Grounding เพื่อให้ AI มีพื้นฐานข้อมูล
3. เสียงนำทาง: TTS ของ Gemini 2.5
เราจึงใช้เสียงบรรยายแบบไดนามิกเพื่อให้ไกด์นำเที่ยวดูเหมือนอยู่ตรงหน้าคุณจริงๆ
การใช้ 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. การทำให้เป็นจริงในรูปแบบ 3 มิติด้วย Jetpack XR
ส่วนสุดท้ายของปริศนาคือการแสดงข้อมูลนี้ในขอบเขตการมองเห็นของผู้ใช้ Jetpack XR SDK ช่วยให้เปลี่ยนจาก UI ของ Android 2 มิติเป็นการประมวลผลเชิงพื้นที่ได้อย่างง่ายดาย
เราใช้ Jetpack Compose สำหรับ XR เพื่อสร้างคอมโพเนนต์เชิงพื้นที่ เราสร้าง Composable ที่ชื่อ InfoSphere เพื่อแสดงจุดที่น่าสนใจตลอดทัวร์ ซึ่งมี GltfModel ของลูกบอล 3 มิติที่ลอยอยู่ในอวกาศและโต้ตอบได้เพื่อแสดงข้อมูล
การใช้ Jetpack XR SDK ช่วยให้เราวางโมเดล 3 มิติไว้ข้าง UI ของ Compose ได้โดยใช้ SpatialBox และ SceneCoreEntity นอกจากนี้ เรายังใช้ InteractableComponent เพื่อตอบสนองต่อการแตะของผู้ใช้ด้วย
การรวม AnimatedSpatialVisibility สำหรับพื้นผิว UI ของ Compose แบบดั้งเดิมเข้ากับองค์ประกอบ 3 มิติของ SceneCoreEntity ทำให้เราสามารถผสานรวมข้อมูลเข้ากับโลกจริงได้อย่างราบรื่น
@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 ทำให้เราเห็นว่าอุปสรรคในการสร้างประสบการณ์เชิงพื้นที่ระดับโลกสำหรับนักพัฒนาแอป Android นั้นต่ำกว่าที่เคย ตอนนี้ Geospatial API พร้อมใช้งานในเวอร์ชันตัวอย่างบน Android XR แล้ว แอปของคุณจึงเข้าใจโลกรอบตัวได้อย่างราบรื่น การผสานรวม API ของ Compose for XR เข้ากับข้อมูลตำแหน่งที่มีความแม่นยำสูงของ VPS และความสามารถในการสร้างของ Gemini จะช่วยให้เราสร้างประสบการณ์ที่เข้าใจทั้งตำแหน่งของผู้ใช้และสิ่งที่ผู้ใช้กำลังมองเห็น
เรายินดีที่จะเปิดรับสมัครเข้าร่วมโปรแกรมตัวเร่งสำหรับนักพัฒนา Android XR ซึ่งรวมถึง XREAL Project Aura เพื่อช่วยให้คุณได้สัมผัสประสบการณ์การใช้งาน Android XR โดยตรง ตั้งแต่วันนี้เป็นต้นไป คุณสามารถสมัครรับสิทธิ์เข้าถึงชุดพัฒนาซอฟต์แวร์ (Devkit) ของ XREAL Project Aura หรือชุดพัฒนาซอฟต์แวร์ (Devkit) ของแว่นตาที่มีจอแสดงผลของเราได้ในอีกไม่กี่เดือนข้างหน้า
*ข้อจำกัดความรับผิด: พร้อมใช้งานในอุปกรณ์บางรุ่น ต้องเชื่อมต่ออินเทอร์เน็ต ใช้ได้ในแอปและแพลตฟอร์มที่รองรับ ผลลัพธ์อาจแตกต่างกันไป
อ่านต่อ
-
วันนี้เราจะเปิดตัว Android 17 และพร้อมให้บริการในอุปกรณ์ Pixel ส่วนใหญ่ที่รองรับ โปรดรอติดตามอุปกรณ์ใหม่ที่ใช้ Android 17 ในอีกไม่กี่เดือนข้างหน้า
Matthew McCullough • ใช้เวลาอ่าน 13 นาที
-
ข่าวสารผลิตภัณฑ์
เมื่อปีที่แล้ว เราได้เปิดตัวการยืนยันนักพัฒนาแอป Android เพื่อเสริมความแข็งแกร่งด้านความปลอดภัยของระบบนิเวศและหยุดไม่ให้ผู้ไม่ประสงค์ดีซ่อนตัวอยู่เบื้องหลังการไม่เปิดเผยตัวตนเพื่อเผยแพร่แอปที่เป็นอันตราย
Matthew Forsythe • ใช้เวลาอ่าน 2 นาที
-
ข่าวสารผลิตภัณฑ์
ตั้งแต่การซ้อนทับแบบเสริมไปจนถึงสภาพแวดล้อมที่สมจริงอย่างเต็มรูปแบบ ระบบนิเวศ Android XR กำลังขยายตัวอย่างรวดเร็ว โดย Samsung Galaxy XR พร้อมให้บริการแล้ววันนี้
Stevan Silva, Vinny DaSilva • ใช้เวลาอ่าน 3 นาที
รับข่าวสาร
รับข้อมูลเชิงลึกด้านการพัฒนาแอป Android ล่าสุดส่งตรงถึงกล่องจดหมายของคุณทุกสัปดาห์