דלגו לתוכן

ייצוא ל-OpenDRIVE / OpenSCENARIO / esmini

drawtonomy ממיר סצנה מצוירת לרשת דרכים OpenDRIVE (.xodr) ותרחיש OpenSCENARIO (.xosc) של ASAM, ארוזים ב-zip אחד שניתן להריץ מיד ב-esmini.

ההמרה מכוונת להיות בסיסית במכוון — היא מכסה את הצורות שממפות בצורה נקייה למודל הנתונים של ASAM ומשאירה את השאר בחוץ. הדף הזה מתעד בדיוק מה מומר, מה הרכב המיוצא עושה בפועל, ומה מחוץ לתחום — כדי שהפלט לא יבטיח יותר ממה שיש.

הווידאו הבא הוא לקיחה אחת ברצף: מצייר צומת, מצייר מסלול, מייצר footprints, מייצא את ה-zip ל-esmini, ואז מריץ את ה-.xosc המיוצא ב-esmini.

לקיחה אחת: ציור צומת, ציור מסלול, יצירת footprints, ייצוא ה-zip ל-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, ונכסי המודל התלת-ממדי של esmini שהתרחיש מפנה אליהם.

כל הדף הנוכחי מיוצא — אין מצב “בחירה בלבד” ליעד 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> אחדנתיב 1 = כביש עצמאי אחד
Traffic light<signal> על הכביש הקרוב ביותרסוג רכב / הולך רגל בלבד
Crosswalk<object type="crosswalk">ממוקם ניצב לכביש
Polygon (3 נקודות ומעלה)<object type="patch"> עם <outline>ממלא ויזואלים של צומת/שטח

כל השאר — רכבים, הולכי רגל, נקודות בודדות, linestrings חופשיים, טקסט, תמונות — אינו נכתב ל-.xodr.

עד כמה כל כביש מגיע:

  • גיאומטריה של קווים ישרים בלבד. קו ייחוס הכביש מדגם מגבולות שמאל/ימין של הנתיב ומיוצא כקטעי <line>. לא נוצרת גיאומטריית arc, spiral או poly3.
  • פריסת נתיב קבועה. כל כביש מקבל בדיוק נתיב שמאלי אחד (id=1), נתיב מרכזי אחד (id=0), ונתיב ימני אחד (id=-1), כולם type="driving". כבישים עם מספר נתיבים וחלקי נתיב מרובים אינם מיוצגים.
  • סימוני הכביש מקודדים קשיח לקו solid white 0.13 m.
  • אין צמתים. כל כביש נושא junction="-1" ואף <junction> לא נוצר אי פעם. צמתים מועברים רק דרך ה-patch הפולגוני (ויזואלים) ודרך קישורי predecessor/successor הנגזרים מחיבורי next / prev של הנתיב (כניסה ראשונה בלבד).
  • ללא גובה / superelevationelevationProfile ו-lateralProfile מיוצאים ריקים (כבישים שטוחים).
  • קנה מידה קבוע של 16.67 px/m; מקור גיאוגרפי הוא 0.
צורת drawtonomyאלמנט OpenSCENARIO
Vehicle<ScenarioObject> (<Vehicle> או <Pedestrian>)
Path footprint (הרכב המוביל)<FollowTrajectoryAction>

“הולך רגל” הוא פשוט צורת רכב ששמה תואם תבנית pedestrian/walk — הוא מיוצא כ-<Pedestrian> במקום <Vehicle>. נתיבים, מעברי חציה, רמזורים ו-linestrings חופשיים אינם מיוצאים ל-.xosc.

התרחיש המיוצא הוא מינימלי במכוון:

  • ההתנהגות הדינמית היחידה היא FollowTrajectoryAction — polyline עם חותמות זמן. אין פעולות מהירות, החלפות נתיב, תגובות לרמזורים, הימנעות מהתנגשות, או תנאי אינטראקציה כלשהם.
  • כל ישות נעה מתחילה ב-SimulationTime ≥ 0 והתרחיש מכיל StopTrigger קשיח של 60 שניות.

איך footprint של מסלול הופך לתנועת רכב

Section titled “איך footprint של מסלול הופך לתנועת רכב”

זהו ליבת הייצוא הדינמי, לכן כדאי להיות מדויקים.

פאנל ה-footprint: מיקום משתנה, Interval ו-Anchor מוסברים

Path הוא linestring שמצייר, ו-footprints הם עותקים-רוחות של רכב שמסודרים לאורכו (השובל שרואים בעורך). בייצוא:

  1. רק ה-footprint המוביל (הראשון) הופך ל-<ScenarioObject> נע. הצללים הנגררים הם תצוגה מקדימה בלבד על הקנבס ומושמטים — מקבלים רכב אחד שנוסע לאורך כל המסלול, לא שיירה.
  2. נקודות הבקרה של המסלול הופכות לצמתי המסלול, בקואורדינטות עולמיות (ENU) במטרים.
  3. כל צומת מקבל time, והתוצאה נכתבת כ-<Trajectory><Polyline> של <Vertex time="…"> בתוך <FollowTrajectoryAction>.

המהירות קבועה (זוהי המגבלה המרכזית)

Section titled “המהירות קבועה (זוהי המגבלה המרכזית)”

המסלול מתוזמן ב-10 m/s קשיח (≈ 36 km/h). ל-drawtonomy אין שדה מהירות בשום מקום בממשק, והמייצא לעולם לא מבטל את ברירת המחדל. ב-esmini תראה את הישות מדווחת על ~36 km/h ללא תלות במה שציירת. במקום לקבוע מהירות, את/ה מעצב/ת את התזמון דרך פריסת ה-footprints, כמתואר בהמשך.

מה שקובע הוא מתג Variable positioning במסלול:

  • אחיד (מתג כבוי) — footprints ממוקמים במרחקי Interval שווים לאורך הקשת, והזמן הוא מרחק / 10 m/s. התנועה היא מהירות קבועה. שינוי ה-Interval משנה רק את מספר הצמתים שנכתבים (צפיפות דגימה); צורת המסלול ומשך הזמן הכולל אינם משתנים.
  • משתנה (מתג פעיל) — כל footprint מוצמד למיקום לאורך המסלול, ומשך הזמן הכולל מחולק ל-פרוסות זמן שוות בין footprints. במקומות שה-footprints צפופים הרכב נע לאט; במקומות שהם מרווחים הוא נע מהר. זה הדרך היחידה לשנות את המהירות האפקטיבית לאורך המסלול.

מה עורכים ↔ מה משתנה ב-.xosc

Section titled “מה עורכים ↔ מה משתנה ב-.xosc”
פעולה בעורךהשפעה על הייצוא
הזזת נקודת בקרה של מסלולקואורדינטות צומת המסלול + משך כולל (האורך משתנה, המהירות נשארת 10 m/s)
גרירת footprint במצב Variableהמיקום המנורמל של אותו footprint ← time של הצומת שלו ← המהירות האפקטיבית של אותה רגל
הפעלת Variable positioningמחליף בין תזמון זמן-שווה ומהירות-שווה
שינוי Interval (מצב אחיד)מספר הצמתים בלבד — צורת המסלול והמהירות אינן משתנות
שינוי Anchorאופסט ציור ה-footprint בלבד — אין השפעה על המסלול המיוצא
שינוי תבנית הרכבvehicleCategory, מודל תלת-ממד, גובה תיבת גבול, preset ביצועים
שינוי גודל הרכב (w, h)מידות BoundingBox וגיאומטריית הסרנים
סיבוב הרכבכיוון ראשוני (רק כשלרכב אין מסלול)
הזזת הרכבWorldPosition ראשונית (מוצמדת לתחילת המסלול אם קיים)

לסיכום השאלה הנפוצה: כן — הזזת footprint לאמצע המסלול במצב Variable משנה את תוכנית המהירות המיוצאת, כי היא מתזמנת מחדש את אותו קטע. הזזה במצב Uniform, או שינוי ה-Anchor, אינן משנות.

לשקיפות מלאה לגבי התחום, הפרטים הבאים נקבעים ממפות או קבועים קבועים ולא מדבר שניתן לערוך: קטגוריית רכב/presets ביצועים, נתיבי מודל תלת-ממד, גובה רכב לפי קטגוריה, גיאומטריית סרנים (נגזרת מהגודל), מצב מעקב (position), ה-stop trigger של 60 שניות, ובעיקר — מהירות המסלול של 10 m/s.

המייצא מגיע עם @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 המלא ולנקודות הרחבה, ראו את עיון ה-SDK של המייצא.

פורמטגרסה
OpenDRIVE1.8
OpenSCENARIO1.3

נתמך: כבישים של קווים ישרים מנתיבים; רמזורים, מעברי חציה ו-patches של צומת כאובייקטי OpenDRIVE; רכב אחד לכל מסלול שעוקב אחר מסלול מתוזמן; zip עובד ל-esmini שניתן להריץ מיד.

טרם נתמך: צמתי OpenDRIVE, גיאומטריה מעוקלת, כבישים רב-נתיביים, גובה כביש; פעולות מהירות ב-OpenSCENARIO, החלפות נתיב, לוגיקת רמזורים, אינטראקציה רב-סוכנים, או שליטה במהירות לרכב.