시뮬레이터¶
Gazebo Jetty 기반 시뮬레이션 환경입니다. 그 안의 로봇은
PhysiCar ROS 스택을 그대로 실행하고, 그 위에 시뮬레이터 자체의
HTTP API가 /sim/api/ 경로로 월드·차량·평가 제어를 제공합니다.
SIM 전용 — 실물 로봇에는 /sim/api가 없습니다.
PhysiCar 패널의 Tutorials → Robot APIs 화면에서 이 페이지의 모든 인터페이스를 바로 실행해 볼 수 있습니다 — 카드마다 실행 버튼과 복사 가능한 명령이 있습니다.
상태·시간¶
| 메서드 | 경로 | 설명 |
|---|---|---|
GET |
/sim/api/status |
시뮬레이터 런타임 상태 |
GET |
/sim/api/clock |
시뮬레이션 시간 / 실제 시간 / RTF / 일시정지 여부 |
차량¶
| 메서드 | 경로 | 설명 |
|---|---|---|
GET |
/sim/api/pose |
차량 포즈(월드 절대 좌표) |
POST |
/sim/api/pose |
차량 텔레포트 — {"x": 1.0, "y": 2.0, "yaw": 0.0}, 생략한 필드는 현재 값 유지. 포즈가 지면 위에 똑바로 선 자세로 정규화되므로 뒤집힌 차를 일으켜 세우는 데도 쓰입니다. 포즈 적용이 확인된 뒤 응답이 돌아옵니다 |
텔레포트와 오도메트리
오도메트리(라이다 + IMU)는 텔레포트를 감지하지 못해 이후 /odom에 오프셋이 남을
수 있습니다. 깨끗한 오도메트리 상태가 필요하면 POST /sim/api/respawn을 쓰세요 —
오도메트리 스택까지 재시작됩니다.
월드·물체¶
| 메서드 | 경로 | 설명 |
|---|---|---|
GET |
/sim/api/world |
현재 월드 정의를 한 번에: 식별 정보(world_id/rev/표시 이름), 트랙 지오메트리, 물체 카탈로그, 평가 유무 |
GET |
/sim/api/route |
트랙 중앙선 웨이포인트 + 있으면 안쪽/바깥쪽 경계선 |
GET |
/sim/api/bounds |
트랙 경계(바운딩 박스) |
GET |
/sim/api/objects |
월드 모델 목록(이름, type: object/wall/light, static, movable, 원점/현재 포즈, 크기) |
POST |
/sim/api/models/<name>/pose |
월드 물체 이동/회전 — {"x", "y", "z", "yaw"}, 생략한 필드는 현재 값 유지, 회전은 yaw만. World Builder 물체와 신호등에 동작하고 벽·트랙 자체는 거부됩니다 |
신호등¶
| 메서드 | 경로 | 설명 |
|---|---|---|
GET |
/sim/api/traffic_lights |
월드의 신호등 목록과 상태. 기본 상태는 green, 같은 월드의 respawn 후에도 상태가 유지됩니다 |
POST |
/sim/api/traffic_lights/<name> |
{"state": "red"} 또는 {"state": "green"} — green→red는 3초의 황색을 거치며, 그동안의 명령은 409로 거부됩니다 |
신호등은 월드 자체에서 옵니다(Custom World Builder에서 배치) — 런타임 배치 API는 없습니다.
리셋¶
| 메서드 | 경로 | 설명 |
|---|---|---|
POST |
/sim/api/reset |
모든 movable 물체·신호등·차량을 시작 포즈로 — 즉시, 포즈만, 월드 리로드 없음. 학습 에피소드 사이의 기본 리셋 |
POST |
/sim/api/respawn |
월드 전체 리로드(~6초) — 월드가 이상해졌을 때 쓰는 무거운 리셋 |
화면¶
| 메서드 | 경로 | 설명 |
|---|---|---|
GET / POST |
/sim/api/brightness |
장면 밝기 — {"value": 0.2..2.0}, 1.0 = 기본. 디스플레이 레이어에서 즉시 적용: 3D 뷰어와 로봇 카메라 프레임이 같은 비율로 어두워지고 밝아집니다. 서버 공유값 하나(모든 뷰어 동기화)로, 월드 전환·재시작 후에도 유지됩니다 |
GET / POST |
/sim/api/overlay |
/sim 화면의 상태 텍스트 — {"text": "...", "ttl": 10, "size": 1}, 텍스트 ≤300자, ttl 1–3600초, size = 글자 크기 배수 0.5–4; 스스로 사라집니다(예: 학습 진행률) |
모니터링¶
| 메서드 | 경로 | 설명 |
|---|---|---|
GET |
/sim/api/state |
실시간으로 변하는 모든 것을 한 번에: 월드/실행/전환 상태, 시뮬레이션 time/paused/rtf, 차량 포즈, 물체 포즈, 신호등, 오버레이, 밝기, 평가 실행 상태 |
GET |
/sim/api/events |
이름 있는 이벤트의 SSE 스트림 — event: state(변경 시 푸시되는 전체 상태 스냅샷), event: run(평가 중 학생 프로세스 출력), event: evaluation(평가 세션: start·phase·record·script 로그 한 줄·결과가 담긴 end). addEventListener로 구독하고 모르는 이벤트 이름은 무시하세요 |
평가¶
| 메서드 | 경로 | 설명 |
|---|---|---|
GET |
/sim/api/evaluation |
현재 월드의 평가 문서({version, config, script}, World Builder에서 발행) — 월드에 평가가 없으면 404 |
POST |
/sim/api/evaluation/start |
평가 세션 시작 — {"command"?, "time_limit_s"?}: command는 학생 코드 실행 명령(생략하면 아무것도 실행하지 않고 관찰만; 세션이 끝나면 그 프로세스는 죽입니다), time_limit_s 기본값은 월드의 평가 config. 시뮬레이터가 스크립트를 실행하고 학생 코드를 띄우며, 출력은 event: run, 진행 상황은 event: evaluation으로 /sim/api/events에 스트리밍됩니다. {ok, session} 반환; 값이 잘못되면 400, 월드에 평가가 없으면 404, 월드가 준비되지 않았거나 세션이 진행 중이거나 학생 코드가 이미 실행 중이면 409 |
POST |
/sim/api/evaluation/stop |
진행 중인 세션(결과 stopped)과 학생 프로세스 종료 — 멱등, 누구나 정지 가능 |
GET |
/sim/api/evaluation/session |
진행 중인 세션({active, session} — 단계, 현재 기록, 최근 로그 줄) — 실행 도중 열린 페이지용 |
GET |
/sim/api/evaluation/record |
마지막 세션의 저장된 기록(특정 세션은 ?session=<id>): outcome(finished/timeout/script_error/stopped/unsupported), record, reason, 이벤트 로그 — 없으면 404 |
보통은 /sim 페이지의 ⚑ 버튼으로 실행합니다 — 시뮬레이터당 세션 하나를 모든 뷰어가 함께 봅니다.
월드 관리¶
| 메서드 | 경로 | 설명 |
|---|---|---|
GET |
/sim/api/worlds |
월드 목록(현재 월드 포함): name, file, display(발행 이름, 공식 월드는 표시 이름), world_id(32자리 hex 발행 ID, 빌트인은 null), official, evaluation, deletable |
POST |
/sim/api/switch |
월드 전환 — {"world": "<name>.world"} 또는 {"world_id": "<32자리 hex ID>"}; ID 방식은 설치된 발행 월드를 찾아가고 미설치면 404. 월드 전체 로드라 수 초 걸립니다 |
GET |
/sim/api/worldpub |
현재 월드의 발행 좌표(설치된 발행 월드의 world_id/rev)와 공식 에셋 CDN 리비전·CDN 베이스 URL |
POST |
/sim/api/worlds/install |
발행 월드를 worlds CDN에서 설치 — {"world_id": "<32자리 hex ID>"}. 서버 측 다운로드로 custom_*으로 설치되고, 같은 rev가 이미 설치되어 있으면 다운로드 없이 "cached": true를 반환합니다 |
/sim 뷰어도 같은 일을 합니다
웹 뷰어는 직접 조작을 지원합니다: 물체를 클릭해 선택, 드래그로 이동, 파란 점 핸들 드래그로 회전. 신호등을 클릭하면 RED/GREEN 패널이 열립니다. 차량도 같은 방법으로 옮길 수 있습니다. 전부 위의 pose API로 이어집니다.
더 알아보기
- 로봇 자체의 인터페이스 → PhysiCar ROS
- 월드 만들고 발행하기 → Custom World로 나만의 실습 공간 만들기