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

يستغرق الاطّلاع على المقال 7 دقائق
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 API وGemini API باستخدام Firebase AI Logic وGoogle Maps Grounding وJetpack XR SDK لإنشاء تجربة جولة مشي غامرة بدون استخدام اليدين.

 

 

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

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

1. تحديد موقع المستخدم بدقة باستخدام ARCore Geospatial API (نظام تحديد المواقع المرئية)

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

لهذا السبب، يمكن أن تساعدك 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" كمصدر

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

لجعل دليل الجولة يبدو وكأنّه موجود فعلاً، نفّذنا تعليقات صوتية ديناميكية.

باستخدام 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

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

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

باستخدام حزمة تطوير البرامج (SDK) Jetpack XR، يمكننا وضع نماذج ثلاثية الأبعاد بجانب واجهة مستخدم 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 اليوم

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

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

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

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