ข้ามไปยังเนื้อหา

ส่งออกเป็น OpenDRIVE / OpenSCENARIO / esmini

drawtonomy แปลงฉากที่วาดด้วยมือให้เป็นโครงข่ายถนน ASAM OpenDRIVE (.xodr) พร้อมกับสถานการณ์ OpenSCENARIO (.xosc) บรรจุรวมในไฟล์ zip ไฟล์เดียวที่นำไปเล่นใน esmini ได้ทันที

การแปลงนี้ออกแบบให้เรียบง่ายตั้งใจ — ครอบคลุมเฉพาะรูปร่างที่แมปลงบน data model ของ ASAM ได้ชัดเจน ส่วนที่เหลือไม่ถูกนำไปด้วย หน้านี้อธิบายอย่างละเอียดว่าอะไรถูกแปลง ยานพาหนะที่ส่งออกทำอะไรได้บ้าง และอะไรอยู่นอกขอบเขต เพื่อให้ผลลัพธ์ที่ได้ไม่เกินความจริง

วิดีโอด้านล่างบันทึกต่อเนื่องไม่ตัด: วาดทางแยก วาดเส้นทาง สร้าง footprint ส่งออก zip สำหรับ esmini แล้วเล่น .xosc ที่ได้ใน esmini

One take: draw an intersection, draw a path, generate footprints, export the esmini zip, then replay the exported .xosc in esmini.

มีจุดส่งออก ASAM เพียงจุดเดียว drawtonomy ไม่แยก menu รายการ .xodr / .xosc — ทั้งสองไฟล์สร้างพร้อมกันและบรรจุในไฟล์ zip เดียว

เมนู Export ที่ไฮไลต์รายการ .zip (esmini)

  1. วาดฉาก (เลน ทางแยก ยานพาหนะ เส้นทาง…)
  2. เปิด Menu → Export → .zip (esmini)
  3. ตั้งชื่อไฟล์เมื่อระบบถาม (ค่าเริ่มต้นคือ drawtonomy-<วันที่>)
  4. ไฟล์ <ชื่อ>.zip จะดาวน์โหลด ภายในมี <ชื่อ>.xodr, <ชื่อ>.xosc และไฟล์โมเดล 3D ที่สถานการณ์อ้างอิง

ระบบส่งออกทั้งหน้าปัจจุบัน ไม่มีโหมด “เฉพาะรูปที่เลือก” สำหรับการส่งออก 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

ยานพาหนะวิ่งตาม trajectory ที่ส่งออกใน esmini

ยานพาหนะวิ่งตามเส้นสีส้ม — เส้นนั้นคือ FollowTrajectoryAction ที่สร้างจากเส้นทางที่วาด

รูปร่างใน drawtonomyองค์ประกอบใน OpenDRIVEหมายเหตุ
Lane<road> หนึ่งรายการ1 เลน = 1 ถนนอิสระ
Traffic light<signal> บนถนนที่ใกล้ที่สุดเฉพาะประเภทยานพาหนะ / คนเดินเท้า
Crosswalk<object type="crosswalk">วางตั้งฉากกับถนน
Polygon (≥3 จุด)<object type="patch"> พร้อม <outline>ใช้แสดงภาพบริเวณทางแยก/พื้นที่

รูปร่างอื่น ๆ — ยานพาหนะ คนเดินเท้า จุดเดี่ยว linestring อิสระ ข้อความ รูปภาพ — ไม่ถูกเขียนลงในไฟล์ .xodr

รายละเอียดของแต่ละถนน:

  • เรขาคณิตเป็นเส้นตรงเท่านั้น เส้นอ้างอิงของถนนสุ่มตัวอย่างจากขอบซ้าย/ขวาของเลน แล้วส่งออกเป็นส่วน <line> ไม่มีการสร้างเรขาคณิต arc, spiral หรือ poly3
  • โครงเลนคงที่ ทุกถนนมีเลนซ้าย (id=1) เลนกลาง (id=0) และเลนขวา (id=-1) เท่ากันทุกช่อง ทุกช่องเป็น type="driving" ไม่รองรับถนนหลายเลนหรือหลาย lane section
  • เส้นแบ่งถนน กำหนดตายตัวเป็น solid white 0.13 m
  • ไม่มี junction ทุกถนนมี junction="-1" และ ไม่มีการสร้าง <junction> เลย ทางแยกแสดงผลด้วย polygon patch (ภาพ) และการเชื่อม predecessor/successor จากการเชื่อมต่อ next / prev ของเลน (เฉพาะรายการแรก)
  • ไม่มีระดับความสูง / superelevationelevationProfile และ lateralProfile ส่งออกว่างเปล่า (ถนนราบแบน)
  • มาตราส่วนกำหนดที่ 16.67 px/m จุดกำเนิดทางภูมิศาสตร์คือ 0
รูปร่างใน drawtonomyองค์ประกอบใน OpenSCENARIO
Vehicle<ScenarioObject> (<Vehicle> หรือ <Pedestrian>)
Path footprint (ยานพาหนะนำ)<FollowTrajectoryAction>

“คนเดินเท้า” คือรูปร่าง Vehicle ที่ชื่อ template ตรงกับรูปแบบ pedestrian/walk — จะส่งออกเป็น <Pedestrian> แทน <Vehicle> ส่วนเลน ทางม้าลาย สัญญาณไฟจราจร และ linestring อิสระ ไม่ถูกนำเข้าไฟล์ .xosc

สถานการณ์ที่ส่งออกออกแบบให้เรียบง่ายโดยตั้งใจ:

  • พฤติกรรมเคลื่อนที่เพียงอย่างเดียวคือ FollowTrajectoryAction — polyline แบบมี timestamp ไม่มี speed action การเปลี่ยนเลน การตอบสนองต่อสัญญาณไฟ การหลบหลีกการชน หรือเงื่อนไข interaction ใด ๆ
  • แต่ละ entity ที่เคลื่อนที่เริ่มที่ SimulationTime ≥ 0 และสถานการณ์มี StopTrigger ที่ 60 วินาที

เส้นทาง footprint กลายเป็นการเคลื่อนที่ของยานพาหนะอย่างไร

หัวข้อที่มีชื่อว่า “เส้นทาง footprint กลายเป็นการเคลื่อนที่ของยานพาหนะอย่างไร”

นี่คือแกนหลักของการส่งออกแบบไดนามิก จึงควรเข้าใจให้ชัดเจน

แผง footprint: Variable positioning, Interval และ Anchor อธิบาย

Path คือเส้นที่วาด และ footprint คือสำเนาโปร่งใสของยานพาหนะที่จัดวางตามเส้น (ร่องรอยที่เห็นในโปรแกรมแก้ไข) เมื่อส่งออก:

  1. เฉพาะ footprint แรกสุด (ตัวนำ) เท่านั้นที่กลายเป็น <ScenarioObject> ที่เคลื่อนที่ ส่วน footprint ที่ตามมาเป็นแค่ preview บนแคนวาสและจะถูกทิ้ง — ผลลัพธ์คือยานพาหนะหนึ่งคันที่วิ่งตลอดเส้นทาง ไม่ใช่คิว
  2. จุดควบคุมของเส้นทางกลายเป็น vertex ของ trajectory ในหน่วยเมตร (ENU)
  3. แต่ละ vertex ได้รับค่า time แล้วเขียนเป็น <Trajectory><Polyline> ของ <Vertex time="…"> ภายใน <FollowTrajectoryAction>

trajectory ถูกกำหนดเวลาด้วยความเร็ว 10 m/s (ประมาณ 36 km/h) ที่เขียนตายตัว drawtonomy ไม่มีช่องกรอกความเร็ว ที่ไหนเลยในหน้าจอ และตัวส่งออกไม่เคยเปลี่ยนค่า default ใน esmini entity จะรายงานความเร็วประมาณ 36 km/h ไม่ว่าจะวาดอย่างไร แต่สามารถปรับการกระจายเวลาผ่านการจัดวาง footprint ได้ตามที่อธิบายต่อไป

การเปิด/ปิด toggle “Variable positioning” ของเส้นทางเป็นตัวกำหนดวิธีกระจายเวลาตลอด trajectory:

  • Uniform (toggle ปิด) — footprint วางห่างกันเท่า ๆ กันตามความยาวส่วนโค้ง (Interval) และเวลาคือ ระยะทาง / 10 m/s การเคลื่อนที่จะคงความเร็ว การเปลี่ยน Interval เปลี่ยนเพียงจำนวน vertex ที่เขียน (ความหนาแน่นตัวอย่าง) รูปร่างเส้นทางและระยะเวลารวมไม่เปลี่ยน
  • Variable (toggle เปิด) — footprint แต่ละตัวยึดตำแหน่งบนเส้นทาง ระยะเวลารวมแบ่งเป็นช่วงเวลาเท่ากันระหว่าง footprint บริเวณที่ footprint อยู่ชิดกัน ยานพาหนะเคลื่อนที่ช้า บริเวณที่ห่างกัน ยานพาหนะเคลื่อนที่เร็ว นี่คือวิธีเดียวที่จะปรับความเร็วที่มีผลตลอดเส้นทาง
การกระทำในโปรแกรมแก้ไขผลต่อการส่งออก
ย้าย จุดควบคุมของเส้นทางพิกัด vertex ของ trajectory + ระยะเวลารวม (ความยาวเปลี่ยน ความเร็วคง 10 m/s)
ลาก footprint ในโหมด Variableตำแหน่งที่ normalize แล้วของ footprint → time ของ vertex → ความเร็วที่มีผล (effective) ของช่วงนั้น
สลับ Variable positioningสลับระหว่างการกำหนดเวลาแบบ equal-time และ equal-speed
เปลี่ยน Interval (โหมด uniform)จำนวน vertex เท่านั้น — รูปร่าง trajectory และความเร็วไม่เปลี่ยน
เปลี่ยน Anchorเปลี่ยนออฟเซ็ตการวาด footprint เท่านั้น — ไม่มีผลต่อ trajectory ที่ส่งออก
เปลี่ยน template ยานพาหนะvehicleCategory, โมเดล 3D, ความสูง bounding box, preset ประสิทธิภาพ
ปรับขนาดยานพาหนะ (w, h)ขนาด BoundingBox และ geometry ของเพลา
หมุนยานพาหนะหัวเริ่มต้น (เฉพาะเมื่อยานพาหนะไม่มี trajectory)
ย้ายยานพาหนะWorldPosition เริ่มต้น (snap ไปจุดเริ่มต้น trajectory ถ้ามี)

สรุปคำถามที่พบบ่อย: ใช่ — การย้าย footprint ไปตามเส้นทางในโหมด Variable จะเปลี่ยนแผนความเร็วที่ส่งออก เพราะมันกำหนดเวลาใหม่ของช่วงนั้น การย้ายในโหมด Uniform หรือการเปลี่ยน Anchor ไม่มีผล

เพื่อความซื่อตรงต่อขอบเขต ค่าเหล่านี้มาจาก map หรือ constant คงที่ ไม่ใช่สิ่งที่แก้ไขได้: หมวดหมู่/preset ประสิทธิภาพยานพาหนะ, path โมเดล 3D, ความสูงยานพาหนะตามหมวดหมู่, geometry ของเพลา (คำนวณจากขนาด), โหมดการตาม (position), stop trigger 60 วินาที และที่สำคัญที่สุดคือความเร็ว trajectory 10 m/s

ตัวส่งออกมาพร้อมกับ @drawtonomy/sdk และทำงานได้โดยไม่ต้องเปิดโปรแกรมแก้ไข ต่างจาก menu ตรงที่ SDK ยังให้ส่งออกสองไฟล์แยกกันได้ด้วย:

import { exporter, createSnapshot } from '@drawtonomy/sdk'
const snapshot = createSnapshot(shapes)
// รวมเป็น zip (เหมือนกับ menu):
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

รองรับ: ถนนเส้นตรงจากเลน สัญญาณ ทางม้าลาย และ patch ทางแยกเป็น object ของ OpenDRIVE ยานพาหนะหนึ่งคันต่อเส้นทางที่วิ่งตาม trajectory แบบมีเวลา และไฟล์ zip พร้อมเล่นใน esmini ทันที

ยังไม่รองรับ: junction ของ OpenDRIVE เรขาคณิตโค้ง ถนนหลายเลน ระดับความสูงถนน; speed action การเปลี่ยนเลน logic สัญญาณไฟ interaction ระหว่าง agent หลายตัว และการควบคุมความเร็วต่อยานพาหนะของ OpenSCENARIO