أخبار المنتجات

إنشاء دليل سياحي للواقع المختلط باستخدام Android XR وGeospatial API وGemini

قراءة لمدة 6 دقائق
3 مؤلفين
Coco Fatus, Alon Hetzroni, Azin Mehrnoosh

_في مؤتمر Google I/O لهذا العام_ ، أعلنّا عن تعديل للتجارب المكانية: أصبحت _Geospatial API_ متاحة الآن كمعاينة في _ARCore for Jetpack XR_. من خلال توفير نظام تحديد المواقع المرئية (VPS) من Google على Android XR، يتيح Android XR تثبيت المحتوى الرقمي في العالم المادي بدقة أقل من المتر وتوجيه دقيق في المناطق المتوافقة.* لاستكشاف إمكانات Geospatial API، أنشأ فريقنا عرضًا توضيحيًا: جولة XR الجغرافية المكانية.

تخيَّل أنّك تدخل مدينة جديدة وتضع نظارات بنظام الواقع الممتد سلكية (مثل XREAL Project Aura القادمة) وتحصل على الفور على دليل محلي خبير يريك المدينة. لا تحتاج إلى التحديق في خريطة ثنائية الأبعاد، بل ترشدك نماذج ثلاثية الأبعاد بلطف، ويخبرك صوت ذكي عن المعالم التاريخية أمامك مباشرةً. لقد جمعنا بين Geospatial APIs و Gemini API باستخدام Firebase AI Logic و Google Maps Grounding و Jetpack XR SDK لإنشاء تجربة جولة سير غامرة بدون استخدام اليدين.

إخلاء المسؤولية: الفيديو وتطبيق "الدليل السياحي" لأغراض العرض التوضيحي فقط. تم تقصير بعض التسلسلات. قد يكون أي جهاز معروض قيد التطوير، وقد تختلف تفاصيل المنتج النهائي.

لنستعرض تفاصيل التنفيذ ونوضّح كيف ربطنا واجهات برمجة التطبيقات هذه معًا لإنشاء تجربة مكانية على مستوى العالم.

‫1. تحديد موقع المستخدِم بدقة باستخدام ARCore Geospatial API‏ (VPS)

يمكنك تحسين تجربة التنقّل في الواقع الممتد من خلال الجمع بين قوة نظام تحديد المواقع العالمي (GPS) ودقة نظام تحديد المواقع المرئية (VPS). تسمح الدقة والتوجيه الدقيق اللذان يوفّرهما نظام تحديد المواقع المرئية (VPS) بمحاذاة نقاط الطريق الثلاثية الأبعاد مع العالم المادي.

لهذا السبب، يمكن أن تساعدك Geospatial API على Android XR في إنشاء تجارب مخصّصة. باستخدام الرؤية الحاسوبية المتقدّمة، يحاول نظام تحديد المواقع المرئية (VPS) توفير GeospatialPose (بما في ذلك خط العرض وخط الطول والاتجاه) أكثر دقة من نظام تحديد المواقع العالمي (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 Maps Grounding

بعد الحصول على الموقع الجغرافي، نستخدم 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 لربط الذكاء الاصطناعي بالواقع.

‫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. إضفاء الحيوية على التجربة في 3D باستخدام Jetpack XR

العنصر الأخير هو عرض هذه البيانات في مجال رؤية المستخدِم. تسهّل حزمة Jetpack XR SDK الانتقال من واجهة مستخدم Android ثنائية الأبعاد إلى الحوسبة المكانية.

استخدمنا Jetpack Compose for XR لإنشاء مكوّنات مكانية. لتمثيل نقاط الاهتمام على طول الجولة، أنشأنا دالة مركّبة تُسمى InfoSphere، وتحتوي على GltfModel لكرّة ثلاثية الأبعاد تطفو في الفضاء ويمكن التفاعل معها لعرض المعلومات.

باستخدام Jetpack XR SDK، يمكننا وضع نماذج ثلاثية الأبعاد بجانب واجهة مستخدم Compose باستخدام SpatialBox و SceneCoreEntity. استخدمنا أيضًا InteractableComponent للاستجابة لنقرات المستخدِم.

من خلال الجمع بين AnimatedSpatialVisibility لأسطح واجهة مستخدم Compose التقليدية وعناصر 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

أظهر لنا إنشاء تطبيق "جولة الواقع الممتد الجغرافية المكانية" أنّ حاجز الدخول إلى التجارب المكانية على مستوى العالم أقل من أي وقت مضى لمطوّري برامج Android. مع توفّر Geospatial API الآن في المعاينة على Android XR، يمكن لتطبيقاتك فهم العالم المادي من حولها بسلاسة. من خلال الجمع بين واجهات برمجة التطبيقات الخاصة بـ Compose for XR وبيانات الموقع الجغرافي العالية الدقة لنظام تحديد المواقع المرئية (VPS) والإمكانات التوليدية لـ Gemini، يمكننا إنشاء تجارب تفهم مكان المستخدِم وما ينظر إليه.

لمساعدتك في استخدام Android XR، يسرّنا فتح باب التقديم إلى برنامج Android XR Developer Catalyst Program، الذي يتضمّن XREAL Project Aura. اعتبارًا من اليوم، يمكنك التقديم للوصول إلى مجموعة أدوات تطوير XREAL Project Aura أو مجموعة أدوات تطوير النظارات المعروضة خلال الأشهر القادمة.

*إخلاء المسؤولية: تتوفّر الميزة على أجهزة معيّنة فقط. يجب توفُّر اتصال بالإنترنت. ويمكن استخدامها على التطبيقات ومساحات العرض المتوافقة. قد تختلف النتائج.

متابعة القراءة