World Builder 파일 포맷¶
Custom World Builder의 출력물은 두 가지이고, DeepRacer 트랙에서는 waypoints 파일도 받을 수 있습니다.
| 출력 | 결과물 | 용도 |
|---|---|---|
| Publish | 월드 CDN에 올라간 트랙 파일(worlds/models/meshes)과 월드 ID | 월드 ID로 시뮬레이터에 설치, DeepRacer 훈련, 빌더에서 리믹스 |
고해상도 탑다운 .jpg |
실물 바닥 트랙 인쇄 |
파일을 내려받아 올리는 단계는 없습니다: Publish가 트랙을 32자리 16진수 월드 ID로
업로드하고, 시뮬레이터는 CDN에서 바로 설치합니다 (App의 월드 모달 또는
POST /sim/api/worlds/install, 둘 다 월드 ID 기반). 배포된 월드는 불변입니다 —
Publish 할 때마다 새 월드 ID가 생성되고(한 프로젝트에서 여러 월드 배포 가능),
배포 후에는 Published 탭에서 접근 권한(과 이름)만 바꿀 수 있습니다.
평가 (Evaluation)¶
월드에는 선택적으로 평가를 실을 수 있습니다 (빌더 우측 패널의 Evaluation 섹션에서 활성화): 학생 주행을 채점하는 config + JavaScript 스크립트가 월드 번들에 두 파일로 동봉됩니다 (routes/처럼 월드명이 경로에 구워져 시뮬레이터의 일반 설치 루프가 그대로 배치합니다):
evaluations/custom_<월드ID>.json— config 문서 (사람이 읽는 파일):
{ "version": 1,
"config": { "description": "...", "better": "lower" | "higher",
"time_limit_s": 180, "robot": "physicar",
"run_command": "cd /home/physicar/physicar_ws/ && python3 -u run.py" } }
evaluations/custom_<월드ID>.js— 채점 스크립트 본문(initialize/evaluate), 진짜 JS 파일이라 DEV 모드에서 그대로 편집합니다.text/plain으로 서빙되어<script>태그로는 실행 불가 — 러너가 텍스트로 받아 샌드박스 Worker에서 실행합니다.
시뮬레이터에서 평가가 있는 월드는 ▶ 버튼이 나타납니다 (sim의 로봇 세대가
config.robot과 일치할 때만). 누르면 차량을 출발선 뒤에 배치하고 initialize 실행 →
학생 코드 실행(run_command, 시작 시 수정 가능) → 매 관측마다 evaluate(sim) 호출 —
sim.finish() 또는 sim 시간 기준 제한시간 초과(실격)로 종료됩니다. 스크립트가 보는
계약: 관측 sim.state(time·pose·objects·lights·run·audio) + 정적
sim.config/sim.track/sim.origins, 개입 sim.teleport/sim.moveObject/
sim.setLight/sim.overlay, 판정 sim.result(v)/sim.finish(v?). 판정 로직(선분
통과·이탈·충돌)은 스크립트 안에서 직접 구현합니다 — 기본 템플릿이 +5초 페널티
포함 완주 기록 평가의 완성본입니다.
트랙 호환성¶
배포된 트랙 파일은 physicar-sim과 DeepRacer 훈련 컨테이너(더 오래된 ROS/Gazebo 사용) 양쪽에서 로드됩니다 — 둘 다 호환되도록 내보내집니다.
오브젝트 (Objects)¶
빌더에서 배치한 3D 오브젝트는 .world 파일의 인라인 모델로 내보내집니다.
모델 이름 = 에디터에서 지정한 이름(속성 카드에서 변경 가능, 기본값 box1,
cylinder2, signal1 식, 중복 불가, A-Za-z0-9_)이고, 오브젝트 종류는 SDF
link 이름 마커로 표시되어 도구들이 모델명에 의존하지 않습니다:
| 오브젝트 타입 | link 마커 | 비고 |
|---|---|---|
Box (box) |
object |
박스 collision + 면별 텍스처(선택). 기본 PhysiCar 스킨을 쓰는 박스는 새 메시를 동봉하지 않고 내장 physicar_box_obstacle 메시(physicar-sim·DeepRacer에 이미 존재)를 참조합니다 — 커스터마이즈한 박스만 자체 COLLADA+텍스처를 동봉합니다. |
Cylinder / Sphere (cylinder, sphere) |
object |
SDF 프리미티브 collision + visual, 전개도 텍스처(side/top/bottom, surface) 선택. 원기둥 기본값은 A4 비율(높이 21cm, 둘레 29.7cm) — 옆면 텍스처를 인쇄해 말면 실물이 됩니다. 구는 기본이 내장 축구공 스킨(공용 physicar_ball 메시 참조, 기본 지름 22cm)입니다. |
Traffic Cone (cone) |
object |
정사각 받침판 + 위가 잘린 원뿔, 실물 라바콘 비율(기본 받침 13.5cm·높이 23cm). 텍스처는 경사 옆면 랩 전용이고 받침과 절단면은 색상을 씁니다. 기본 외형은 내장 physicar_cone 메시 참조(주황+흰 띠), 커스터마이즈하면 자체 COLLADA를 동봉합니다. Gazebo Classic엔 cone 프리미티브가 없어 collision은 외접 박스이며, <collision name="cone"> 마커로 종류를 알립니다(objects 파라미터의 type: "cone"). |
Traffic Light (light) |
light |
파라메트릭 기기 스탠드(SDF 프리미티브) — 가로와 뒤 기울기를 조정하면 세로·화면·램프가 16:9 비율(폰과 태블릿의 중간)로 닮음꼴 비례합니다(기본 18×32cm·15°). 익스포트된 모델의 lamp_red/lamp_green visual과 screen visual(pose+size)이 계약: physicar-sim이 런타임에 램프 색을 바꿔 빨강/초록을 표시하고, 노랑 경유 3초 동안은 화면 앞 중앙에 밝은 노란 원을 겹칩니다 — Remote Traffic Light 앱과 동일한 문법입니다. DeepRacer에서는 여느 물체처럼 crash 판정에 참여합니다(type: "light"). 구 월드의 legacy signal 마커도 계속 인식됩니다. |
| 둘레 펜스 | wall (모델 wall_0..3) |
자동 생성 collision 마커 — 펜스에 부딪히면 DeepRacer 에피소드가 crash로 종료됩니다. 펜스 시각(racetrack 모델의 일부)은 사용자 지정 단색입니다(Objects 목록의 Wall 행). |
DeepRacer 학습에서 마커가 있는 모든 오브젝트는 충돌(crash) 판정에 참여하며, 보상
함수에 objects 파라미터 — {"name", "x", "y", "z", "heading", "size": [sx, sy, sz],
"type"} 딕셔너리 리스트, 에디터 Objects 목록과 같은 순서(0 = 맨 아래) — 로
전달됩니다(월드 파일 기준 고정 위치). DeepRacer 표준 objects_location 계열(동적
스폰 장애물·봇카 전용)과는 별개입니다.
바닥(Field) — 1m 타일 바닥면은 빌트인 프리셋(카펫/잔디) 또는 사용자
업로드 이미지 중에서 선택합니다(Decals 목록의 Field 행). 프리셋 필드와 표준 트랙
텍스처(도로·경계선·시작선)는 익스포트에 동봉되지 않고 physicar-sim과 DeepRacer에
이미 설치된 공용 meshes/world_builder/textures/ 폴더를 참조합니다. 커스텀 업로드
필드만 트랙에 동봉됩니다(textures/field.png).
바닥 그래픽(데칼)은 모델로 내보내지 않고 레이어 순서대로 트랙 시각 메시에 베이크됩니다.
Waypoints (.npy)¶
각 공식/커스텀 트랙은 Waypoints 다운로드를 제공합니다 — (N, 6) NumPy 배열로, 트랙을
따라 놓인 점마다 한 행입니다:
보상 함수의 waypoints 파라미터는 0, 1번 열(중앙선)을 사용합니다. 트랙 모양 분석이나
보상 함수 설계를 위해 받으세요.
관련
월드 만들기 → World Builder 튜토리얼. 보상에서 waypoints 사용 → Racing Deep Learning.