تخطَّ إلى المحتوى

التصدير إلى OpenDRIVE وOpenSCENARIO وesmini

يُحوِّل drawtonomy المشهد المرسوم يدويًا إلى شبكة طرق بصيغة ASAM OpenDRIVE (.xodr) وسيناريو بصيغة OpenSCENARIO (.xosc)، مُعبَّأَين في ملف zip واحد يمكن تشغيله مباشرة في esmini.

التحويل أساسي بقصد — يشمل الأشكال القليلة التي تُقابل نموذج بيانات ASAM مباشرةً، ويستثني الباقي. توضّح هذه الصفحة بدقة ما الذي يُحوَّل، وما الذي تفعله المركبة المُصدَّرة فعلًا، وما يخرج عن النطاق الحالي — حتى لا يُبالَغ في توقعات الناتج.

مشاهدة الرحلة الكاملة ذهابًا وإيابًا

Section titled “مشاهدة الرحلة الكاملة ذهابًا وإيابًا”

الفيديو أدناه لقطة واحدة متواصلة: رسم تقاطع، رسم مسار، توليد بصمات، تصدير حزمة esmini، ثم تشغيل ملف .xosc المُصدَّر في esmini.

لقطة واحدة: رسم تقاطع، رسم مسار، توليد بصمات، تصدير حزمة esmini، ثم تشغيل xosc. في esmini.

يوجد نقطة دخول واحدة لتصدير ASAM. لا يعرض drawtonomy خيارات منفصلة لـ .xodr أو .xosc — يُنتَج كلا الملفين معًا ويُحزَّمان في zip واحد.

قائمة Export مع تمييز خيار zip (esmini)

  1. ارسم المشهد (مسارات، تقاطع، مركبات، مسار حركة…).
  2. افتح القائمة ← Export.zip (esmini).
  3. أدخل اسمًا أساسيًا عند الطلب (الافتراضي drawtonomy-<date>).
  4. يُنزَّل ملف <name>.zip يحتوي <name>.xodr و<name>.xosc وأصول النماذج ثلاثية الأبعاد التي يرجع إليها السيناريو.

يُصدَّر الصفحة الحالية بأكملها — لا يوجد وضع “التحديد فقط” لهدف ASAM.

Terminal window
unzip drawtonomy-2026-05-30.zip
cd drawtonomy-2026-05-30
esmini --osc drawtonomy-2026-05-30.xosc --window 60 60 1024 768

مركبة تتبع المسار المُصدَّر في esmini

تسير المركبة على طول الخط البرتقالي — هذا الخط هو الـ FollowTrajectoryAction المُولَّد من المسار الذي رسمته.

شكل drawtonomyعنصر OpenDRIVEملاحظات
Lane<road> واحدمسار واحد = طريق مستقل واحد
Traffic light<signal> على أقرب طريقنوع مركبة / مشاة فقط
Crosswalk<object type="crosswalk">يُوضَع عموديًا على الطريق
Polygon (≥3 نقاط)<object type="patch"> مع <outline>يملأ التقاطعات والمناطق بصريًا

كل ما عدا ذلك — المركبات، المشاة، النقاط المنفردة، الخطوط المستقيمة الحرة، النصوص، الصور — لا يُكتب في ملف .xodr.

تفاصيل كل طريق:

  • الهندسة خطوط مستقيمة فقط. يُأخذ مرجع الطريق من حدود المسار اليسرى والأيمن ويُصدَّر كمقاطع <line>. لا يُنتَج أي قوس أو حلزوني أو poly3.
  • تخطيط ثابت للمسارات. كل طريق يحصل على مسار أيسر واحد (id=1) ومسار مركزي (id=0) ومسار أيمن (id=-1)، جميعها type="driving". الطرق متعددة المسارات وأقسام المسار المتعددة غير مدعومة.
  • علامات الطريق مُثبَّتة على خط solid white 0.13 m.
  • لا تقاطعات. كل طريق يحمل junction="-1" ولا يُنتَج أي عنصر <junction>. تُعبَّر عن التقاطعات فقط عبر رقعة المضلع (بصريًا) وعبر روابط السلف/الخلف المستمدة من اتصالات next/prev للمسار (الإدخال الأول فقط).
  • لا ارتفاع أو ميل عرضي — تُصدَّر elevationProfile وlateralProfile فارغتين (طرق مسطحة مستوية).
  • المقياس ثابت عند 16.67 بكسل/م؛ الأصل الجغرافي 0.
شكل drawtonomyعنصر OpenSCENARIO
Vehicle<ScenarioObject> (<Vehicle> أو <Pedestrian>)
Path footprint (المركبة الأمامية)<FollowTrajectoryAction>

“المشاة” هو شكل مركبة يطابق اسم قالبه نمط مشاة/مشي — يُصدَّر كـ <Pedestrian> بدلًا من <Vehicle>. المسارات، ممرات المشاة، إشارات المرور، والخطوط المستقيمة الحرة لا تُصدَّر في .xosc.

السيناريو المُصدَّر مُقتضب بقصد:

  • السلوك الديناميكي الوحيد هو FollowTrajectoryAction — خط متعدد النقاط مُختوم بالوقت. لا توجد إجراءات سرعة، تغييرات مسار، استجابات لإشارات المرور، تجنب تصادم، أو أي شروط تفاعل.
  • تبدأ كل كيان متحرك عند SimulationTime ≥ 0 وللسيناريو StopTrigger صارم عند 60 ث.

كيف تتحول بصمة المسار إلى حركة مركبة

Section titled “كيف تتحول بصمة المسار إلى حركة مركبة”

هذا جوهر التصدير الديناميكي، لذا يستحق الدقة.

لوحة footprint: تحديد المواضع المتغير، الفاصل والمرساة

المسار هو خط تعديل ترسمه، والبصمات هي نسخ شبحية من المركبة مُوزَّعة عليه (الأثر الذي تراه في المحرر). عند التصدير:

  1. فقط البصمة الأولى (المقدمة) تصبح <ScenarioObject> متحركًا. الأشباح الخلفية معاينة على القماشة وتُحذف — تحصل على مركبة واحدة تقطع المسار بالكامل، لا طابورًا.
  2. تصبح نقاط التحكم في المسار رؤوس المسار، بالأمتار في الإحداثيات العالمية (ENU).
  3. يحصل كل رأس على قيمة time، والنتيجة تُكتب كـ <Trajectory><Polyline> من <Vertex time="…"> داخل <FollowTrajectoryAction>.

السرعة ثابتة (وهذا القيد الجوهري)

Section titled “السرعة ثابتة (وهذا القيد الجوهري)”

يُوقَّت المسار بسرعة مُثبَّتة 10 م/ث (≈ 36 كم/س). لا يوجد في drawtonomy حقل سرعة في أي مكان بالواجهة، والمُصدِّر لا يتجاوز الإعداد الافتراضي أبدًا. ستُشاهد في esmini الكيان يُبلّغ عن ~36 كم/س بغض النظر عما رسمته. لا تضبط السرعة — بل تشكّل التوقيت من خلال تخطيط البصمات، كما هو موضح أدناه.

يحدد تبديل “Variable positioning” كيف يُوزَّع الوقت على طول المسار:

  • موحّد (التبديل OFF) — تجلس البصمات عند Interval متساوية بالطول القوسي والوقت = المسافة / 10 م/ث. الحركة بسرعة ثابتة. تغيير الـ Interval يغير فقط عدد الرؤوس المكتوبة (كثافة العينات)؛ شكل المسار والمدة الكلية لا يتغيران.
  • متغير (التبديل ON) — كل بصمة مُثبَّتة على موضع على طول المسار، والمدة الكلية تُقسَّم إلى شرائح زمنية متساوية بين البصمات. حيث تتكدس البصمات تسير المركبة ببطء؛ حيث تتفرق تسرع. هذه الطريقة الوحيدة للتحكم في السرعة الفعلية على طول المسار.

ما تحرّره ↔ ما يتغير في .xosc

Section titled “ما تحرّره ↔ ما يتغير في .xosc”
إجراء في المحررالأثر على التصدير
تحريك نقطة تحكم في المسارإحداثيات رأس المسار + المدة الكلية (الطول يتغير، السرعة تبقى 10 م/ث)
سحب بصمة في وضع Variableالموضع المُعيَّر للبصمة ← time رأسها ← السرعة (الفعلية) في تلك القطعة
تبديل Variable positioningالتبديل بين التوقيت المتساوي والسرعة المتساوية
تغيير Interval (الوضع الموحّد)عدد الرؤوس فقط — شكل المسار والسرعة لا يتغيران
تغيير Anchorإزاحة رسم البصمة فقط — لا أثر على المسار المُصدَّر
تغيير قالب المركبةvehicleCategory، النموذج ثلاثي الأبعاد، ارتفاع الصندوق المحيط، الإعداد المسبق للأداء
تغيير حجم المركبة (w, h)أبعاد BoundingBox وهندسة المحور
تدوير المركبةالاتجاه الأولي (فقط حين لا يوجد مسار للمركبة)
تحريك المركبةWorldPosition الأولي (يُضبَّط على بداية المسار إن وُجد)

للإجابة المباشرة على السؤال الشائع: نعم — تحريك بصمة في منتصف المسار في الوضع المتغير يغير خطة السرعة المُصدَّرة، لأنه يُعيد توقيت تلك القطعة. تحريكها في الوضع الموحّد، أو تغيير الـ Anchor، لا يؤثر.

لتوضيح النطاق الحقيقي، هذه القيم تأتي من خرائط أو ثوابت مُثبَّتة لا مما يمكن تعديله: فئة المركبة وإعداداتها المسبقة للأداء، مسارات النماذج ثلاثية الأبعاد، ارتفاع المركبة حسب الفئة، هندسة المحور (مستمدة من الحجم)، وضع الاتباع (position)، محفّز الإيقاف عند 60 ث، والأهم من كل ذلك — سرعة المسار 10 م/ث.

المُصدِّر مشحون في @drawtonomy/sdk ويعمل دون المحرر. على خلاف القائمة، يتيح SDK أيضًا إصدار الملفين بشكل منفصل:

import { exporter, createSnapshot } from '@drawtonomy/sdk'
const snapshot = createSnapshot(shapes)
// معًا (مثل القائمة):
const { blob, baseName } = exporter.buildEsminiZip(snapshot, {
baseName: 'my-scene',
})
// أو كل صيغة بمفردها:
const xodr = exporter.exportToOpenDrive(snapshot)
const xosc = exporter.exportToOpenScenario(snapshot, {
xodrFilename: 'my-scene.xodr',
})

للاطلاع على API الكامل ونقاط التوسعة، راجع مرجع Exporter SDK.

الصيغةالإصدار
OpenDRIVE1.8
OpenSCENARIO1.3

مدعوم: طرق مستقيمة من المسارات؛ إشارات المرور وممرات المشاة والرقع كعناصر OpenDRIVE؛ مركبة واحدة لكل مسار تتبع مسارًا مُوقَّتًا؛ حزمة esmini جاهزة للتشغيل فورًا.

غير مدعوم بعد: تقاطعات OpenDRIVE، الهندسة المنحنية، الطرق متعددة المسارات، ارتفاع الطريق؛ إجراءات السرعة في OpenSCENARIO، تغييرات المسار، منطق إشارات المرور، تفاعل متعدد العوامل، أو أي تحكم في سرعة كل مركبة.