ส่งออกเป็น OpenDRIVE / OpenSCENARIO / esmini
drawtonomy แปลงฉากที่วาดด้วยมือให้เป็นโครงข่ายถนน ASAM
OpenDRIVE (.xodr)
พร้อมกับสถานการณ์
OpenSCENARIO (.xosc)
บรรจุรวมในไฟล์ zip ไฟล์เดียวที่นำไปเล่นใน
esmini ได้ทันที
การแปลงนี้ออกแบบให้เรียบง่ายตั้งใจ — ครอบคลุมเฉพาะรูปร่างที่แมปลงบน data model ของ ASAM ได้ชัดเจน ส่วนที่เหลือไม่ถูกนำไปด้วย หน้านี้อธิบายอย่างละเอียดว่าอะไรถูกแปลง ยานพาหนะที่ส่งออกทำอะไรได้บ้าง และอะไรอยู่นอกขอบเขต เพื่อให้ผลลัพธ์ที่ได้ไม่เกินความจริง
ดูการทำงานแบบครบวงจร
หัวข้อที่มีชื่อว่า “ดูการทำงานแบบครบวงจร”วิดีโอด้านล่างบันทึกต่อเนื่องไม่ตัด: วาดทางแยก วาดเส้นทาง สร้าง footprint ส่งออก zip สำหรับ esmini แล้วเล่น .xosc ที่ได้ใน esmini
วิธีส่งออกจากโปรแกรมแก้ไข
หัวข้อที่มีชื่อว่า “วิธีส่งออกจากโปรแกรมแก้ไข”มีจุดส่งออก ASAM เพียงจุดเดียว drawtonomy ไม่แยก menu รายการ .xodr / .xosc — ทั้งสองไฟล์สร้างพร้อมกันและบรรจุในไฟล์ zip เดียว

- วาดฉาก (เลน ทางแยก ยานพาหนะ เส้นทาง…)
- เปิด Menu → Export →
.zip (esmini) - ตั้งชื่อไฟล์เมื่อระบบถาม (ค่าเริ่มต้นคือ
drawtonomy-<วันที่>) - ไฟล์
<ชื่อ>.zipจะดาวน์โหลด ภายในมี<ชื่อ>.xodr,<ชื่อ>.xoscและไฟล์โมเดล 3D ที่สถานการณ์อ้างอิง
ระบบส่งออกทั้งหน้าปัจจุบัน ไม่มีโหมด “เฉพาะรูปที่เลือก” สำหรับการส่งออก ASAM
เล่นผลลัพธ์ใน esmini
หัวข้อที่มีชื่อว่า “เล่นผลลัพธ์ใน esmini”unzip drawtonomy-2026-05-30.zipcd drawtonomy-2026-05-30esmini --osc drawtonomy-2026-05-30.xosc --window 60 60 1024 768
ยานพาหนะวิ่งตามเส้นสีส้ม — เส้นนั้นคือ FollowTrajectoryAction ที่สร้างจากเส้นทางที่วาด
สิ่งที่ถูกแปลง
หัวข้อที่มีชื่อว่า “สิ่งที่ถูกแปลง”เข้า OpenDRIVE (.xodr)
หัวข้อที่มีชื่อว่า “เข้า OpenDRIVE (.xodr)”| รูปร่างใน 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ของเลน (เฉพาะรายการแรก) - ไม่มีระดับความสูง / superelevation —
elevationProfileและlateralProfileส่งออกว่างเปล่า (ถนนราบแบน) - มาตราส่วนกำหนดที่ 16.67 px/m จุดกำเนิดทางภูมิศาสตร์คือ
0
เข้า OpenSCENARIO (.xosc)
หัวข้อที่มีชื่อว่า “เข้า OpenSCENARIO (.xosc)”| รูปร่างใน 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 กลายเป็นการเคลื่อนที่ของยานพาหนะอย่างไร”นี่คือแกนหลักของการส่งออกแบบไดนามิก จึงควรเข้าใจให้ชัดเจน

Path คือเส้นที่วาด และ footprint คือสำเนาโปร่งใสของยานพาหนะที่จัดวางตามเส้น (ร่องรอยที่เห็นในโปรแกรมแก้ไข) เมื่อส่งออก:
- เฉพาะ footprint แรกสุด (ตัวนำ) เท่านั้นที่กลายเป็น
<ScenarioObject>ที่เคลื่อนที่ ส่วน footprint ที่ตามมาเป็นแค่ preview บนแคนวาสและจะถูกทิ้ง — ผลลัพธ์คือยานพาหนะหนึ่งคันที่วิ่งตลอดเส้นทาง ไม่ใช่คิว - จุดควบคุมของเส้นทางกลายเป็น vertex ของ trajectory ในหน่วยเมตร (ENU)
- แต่ละ 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 อยู่ชิดกัน ยานพาหนะเคลื่อนที่ช้า บริเวณที่ห่างกัน ยานพาหนะเคลื่อนที่เร็ว นี่คือวิธีเดียวที่จะปรับความเร็วที่มีผลตลอดเส้นทาง
การแก้ไขในโปรแกรม ↔ ผลต่อไฟล์ .xosc
หัวข้อที่มีชื่อว่า “การแก้ไขในโปรแกรม ↔ ผลต่อไฟล์ .xosc”| การกระทำในโปรแกรมแก้ไข | ผลต่อการส่งออก |
|---|---|
| ย้าย จุดควบคุมของเส้นทาง | พิกัด 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
เวอร์ชันที่ส่งออก
หัวข้อที่มีชื่อว่า “เวอร์ชันที่ส่งออก”| รูปแบบ | เวอร์ชัน |
|---|---|
| OpenDRIVE | 1.8 |
| OpenSCENARIO | 1.3 |
ขอบเขตโดยสรุป
หัวข้อที่มีชื่อว่า “ขอบเขตโดยสรุป”รองรับ: ถนนเส้นตรงจากเลน สัญญาณ ทางม้าลาย และ patch ทางแยกเป็น object ของ OpenDRIVE ยานพาหนะหนึ่งคันต่อเส้นทางที่วิ่งตาม trajectory แบบมีเวลา และไฟล์ zip พร้อมเล่นใน esmini ทันที
ยังไม่รองรับ: junction ของ OpenDRIVE เรขาคณิตโค้ง ถนนหลายเลน ระดับความสูงถนน; speed action การเปลี่ยนเลน logic สัญญาณไฟ interaction ระหว่าง agent หลายตัว และการควบคุมความเร็วต่อยานพาหนะของ OpenSCENARIO
ดูเพิ่มเติม
หัวข้อที่มีชื่อว่า “ดูเพิ่มเติม”- สถาปัตยกรรมตัวส่งออก — สิ่งที่ pipeline ทำระหว่าง snapshot และไฟล์
- การเพิ่มรูปแบบเป้าหมาย — เชื่อม CARLA, SUMO, Unity หรือรูปแบบอื่น ๆ