Bỏ qua để đến nội dung

Xuất sang OpenDRIVE / OpenSCENARIO / esmini

drawtonomy chuyển bản vẽ tay thành mạng lưới đường ASAM OpenDRIVE (.xodr) kèm kịch bản OpenSCENARIO (.xosc), đóng gói trong một file zip để phát lại trực tiếp trên esmini.

Quá trình chuyển đổi được thiết kế đơn giản có chủ đích — chỉ những hình vẽ nào ánh xạ rõ ràng sang mô hình dữ liệu ASAM mới được xử lý, phần còn lại bị bỏ qua. Trang này ghi lại chính xác những gì được chuyển đổi, xe xuất ra thực sự hoạt động ra sao, và những gì nằm ngoài phạm vi hỗ trợ — để đầu ra không bao giờ hứa hẹn quá mức.

Video dưới đây được quay một lần liên tục: vẽ giao lộ, vẽ đường đi, tạo dấu chân, xuất zip esmini, rồi phát lại file .xosc xuất ra trong esmini.

Một lần quay: vẽ giao lộ, vẽ đường đi, tạo dấu chân, xuất zip esmini, rồi phát lại .xosc trong esmini.

Chỉ có một điểm xuất ASAM duy nhất. drawtonomy không tách riêng mục .xodr / .xosc trong menu — cả hai file luôn được tạo cùng nhau và nén vào một zip.

Menu Export với .zip (esmini) được tô sáng

  1. Vẽ cảnh của bạn (làn đường, giao lộ, phương tiện, đường đi…).
  2. Mở menu → Export → .zip (esmini).
  3. Nhập tên cơ sở khi được hỏi (mặc định là drawtonomy-<ngày>).
  4. File <tên>.zip được tải xuống, chứa <tên>.xodr, <tên>.xosc, và các tài sản mô hình 3D esmini mà kịch bản tham chiếu.

Toàn bộ trang hiện tại được xuất — không có chế độ “chỉ xuất vùng chọn” cho mục tiêu 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

Xe đang đi theo quỹ đạo xuất ra trong esmini

Xe chạy dọc theo đường màu cam — đường đó chính là FollowTrajectoryAction được tạo từ đường đi bạn đã vẽ.

Hình vẽ drawtonomyPhần tử OpenDRIVEGhi chú
Lanemột <road>1 làn = 1 đường độc lập
Traffic light<signal> trên đường gần nhấtchỉ loại xe / người đi bộ
Crosswalk<object type="crosswalk">đặt vuông góc với đường
Polygon (≥3 điểm)<object type="patch"> với <outline>hiển thị giao lộ / vùng diện tích

Tất cả những gì còn lại — phương tiện, người đi bộ, điểm đơn lẻ, đường linestring tự do, văn bản, hình ảnh — không được ghi vào .xodr.

Các giới hạn của từng đường:

  • Hình học chỉ là đường thẳng. Đường tham chiếu được lấy mẫu từ biên trái/phải của làn và phát ra dưới dạng các đoạn <line>. Không có hình học arc, spiral, hay poly3.
  • Bố cục làn cố định. Mỗi đường có đúng một làn trái (id=1), một làn trung tâm (id=0), và một làn phải (id=-1), tất cả type="driving". Đường nhiều làn và nhiều phần làn không được biểu diễn.
  • Vạch đường được mã hóa cứng là solid white 0.13 m.
  • Không có junction. Mỗi đường mang junction="-1"không có phần tử <junction> nào được tạo ra. Giao lộ chỉ được thể hiện qua mảng polygon (hình ảnh) và các liên kết predecessor/successor suy ra từ kết nối next / prev của làn (chỉ mục đầu tiên).
  • Không có độ cao / siêu caoelevationProfilelateralProfile được phát ra rỗng (đường phẳng).
  • Tỷ lệ cố định 16,67 px/m; gốc địa lý là 0.
Hình vẽ drawtonomyPhần tử OpenSCENARIO
Vehiclemột <ScenarioObject> (<Vehicle> hoặc <Pedestrian>)
Dấu chân đường đi (xe dẫn đầu)một <FollowTrajectoryAction>

“Người đi bộ” là hình xe mà tên template khớp với mẫu pedestrian/walk — được phát ra dưới dạng <Pedestrian> thay vì <Vehicle>. Làn đường, vạch qua đường, đèn giao thông và đường linestring tự do không được đưa vào .xosc.

Kịch bản xuất ra được giữ tối giản có chủ đích:

  • Hành vi động duy nhất là FollowTrajectoryAction — một polyline có dấu thời gian. Không có hành động tốc độ, đổi làn, phản ứng đèn giao thông, tránh va chạm, hay bất kỳ điều kiện tương tác nào.
  • Mỗi thực thể di chuyển bắt đầu ở SimulationTime ≥ 0 và kịch bản có StopTrigger cứng ở 60 giây.

Cách dấu chân đường đi trở thành chuyển động xe

Phần tiêu đề “Cách dấu chân đường đi trở thành chuyển động xe”

Đây là phần cốt lõi của xuất động, vì vậy cần giải thích rõ ràng.

Bảng dấu chân: Định vị biến thiên, Khoảng cách và Điểm neo được giải thích

Đường đi là một linestring bạn vẽ, còn dấu chân là các bản sao ma của xe được rải dọc theo đó (vệt bạn thấy trong trình chỉnh sửa). Khi xuất:

  1. Chỉ dấu chân đầu tiên (dấu chân dẫn đầu) trở thành <ScenarioObject> di chuyển. Các bản sao phía sau chỉ là xem trước trên canvas và bị bỏ — bạn nhận được một xe chạy toàn bộ đường đi, không phải một đoàn xe.
  2. Các điểm điều khiển của đường đi trở thành các đỉnh quỹ đạo, tính bằng mét (tọa độ ENU).
  3. Mỗi đỉnh được gán một giá trị time, và kết quả được ghi dưới dạng <Trajectory><Polyline> gồm các <Vertex time="…"> bên trong <FollowTrajectoryAction>.

Tốc độ cố định (đây là giới hạn quan trọng nhất)

Phần tiêu đề “Tốc độ cố định (đây là giới hạn quan trọng nhất)”

Quỹ đạo được tính thời gian ở tốc độ cứng 10 m/s (≈ 36 km/h). drawtonomy không có trường tốc độ nào trong giao diện, và bộ xuất không bao giờ ghi đè giá trị mặc định này. Trong esmini, xe sẽ báo ~36 km/h bất kể bạn vẽ gì. Bạn không đặt tốc độ trực tiếp — mà thay vào đó định hình thời điểm qua bố cục dấu chân, như được mô tả tiếp theo.

Công tắc “Variable positioning” của đường đi quyết định cách phân bổ thời gian dọc theo quỹ đạo:

  • Đồng đều (tắt công tắc) — các dấu chân được đặt cách nhau bằng Interval đều theo độ dài cung và thời gian là khoảng cách / 10 m/s. Chuyển động là tốc độ không đổi. Thay đổi Interval chỉ thay đổi số lượng đỉnh được ghi (mật độ lấy mẫu); hình dạng đường và tổng thời gian không thay đổi.
  • Biến thiên (bật công tắc) — mỗi dấu chân được ghim vào một vị trí dọc theo đường đi, và tổng thời gian được chia thành các khoảng thời gian bằng nhau giữa các dấu chân. Nơi các dấu chân dày đặc thì xe chạy chậm; nơi chúng thưa thớt thì xe chạy nhanh. Đây là cách duy nhất để thay đổi tốc độ hiệu quả dọc theo lộ trình.

Thao tác trong trình chỉnh sửa ↔ thay đổi trong .xosc

Phần tiêu đề “Thao tác trong trình chỉnh sửa ↔ thay đổi trong .xosc”
Thao tác trong trình chỉnh sửaTác động lên xuất
Di chuyển điểm điều khiển đường điTọa độ đỉnh quỹ đạo + tổng thời gian (độ dài thay đổi, tốc độ vẫn 10 m/s)
Kéo dấu chân trong chế độ VariableVị trí chuẩn hóa của dấu chân → time của đỉnh → tốc độ cục bộ (hiệu quả) của đoạn đó
Bật/tắt Variable positioningChuyển đổi giữa tính thời gian đều và tính thời gian bằng tốc độ
Thay đổi Interval (chế độ đồng đều)Chỉ số lượng đỉnh — hình dạng và tốc độ quỹ đạo không thay đổi
Thay đổi AnchorChỉ bù vẽ dấu chân — không có tác động lên quỹ đạo xuất
Đổi template xevehicleCategory, mô hình 3D, chiều cao bounding box, cấu hình hiệu năng
Thay đổi kích thước xe (w, h)Kích thước BoundingBox và hình học trục bánh xe
Xoay xeHướng ban đầu (chỉ khi xe không có quỹ đạo)
Di chuyển xeWorldPosition khởi tạo (snap về điểm đầu quỹ đạo nếu có)

Trả lời thẳng câu hỏi thường gặp: đúng — kéo dấu chân đến vị trí khác trên đường đi trong chế độ Variable sẽ thay đổi kế hoạch tốc độ xuất, vì nó tính lại thời gian đoạn đó. Kéo trong chế độ Uniform, hay thay đổi Anchor, thì không.

Để minh bạch về phạm vi, những giá trị này đến từ bản đồ hoặc hằng số cố định, không phải từ bất kỳ thứ gì bạn có thể chỉnh sửa: danh mục/cấu hình hiệu năng xe, đường dẫn mô hình 3D, chiều cao xe theo danh mục, hình học trục bánh xe (suy ra từ kích thước), chế độ theo dõi (position), trigger dừng 60 giây, và — quan trọng nhất — tốc độ quỹ đạo 10 m/s.

Bộ xuất được tích hợp trong @drawtonomy/sdk và chạy mà không cần trình chỉnh sửa. Không giống như menu, SDK còn cho phép xuất riêng từng file:

import { exporter, createSnapshot } from '@drawtonomy/sdk'
const snapshot = createSnapshot(shapes)
// Đóng gói (giống menu):
const { blob, baseName } = exporter.buildEsminiZip(snapshot, {
baseName: 'my-scene',
})
// Hoặc từng định dạng riêng lẻ:
const xodr = exporter.exportToOpenDrive(snapshot)
const xosc = exporter.exportToOpenScenario(snapshot, {
xodrFilename: 'my-scene.xodr',
})

Để xem toàn bộ API và các điểm mở rộng, xem tham khảo Exporter SDK.

Định dạngPhiên bản
OpenDRIVE1.8
OpenSCENARIO1.3

Được hỗ trợ: đường thẳng từ làn đường; tín hiệu, vạch qua đường và mảng giao lộ dưới dạng object OpenDRIVE; một xe mỗi đường đi theo quỹ đạo có thời gian; file zip esmini hoạt động được ngay.

Chưa hỗ trợ: junction OpenDRIVE, hình học cong, đường nhiều làn, độ cao đường; hành động tốc độ OpenSCENARIO, đổi làn, logic đèn giao thông, tương tác nhiều tác nhân, hay bất kỳ điều khiển tốc độ nào theo từng xe.