MQTT_SCHEMA SPOT - zero1ne-26/doc GitHub Wiki
SPOT ์ ์ด MQTT ์คํค๋ง
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ์ ๊ณต๊ฐ | session_id (์ค์ผ์คํธ๋ ์ด์
์๋ฒ์์ ๋ฐ๊ธ) |
| ์์ฑ ์ฃผ์ฒด | SPOT ๊ฐ๋ฐ ๋ด๋น |
| ์ต์ข ์์ ์ผ | 2026-08-30 |
| ์ํ | ์ด์ โ ํ์ ํ์. ์๋๋ฆฌ์ค๋ณ ํ๋ฆยท์ ์ฑ ์ sequence ํ์ด์ง, ํฉ์ยท๋ฏธํฉ์ ์ฌํญ์ 8์ |
0. ์ด ๋ฌธ์์ ๋ฒ์
์ค์ผ์คํธ๋ ์ด์ ์๋ฒ โ SPOT ์ฌ์ด์์ ์ค๊ฐ๋ ๊ฒ๋ง ์ ์ต๋๋ค.
์๋ฒ๊ฐ ์ ํ๋ ๊ฒ ๋ฌด์์ ํ ๊ฒ์ธ๊ฐ "p2 ๋ก ๊ฐ๋ผ" "์๋ด ์๋๋ฆฌ์ค๋ฅผ ์คํํ๋ผ"
SPOT ์ด ์ ํ๋ ๊ฒ ์ด๋ป๊ฒ ํ ๊ฒ์ธ๊ฐ ์ด๋ ๊ฒฝ๋ก๋ก, ๋ช ๋๋ก ๋์์, ์ด๋ค ์์ธ๋ก
์์ธ(pose)ยท๊ฒฝ๋กยท์ ๋ฐ์ ๋ ฌ ๊ฐ์ ๋์ ํ๋ผ๋ฏธํฐ๋ ์ด ๋ฌธ์์ ์์ต๋๋ค. SPOT ๋ด๋ถ์์ ์ฒ๋ฆฌํฉ๋๋ค. ์๋ฒ๊ฐ ๊ทธ ๊ฐ์ ์ ํ์๋, ๋ณด๋ผ ํ์๋ ์์ต๋๋ค.
์ด ์์น์ ์ค์ผ์คํธ๋ ์ด์ ์๋ฒ ๋ด๋น์ ์์ฒญ("ํฌ์ฆ๋ ์ด๋ ๋ก์ง์ ๋ก๋ด์์ ์์ฒด ์ฒ๋ฆฌ")์ ๊ทธ๋๋ก ๋ฐ์ํ ๊ฒ์ ๋๋ค.
1. ํ ํฝ ๋ชฉ๋ก
| ๊ตฌ๋ถ | Topic | ๋ฐฉํฅ | QoS | Retained | ์ค๋ช |
|---|---|---|---|---|---|
| REQUEST | robot/spot-01/command |
OC ์๋ฒ โ SPOT | 1 | โ | ์ ์ด ๋ช ๋ น |
| RESPONSE | robot/spot-01/ack |
SPOT โ ๊ตฌ๋ ์ | 1 | โ | ์ ์ยท์๋ฃ ๋ณด๊ณ |
| ์ํ | robot/spot-01/state |
SPOT โ ๊ตฌ๋ ์ | 1 | โ | 1Hz ์ํ |
| ๋ชฉ์ ์ง | robot/spot-01/waypoints |
SPOT โ ๊ตฌ๋ ์ | 1 | โ | ๊ฐ ์ ์๋ ๊ณณ ๋ชฉ๋ก |
| ์๋๋ฆฌ์ค | robot/spot-01/scenarios |
๊ด๋ฆฌ์UI โ ๊ตฌ๋ ์ | 1 | โ | ์คํ ๊ฐ๋ฅํ ์๋๋ฆฌ์ค ๋ชฉ๋ก (๋ก๋ดํ UI ๊ฐ ๋ฐํ) |
| ์์ | robot/spot-01/estop |
SPOT โ ๊ตฌ๋ ์ | 2 | โ | ๋น์์ ์ง ๋ฐ์ยทํด์ |
| ์งํ | robot/spot-01/plan |
SPOT โ ๊ตฌ๋ ์ | 1 | โ | ์๋๋ฆฌ์ค ์คํ ์งํ์ํฉ |
| ์ฅ์ | robot/spot-01/fault |
SPOT โ ๊ตฌ๋ ์ | 1 | โ | ์ฅ์ ์๋ฆผ (BATTERY_LOW ๋ฑ) |
| ์ธ์ | server/session/start |
OC ์๋ฒ โ SPOT(๊ตฌ๋ ) | 1 | โ | ์ธ์
์์ โ SPOT ์ด home ์ผ๋ก ์ด๋ (ยง3-1) |
| ์ธ์ | server/session/end |
OC ์๋ฒ โ SPOT(๊ตฌ๋ ) | 1 | โ | ์ธ์ ์ข ๋ฃ โ SPOT ์ด ์ถฉ์ ์์น๋ก ๋ณต๊ท (ยง3-1) |
๋ก๋ด ํ ํฝ์ ๋ช ๋ น์ ๋ฐํํ๋ ๊ฒ์ OC ์๋ฒ๋ฟ์ ๋๋ค. ํ๋ธ๋ฆฟยท๊ด๋ฆฌ์ ํ๋ฉดยท๋์ฐฉ ์๋ํ๊ฐ ๊ฐ๊ฐ ์๋ฒ์ ์์ฒญํ๊ณ , ์๋ฒ๊ฐ ๋ก๋ด๋ณ ํ๋ก ์์๋ฅผ ์ ํด ์ด ํ ํฝ์ผ๋ก ๋ ๋๋ค (2026-08-10 ํฉ์, ยง8).
๋ฌด์์ด ์ธ์ ๋ช ๋ น์ ๋ง๋๋์ง๋ ์ด ๋ฌธ์์ ๋ฒ์๊ฐ ์๋๋๋ค. ์๋ฒ๊ฐ ๊ด๋ฆฌํ๋ฉฐ LOCATION_AUTOMATION_DESIGN ์ ์์ต๋๋ค. ๊ทธ ํ๋ฆ์ ์๋ฒ ์ฌ์ ์ผ๋ก ๊ณ์ ๋ฐ๋๋ฏ๋ก(2026-08-22 ์ ๋์ฐฉ ์๋ํ์ ๋๋ฐ์ด์ค ํ๊ฐ ๋ค์ด์๋ค) ์ฌ๊ธฐ ์ฎ๊ฒจ ์ ์ผ๋ฉด ๊ณง ์ด๊ธ๋ฉ๋๋ค. ์ด ๋ฌธ์๋ ๋ก๋ด์ด ๋ฌด์์ ๋ฐ๊ณ ๋ฌด์์ ๋๋ ค์ฃผ๋์ง๋ง ๋ค๋ฃน๋๋ค โ ๊ทธ๊ฑด ์๋ฒ๊ฐ ๋ฐ๋์ด๋ ๊ทธ๋๋ก์ ๋๋ค.
๋ช ๋ น๋ง retained ๋ฅผ ์ฐ์ง ์์ต๋๋ค. ๋ก๋ด์ด ์ฌ์ ์ํ ๋ ๋ธ๋ก์ปค๊ฐ ์ ๋ช ๋ น์ ๋ค์ ๋ฐฐ๋ฌํ๋ฉด ์๋ฌด๋ ์ํค์ง ์์๋๋ฐ ๋ก๋ด์ด ์์ง์ ๋๋ค.
2. ๊ณตํต ํ์ด๋ก๋
๋ชจ๋ ๋ฉ์์ง๋ CloudEvents 1.0 ๋ดํฌ๋ฅผ ์๋๋ค.
{
"specversion": "1.0",
"type": "robot.command", // ๋ฉ์์ง ์ข
๋ฅ
"source": "/services/orchestration-server",
"id": "0d3fโฆ", // ๋ฉ์์ง ๊ณ ์ id (์ค๋ณต ์์ ํ๋ณ์ฉ)
"time": "2026-08-08T04:12:03Z",
"datacontenttype": "application/json",
"subject": "robot/spot-01",
"data": { /* ์๋ ์ ๋ค */ }
}
data ๊ณตํต ํ๋ (REQUEST)
| ํ๋ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
session_id |
string | Y | ์ค์ผ์คํธ๋ ์ด์ ์๋ฒ ๋ฐ๊ธ. SPOT ์ ํด์ํ์ง ์๊ณ ์๋ต์ ๊ทธ๋๋ก ์ค์ด ๋๋๋ ค์ค๋๋ค (ํ์ ์ ์ฝ ์์) |
command_id |
string | Y | ๋ช ๋ น ํ ๊ฑด์ ๊ณ ์ id. ์๋ต ๋งค์นญ ํค |
action |
string | Y | ๋ฌด์์ ํ ๊ฒ์ธ๊ฐ (3์ ) |
params |
object | N | action ๋ณ ํ๋ผ๋ฏธํฐ |
command_id ๊ฐ ์ ํ์ํ๊ฐ โ ๋ช
๋ น์ ๋ณด๋ด๊ณ ๊ฒฐ๊ณผ๊ฐ ํ์ฐธ ๋ค์ ๋ฐ๋ก ์ต๋๋ค.
์ฌ๋ฌ ๋ช
๋ น์ด ๋์์ ๋ ์ ์์ด์, ์ด ๊ฐ์ด ์์ผ๋ฉด ์ด๋ ์๋ต์ด ์ด๋ ๋ช
๋ น์ ๊ฒ์ธ์ง
์ ์ ์์ต๋๋ค.
์ค๋ณต ์ต์ ๋ ๋ดํฌ์ id ๋ก๋ง ํฉ๋๋ค (command_id ๊ฐ ์๋๋๋ค). ์ต๊ทผ 512๊ฑด์
๊ธฐ์ตํ๋ฉฐ, ๋ก๋ด์ด ์ฌ์์ํ๋ฉด ๊ทธ ๊ธฐ์ต์ ์ฌ๋ผ์ง๋๋ค.
โ ๏ธ ๊ทธ๋์ ๊ฐ์
command_id๋ฅผ ์ ๋ดํฌid๋ก ๋ค์ ๋ณด๋ด๋ฉด ๋ก๋ด์ ๋ ์คํํฉ๋๋ค. QoS 1 ์ฌ์ ์ก(๋ธ๋ก์ปค๊ฐ ๊ฐ์ ๋ดํฌ๋ฅผ ๋ค์ ๋ฐฐ๋ฌ)์ ๊ฑธ๋ฌ์ง์ง๋ง, ์๋ฒ๊ฐ ์ง์ ๋ง๋๋ ์ฌ์๋๋ ๊ฑธ๋ฌ์ง์ง ์์ต๋๋ค. ์ฌ์๋ํ ๋๋ ๋ก๋ด์ด ์ ๋ง ๋ชป ๋ฐ์๋์ง (ack๊ฐ ํ๋๋ ์ ์๋์ง) ๋จผ์ ํ์ธํด์ฃผ์ธ์.
3. REQUEST (ํ๋ธ๋ฆฟยทOC โ SPOT)
Topic: robot/spot-01/command
action |
params | ์ค๋ช |
|---|---|---|
navigate_to |
{ "destination": "p2" } |
์ด๋ฆ ๋ถ์ธ ์ง์ ์ผ๋ก ์ด๋ |
run_scenario |
{ "scenario_id": "guide", "variables": {โฆ} } |
์๋๋ฆฌ์ค ์คํ (์๋) |
follow |
{ "mode": "start" | "stop" } |
์ฌ๋ ์ถ์ข ์์ยท์ ์ง |
return_home |
{} |
์ถฉ์ ์์น๋ก ๋ณต๊ท ํ ์ฐฉ์, ๋ชจํฐ ์ ์ ๋ด๋ฆผ โ ๋ค์ ์ด๋ ๋ช ๋ น์์ ์๋์ผ๋ก ๋ค์ ์ผ์ง (2026-10-04) |
stop |
{} |
์ฆ์ ์ ์ง. ์ด๋ค ์ํ์์๋ ์์ฉ |
stand |
{} |
์ผ์ด์๊ธฐ โ ๋ชจํฐ๋ ํจ๊ป ์ผ์ง (2026-09-06 ๊ณ์ฝ ์น๊ฒฉ) |
sit |
{} |
์๊ธฐ (2026-09-06 ๊ณ์ฝ ์น๊ฒฉ) |
power_off |
{} |
์ํ๊ณ ๋ชจํฐ ์ ์ ๋ด๋ฆผ โ ๋ค์ ์์ง์ด๋ ค๋ฉด stand (2026-09-06 ์ ๊ท) |
warm_up |
{ "rotate": false, "take_lease": true } |
์ค๋น ์ ๊ฒยท๋ณต๊ตฌ. ์ฐ๊ฒฐยท์๊ฐ๋๊ธฐยทE-Stopยท์ ์ด๊ถยท๋งตยท์์น์ถ์ ์ ํ ๋ฒ์ ํ์ธํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ค. ๊ธฐ๋ณธ์ ๋ก๋ด์ด ์์ง์ด์ง ์์ (์๋) (2026-09-29 ์ ๊ท) |
๐จ
stop์ ์๋ฒ ํ๋ฅผ ์ฐํํด ์ฆ์ ๋ฐํํด์ฃผ์ธ์. ๋ก๋ด์ ์คํ ์ค์๋stop๋ง์BUSY๋ก ๊ฑฐ์ ํ์ง ์์ง๋ง, ๊ทธ๊ฑด ๋ช ๋ น์ด ๋์ฐฉํ์ ๋์ ์ด์ผ๊ธฐ์ ๋๋ค. ์ ๋ช ๋ น์ ์ข ๊ฒฐack๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ํ์stop์ด ๋ค์ด๊ฐ๋ฉด ์ฃผํ์ด ๋๋ ๋๊น์ง ์ ์ง๊ฐ ๋๊ฐ์ง ์์ต๋๋ค โ ์์ ๊ฒฝ๋ก๊ฐ ์กฐ์ฉํ ๋ฌด๋ ฅํ๋ฉ๋๋ค.
์ 9๊ฐ๊ฐ ๊ณ์ฝ์ ์ ๋ถ์ ๋๋ค. (2026-09-06:
standยทsit์ด ๊ด๋ฆฌ์ ์ ์ฉ์์ ๊ณ์ฝ์ผ๋ก ์น๊ฒฉ๋๊ณpower_off๊ฐ ์ ์ค๋์ต๋๋ค. 2026-09-29:warm_up์ด ์ ์ค๋์ต๋๋ค.) ๋ก๋ด์ ์ด ๋ฐ์๋relocalizeยทposeยทexecute_planยทalign_tagยทtake_control/release_control์ ๋ฐ์ง๋ง ๊ด๋ฆฌ์ UI ์ ์ฉ์ด๋ผ ๊ณ์ฝ์ด ์๋๋๋ค. ์๊ณ ์์ด ๋ฐ๋๋ฏ๋ก ์๋ฒ๋ ์ฐ์ง ๋ง์ธ์.
์์
{
"session_id": "01HW9X8M2K",
"command_id": "cmd-0042",
"action": "navigate_to",
"params": { "destination": "p2" }
}
destination ๊ฐ
robot/spot-01/waypoints (5์ )์ ์ค๋ ค ์ค๋ label ์ค
ํ๋์
๋๋ค. ์๋ ์์ฑ๋ ๊ฒฝ์ ์ง๋ ๋ชฉ์ ์ง๊ฐ ๋ ์ ์์ต๋๋ค โ ๊ทธ๊ฑด ๊ธธ์ด์ง ์ฅ์๊ฐ
์๋๋๋ค. ๋ชฉ๋ก์ ์๋ ๊ฐ์ ๋ณด๋ด๋ฉด REJECTED ๋ก ๊ฑฐ๋ถํ๊ณ , fault_detail.code ์
์ด์ ๋ฅผ, fault_detail.message ์ ๊ฐ ์ ์๋ ๊ณณ ์ด๋ฆ๋ค์ ์ ์ด ๋๋ ค์ค๋๋ค.
โ ๏ธ ๊ทธ ๋ชฉ๋ก์ ์ฌ๋์ด ์ฝ๋ ๋ฌธ์ฅ ์์ ๋ค์ด ์์ต๋๋ค (
"'x' is not in the map. known: origin, p2, p3"). ๋ฐฐ์ด ํ๋๊ฐ ์๋๋ฏ๋ก ํ์ฑํ์ง ๋ง์ธ์ โ ๋ชฉ๋ก์ด ํ์ํ๋ฉดwaypointsํ ํฝ์ ์ฝ์ด์ฃผ์ธ์.
โ ๏ธ ๊ฐ์
label์ด ๋ ๊ฐ ์ด์์ด๋ฉด ๊ทธ ์ด๋ฆ์ ๋ชฉ์ ์ง๋ก ์ธ ์ ์์ต๋๋ค. ์ด๋ ์ชฝ์ธ์ง ์ ํ ์ ์์ดAMBIGUOUS_WAYPOINT๋ก ๊ฑฐ๋ถํฉ๋๋ค. ๋ง์์ด ํ๋๋ฅผ ๊ณ ๋ฅด๋ฉด ์๋ฑํ ๊ณณ์ผ๋ก ๊ฐ๋๋ค โ ํ์ฅ ๋งต์p3๋ ๊ฐ๊ฐ 2.7m ๋จ์ด์ ธ ์์์ต๋๋ค. ๋ชฉ๋ก์ ๊ฐ์ ์ด๋ฆ์ด ๋ ๋ณด์ด๋ฉด ๋ฒํผ์ ๋ง๋ค์ง ๋ง์ธ์.
์ค๊ฐ ๊ฒฝ์ ์ง๋ SPOT ์ด ์์์ ์ง๋๊ฐ๋๋ค. ์๋ฒ๋ ์ต์ข ๋ชฉ์ ์ง๋ง ์ง์ ํฉ๋๋ค.
variables ๊ฐ
scenarios ํ ํฝ(5์ )์ variables ๋ ํค๊ฐ ๋ณ์๋ช
, ๊ฐ์ด
๊ธฐ๋ณธ๊ฐ์
๋๋ค. ์๋ฒ๊ฐ ๋ณด๋ด๋ variables ๋ ๊ทธ ๊ธฐ๋ณธ๊ฐ์ ๋ฎ์ด์๋๋ค.
- ์๋ตํด๋ ๋ฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์คํ๋๋ฉฐ
BAD_PARAM์ด ๋์ง ์์ต๋๋ค - ์ผ๋ถ๋ง ๋ณด๋ด๋ ๋ฉ๋๋ค. ๋ณด๋ธ ํค๋ง ๋ฎ์ด์๋๋ค
- ๋ชฉ์ ์ง๋ฅผ ๋ปํ๋ ๋ณ์์ ๊ฐ์
waypoints์label์ด์ด์ผ ํฉ๋๋ค โ ๊ทธ ์ธ์๋ ์คํ ์ด ์คํ๋ ๋REJECTED(UNKNOWN_WAYPOINT)๋ก ์คํจํฉ๋๋ค
scenarios์unsupported_steps๊ฐ ๋น์ด ์์ง ์์ผ๋ฉด ๊ทธ ์๋๋ฆฌ์ค๋ ์์ง ๋ชป ํ๋ ๋์์ ํฌํจํฉ๋๋ค. ์คํํ๋ฉด ๊ทธ ์คํ ์์ ๋ฉ์ถฅ๋๋ค.
warm_up โ ์ค๋น ์ ๊ฒ
๋ก๋ด ๋ด๋น์๊ฐ ์์ด๋ "์ง๊ธ ์๋๋ฆฌ์ค๋ฅผ ๋๋ ค๋ ๋๋๊ฐ" ๋ฅผ ํ์ธํ๊ณ , ์ ๋๋ฉด ๋ฌด์์ ํด์ผ ํ๋์ง ๋ฐ๋ ๋ช ๋ น์ ๋๋ค. ๊ด๋ฆฌ์ ํ์ด์ง์ ๋ฒํผ ํ๋๋ก ์ฐ๋ ๊ฒ์ ์ ์ ๋ก ํฉ๋๋ค.
์ธ์ ๋๋ฅด๋ โ ์ ์ ์์ ์ , SPOT ์ ์์ ์ผ ๋ค, ๋ช ๋ น์ด ์ ๋จน์ ๋.
| param | ํ์ | ๊ธฐ๋ณธ | ์ค๋ช |
|---|---|---|---|
rotate |
bool | false |
true ๋ฉด ํ๊ทธ๊ฐ ์ ๋ณด์ผ ๋ ์ผ์ด์์ ์ ์๋ฆฌ ํ์ ํ๋ฉฐ ์์น๋ฅผ ์ฐพ์ต๋๋ค. ๋ก๋ด์ด ์์ง์ด๋ฏ๋ก ์์ ์ฌ๋์ด ์์ ๋๋ง. false ๋ฉด ๋ก๋ด์ ์์ง์ด์ง ์์ต๋๋ค |
take_lease |
bool | true |
์ ์ด๊ถ์ด ์์ผ๋ฉด ๊ฐ์ ธ์ต๋๋ค. false ๋ฉด ๊ฐ์ ธ์ค์ง ์๊ณ ๋๊ฐ ์ฅ๊ณ ์๋์ง๋ง ์๋ ค์ค๋๋ค |
๋ ๋ค ์๋ตํ ์ ์์ต๋๋ค ("params": {}).
ํ๋ ์ผ (์์๋๋ก, ๊ธฐ๋ณธ์ ์ ๋ถ ๋ฌด๋ชจ์ )
| ์์ | ํญ๋ชฉ | ๋ด์ฉ |
|---|---|---|
| 1 | ์ฐ๊ฒฐยท์๊ฐ๋๊ธฐ | ๋ก๋ด์ด ์ ๋ฟ์ผ๋ฉด ๋ค์ ์ ์ํ๊ณ , ์๊ฐ ๋๊ธฐ๋ ์ ์๋ต์ ๋ฐ์ ๋๊น์ง ํ์ธ |
| 2 | E-Stop | ๋ฑ๋ก ์๋ (๋ชจํฐ๊ฐ ๊บผ์ ธ ์์ ๋๋ง ๋ฉ๋๋ค) |
| 3 | ์ ์ด๊ถ | ์์ผ๋ฉด ๊ฐ์ ธ์ด (take_lease) |
| 4 | ๋งต | ๋ก๋ด ์์ ๋งต์ด ๋น์ด ์์ผ๋ฉด ๋ค์ ์ฌ๋ฆผ (SPOT ์ฌ๋ถํ ์ ๋น์์ง๋๋ค) |
| 5 | ์์น์ถ์ | ํ๊ทธ๊ฐ ๋ณด์ด๋ฉด ์์ง์ด์ง ์๊ณ ์ก์. ์ ๋ณด์ด๋ฉด rotate: true ์ผ ๋๋ง ํ์ ํ์ |
| 6 | ๊ฒฐ๊ณผ ๋ณด๊ณ | ์ค๋น ์ฌ๋ถ์ ๋งํ ์ด์ , ๋ค์์ ํ ์ผ |
์๋ต โ ๋ค๋ฅธ ๋ช ๋ น์ฒ๋ผ 2๋ฒ ์ต๋๋ค. ๋ณดํต 2~5์ด ์์ ์๋ฃ ์๋ต์ด ์ต๋๋ค.
์๋ฃ status |
๋ป | ๊ด๋ฆฌ์ ํ์ด์ง๊ฐ ํ ์ผ |
|---|---|---|
SUCCESS |
์ค๋น ์๋ฃ. ์๋๋ฆฌ์ค๋ฅผ ๋๋ ค๋ ๋ฉ๋๋ค | "์ค๋น ์๋ฃ" ํ์ |
FAULT_HW + fault_detail.code = "NOT_READY" |
๋ฏธ์ค๋น. ๋ก๋ด ๊ณ ์ฅ์ด ์๋๋ผ ์กฐ์น๊ฐ ํ์ํ ์ํ | fault_detail.message ๋ฅผ ๊ทธ๋๋ก ํ๋ฉด์ ๋ณด์ฌ์ฃผ์ธ์ |
warm_up์ ์คํ ์ค์ธ ๋ค๋ฅธwarm_up์ด ์์ผ๋ฉดBUSY๋ฅผ ๋๋ ค์ค๋๋ค. ์ถฉ์ ์ค์๋ ๋ณด๋ผ ์ ์์ต๋๋ค โ ์ ๊ฒ๋ง ํ๊ณ ๋ก๋ด์ ์ผ์ผํค์ง ์์ต๋๋ค.
๋ฏธ์ค๋น์ผ ๋์ ์ค์ ์๋ต (์ถฉ์ ์ผ์ด๋ธ์ด ๊ฝํ ์ํ, 2026-09-29 ํ์ฅ):
{
"command_id": "cmd-c902af65",
"status": "FAULT_HW",
"fault_detail": {
"code": "NOT_READY",
"message": "์ถฉ์ ์ผ์ด๋ธ์ ๋ฝ์ผ์ธ์",
"report": {
"connection": "online",
"timesync": "ready(fresh)",
"estop": "registered",
"lease": "owned",
"map": "present (40 waypoints)",
"localization": "ok",
"commands_accepted": false,
"block_reasons": ["CHARGING"],
"localized": true,
"is_lost": false,
"battery_pct": 89,
"charging_state": "CHARGING",
"ready": false,
"next": "์ถฉ์ ์ผ์ด๋ธ์ ๋ฝ์ผ์ธ์"
}
}
}
fault_detail.message ๋ ์ฌ๋์ด ์ฝ๋ ์กฐ์น ์๋ด์
๋๋ค. ์ฌ๋ฌ ๊ฐ๋ฉด / ๋ก ์ด์ด์ง๋๋ค.
๋งํ ์ด์ (report.block_reasons) |
message ์ |
|---|---|
CHARGING |
์ถฉ์ ์ผ์ด๋ธ์ ๋ฝ์ผ์ธ์ |
ESTOP_HARDWARE |
๋ก๋ด ๋ท๋ฉด์ ๋นจ๊ฐ MOTOR LOCKOUT ๋ฒํผ์ ํ์ธํ์ธ์ |
ESTOP_NOT_REGISTERED |
๋ก๋ด์ ์ํ ๋ชจํฐ๋ฅผ ๋ ๋ค 20์ด ๊ธฐ๋ค๋ ธ๋ค ๋ค์ |
FAULT_LEASE |
์ ์ด๊ถ์ด ์์ต๋๋ค โ ๋ค์ ๋๋ฅด๊ฑฐ๋ ํ๋ธ๋ฆฟ ์กฐ์ข ์ ๋๋ด์ธ์ |
BATTERY_LOW |
๋ฐฐํฐ๋ฆฌ ๋ถ์กฑ โ ์ถฉ์ ํ์ธ์ |
TIME_SYNC_NOT_READY |
์๊ฐ ๋๊ธฐ ๋๊ธฐ ์ค โ 10์ด ๋ค ๋ค์ |
| (์์น์ถ์ ์ ๋จ) | ํ๊ทธ๊ฐ ๋ณด์ด๊ฒ ํ๊ฑฐ๋ rotate: true ๋ก ๋ค์ |
| (๋ก๋ด์ด ์ ๋ฟ์) | ๋ก๋ด ์ ์ยท์ ์ ์ผ์ด๋ธ์ ํ์ธํ์ธ์ |
โ ๏ธ
message๋ฌธ๊ตฌ๋ ๋ฐ๋ ์ ์์ต๋๋ค. ํ์ฑํ์ง ๋ง๊ณ ๊ทธ๋๋ก ๋ณด์ฌ์ฃผ์ธ์. ํ๋ก๊ทธ๋จ์ผ๋ก ํ๋จํ๋ ค๋ฉดreport.ready์report.block_reasons๋ฅผ ์ฐ์ธ์.
โน๏ธ
warm_up์ ๋๋ฅด์ง ์์๋ SPOT ์ ์ ์์ด ์ผ์ง๋ฉด ์ฐ๊ฒฐยท๋งตยท์์น์ถ์ ์ ์ค์ค๋ก ๋ณต๊ตฌํฉ๋๋ค(์์ง์ด์ง ์๋ ๊ฒ๋ง).warm_up์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ณ ๋น ์ง ๊ฒ์ ์ฑ์ฐ๋ ์ฉ๋์ ๋๋ค.
3-1. ์ธ์ ํ ํฝ (SPOT ์ด ๊ตฌ๋ )
OC ์๋ฒ๊ฐ Vision ์ ์ธ์
์์ยท์ข
๋ฃ๋ฅผ ์๋ฆฌ๋ ํ ํฝ(ORCHESTRATION_SERVER)์
SPOT ๋ ๊ฐ์ด ๊ตฌ๋
ํด์ ์ค์ค๋ก ์์ง์
๋๋ค. robot/spot-01/command ๋ก ๋ฐ๋ก ๋ช
๋ น์ ๋ณด๋ด์ง ์์๋ ๋ฉ๋๋ค.
| Topic | Payload | SPOT ๋์ |
|---|---|---|
server/session/start |
{ "session_id": "โฆ" } |
ํ๋ ๋์์ ๋ฉ์ถ๊ณ home ์ผ๋ก ์ด๋. ๋์ฐฉ ํ ๊ฐ์ ํํ ํ์ฉ |
server/session/end |
{ "session_id": "โฆ" } |
๊ฐ์ ํํ ์ค๋จ โ ์ถฉ์ ์์น๋ก ๋ณต๊ท โ ์ฐฉ์ โ ๋ชจํฐ ์ ์ ๋ด๋ฆผ |
โ ๏ธ
server/session/end๊ฐ ์ค์ง ์์ผ๋ฉด SPOT ์ ๋ณต๊ทํ์ง ์์ต๋๋ค. ๋ง์ง๋ง ์๋ฆฌ์ ์์ ๊ณ์ ๊ธฐ๋ค๋ฆฌ๊ณ , ์๊ฐ์ด ์ง๋๋ ์ค์ค๋ก ๋์๊ฐ์ง ์์ต๋๋ค (2026-10-04 ์ ์์ฅ: ์ข ๋ฃ ๋ฉ์์ง๊ฐ ์ค์ง ์์ 9๋ถ๊ฐ ๋๊ธฐ, ๊ด๋ฆฌ์ ์ฝ์์return_home์ผ๋ก ์๋ ๋ณต๊ท). ์ธ์ ์ด ๋๋๋ ๋ชจ๋ ๊ฒฝ๋ก(์ฌ์ฉ์ ์ข ๋ฃยทํ์์์ยท๊ด๋ฆฌ์ ๊ฐ์ ์ข ๋ฃยท์ ์ธ์ ์ผ๋ก ๊ต์ฒด)์์ ๋ฐํํด ์ฃผ์ธ์. ๋ฐํ์ด ์ด๋ ค์ด ๊ฒฝ๋ก๊ฐ ์์ผ๋ฉด ๋์return_home๋ช ๋ น์ ๋ณด๋ด๋ฉด ๋ฉ๋๋ค.์๋ฒ ๋ต(2026-10-04, orchestration-server 148): ๋ค ๊ฒฝ๋ก ๋ชจ๋์์ ๋ธ๋ค โ ํ๋ธ๋ฆฟ ์ข ๋ฃ ยท ๊ด๋ฆฌ์ ๊ฐ์ ์ข ๋ฃ ยท ๊ฐ์ ํ๋ธ๋ฆฟ์ ์ ์ธ์ (์ด์ ์ธ์
endโ ์start์) ยท ์ ํด ํ์์์(์ฑ ์ค์ session_idle_timeout_minutes, ๊ธฐ๋ณธ 15๋ถ). 10-04 ์ 9๋ถ ๋๊ธฐ๋ ํ๋ธ๋ฆฟ์ด ์ข ๋ฃ ์์ด ์ธ์ ์ ๋ฒ๋ฆฐ ๊ฒฝ์ฐ๋ก, ๊ทธ๋๋ 24์๊ฐ ๋ค์์ผ DB ๋ง ๋ซํ๋ค. ์ด์ ํ๋์ด 15๋ถ ๋ฉ์ถ๋ฉด ์๋ฒ๊ฐend๋ฅผ ๋ธ๋ค.
์ธ๋ถ ๊ท์น
| ์ํฉ | SPOT ๋์ |
|---|---|
| retained ๋ก ์จ ๋ฉ์์ง | ๋ฌด์. ์ฌ์ ์ ๋ ์ ์ธ์ ์ด ๋์ด์๋์ง ์๊ฒ ํฉ๋๋ค โ retained ๋ก ๋ฐํํ์ง ๋ง์ธ์ |
์ธ์
์ค์ ๋ค๋ฅธ session_id ์ start |
์ ์ธ์
์ผ๋ก ๊ฐ์ํ๋๋ค. ์งํ ์ค์ด๋ ๋ช
๋ น์ ABORTED |
์ง๊ธ ์ธ์
์ด ์๋ session_id ์ end |
๋ฌด์ (๋ฆ๊ฒ ์จ ์ด์ ์ธ์ ์ ์ข ๋ฃ๊ฐ ์ง๊ธ ์๋๋ฅผ ๋์ง ์๊ฒ) |
| ๋ณต๊ท ์ค์ ๊ฐ์ end ๊ฐ ๋ ์ด | ๋ฌด์ (์งํ ์ค์ธ ๋ณต๊ท ์ ์ง) |
| start ์์ ์ ์ถฉ์ ์ผ์ด๋ธ์ด ๊ฝํ ์์ | ๋ฝํ๊ธฐ๋ฅผ ์ต๋ 30์ด ๋๊ธฐ โ ๋ฝํ๋ฉด 3์ด ๋ค ์ถ๋ฐ, ์ ๋ฝํ๋ฉด ๊ทธ ์ธ์ ์ ์ด๋ ์์ด ์ทจ์ |
| end ์์ ์ ์ถฉ์ ์ค | ์ด๋ํ์ง ์์ (์ด๋ฏธ ์ถฉ์ ์์น๋ก ๊ฐ์ฃผ) |
๋ณต๊ท๊ฐ FAULT_NAV ๋ก ์คํจ (์ฌ๋์ ๋งํ ๋ฑ) |
SPOT ์ด 10์ด ๋ค ์ค์ค๋ก ์ฌ์๋, ์ต๋ 3ํ. ๊ทธ ์ฌ์ด ๋ค๋ฅธ ๋ช ๋ นยท์ธ์ ยทSTOP ์ด ์ค๋ฉด ์ฌ์๋ ์ทจ์ |
๊ฒฐ๊ณผ ๋ณด๊ณ
์ธ์
ํ ํฝ์ผ๋ก ์์๋ ์ด๋(ํ ์ด๋ยท์ถฉ์ ๋ณต๊ท)์ ์๋ฃ๋ robot/spot-01/ack ๋ก ๋๊ฐ๋๋ค. OC ๊ฐ ๋ณด๋ธ ๋ช
๋ น์ด
์๋๋ฏ๋ก command_id ๋ SPOT ์ด ๋ง๋ cmd-xxxxxxxx, session_id ๋ null ์
๋๋ค โ OC ์ ๋๊ธฐ
๋ชฉ๋ก๊ณผ ๋งค์นญ๋์ง ์์ผ๋ ๋ฌด์ํ๋ฉด ๋ฉ๋๋ค. ์ ์(ACCEPTED) ack ๋ ์๊ณ ์๋ฃ(SUCCESSยทFAULT_NAVยทABORTED)๋ง ๋๊ฐ๋๋ค.
๊ฐ์ ํํ(cctv/person/emotion ์ง์ ๊ตฌ๋
)์ ์๋ฃ๋ ๊ฐ์ ํ์์ผ๋ก ๋๊ฐ๋๋ค.
๊ฐ์ ๋์์ ๋ช ๋ น์ผ๋ก ๋ณด๋ด๋ ค๋ฉด
robot/spot-01/command ์ action: "session_start"(params.destination ์๋ต ์ home) ยท
"session_end" ๋ฅผ ๋ณด๋ด๋ ๊ฐ์ ์ฒ๋ฆฌ์
๋๋ค. ์ด ๊ฒฝ์ฐ ์ผ๋ฐ ๋ช
๋ น์ฒ๋ผ ์ ์ยท์๋ฃ ack ๊ฐ ์์ฒญ์ command_id ๋ก ๋์๊ฐ๋๋ค.
4. RESPONSE (SPOT โ ๊ตฌ๋ ์)
Topic: robot/spot-01/ack
ํ ๋ช ๋ น์ ์๋ต์ด 2๋ฒ ์ต๋๋ค.
โ ์ ์ ์๋ต ์ฆ์ "๋ฐ์๋ค" ๋๋ "๋ชป ๋ฐ๋๋ค"
โก ์๋ฃ ์๋ต ๋์ค์ "๋ค ํ๋ค" ๋๋ "์ด๋์ ์คํจํ๋ค"
| ํ๋ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
command_id |
string | Y | ์์ฒญ์ ๊ฐ |
session_id |
string | null | Y | ์์ฒญ์ ๊ฐ์ ๊ทธ๋๋ก ๋๋๋ ค์ค๋๋ค. ๋ก๋ด์ด ๊ทธ ๋ช
๋ น์ ๋ชจ๋ฅด๋ฉด null |
robot_id |
string | Y | spot-01 |
status |
string | Y | ์๋ ํ |
timestamp |
string | Y | ๋ฐํ ์๊ฐ (UTC, ISO 8601) |
fsm_state |
string | Y | ๋ณด๊ณ ์์ ์ ๋ก๋ด ์ํ |
posture |
string | Y | stand | sit | unknown |
location |
string | null | Y | ์๋ฃ ์์ ์ ์จ์ดํฌ์ธํธ ์ด๋ฆ. ๋ชจ๋ฅด๋ฉด null |
map_id |
string | null | Y | ๋ก๋๋ ๋งต. ์์ผ๋ฉด null |
fault_detail |
object | null | Y | ์คํจ ์ ์๋ ํ. ์ฑ๊ณต์ด์ด๋ ํค๋ ์ต๋๋ค (๊ฐ์ด null) |
โ ๏ธ โ ์ ์์ โก์๋ฃ๋ ์ค๋ฆฌ๋ ํ๋๊ฐ ๋ค๋ฆ ๋๋ค.
์ค๋ฆฌ๋ ํ๋ โ ์ ์ command_idยทsession_idยทrobot_idยทstatusยทtimestampยทfsm_state6๊ฐ. ๊ฑฐ๋ถ์ผ ๋๋งfault_detail์ด ๋ ๋ถ์ต๋๋คโก ์๋ฃ ์ ํ 10๊ฐ ์ ๋ถ. ๊ฐ์ด ์์ผ๋ฉด null์ด๋ฉฐ ํค๋ฅผ ์๋ตํ์ง ์์ต๋๋ค์ ์ ack ์์
locationยทmap_idยทposture๋ฅผ ์ฝ์ผ๋ฉดundefined์ ๋๋ค โ ์์ง ์์๋ ์ ํ ๋ช ๋ น์ด๋ผ ๊ฐ์ด ์๋ ๊ฒ ๋ง์ต๋๋ค.
status
| ๊ฐ | ๋จ๊ณ | ๋ป | ์๋ฒ๊ฐ ํ ์ผ |
|---|---|---|---|
ACCEPTED |
โ | ์ ์๋จ. ์คํ ์์ | ์๋ฃ ์๋ต์ ๊ธฐ๋ค๋ฆฝ๋๋ค |
BUSY |
โ | ๋ค๋ฅธ ๋ช ๋ น ์คํ ์ค | ์ฌ์๋ ๋๋ ๋๊ธฐ. ์๋ฃ ์๋ต์ ์ค์ง ์์ต๋๋ค |
REJECTED |
โ | ์ง๊ธ ์ํ์์ ๋ถ๊ฐ | ์ฌ๊ณํ. ์๋ฃ ์๋ต์ ์ค์ง ์์ต๋๋ค |
SUCCESS |
โก | ์ ์ ์๋ฃ | ๋ค์ ๋จ๊ณ |
ABORTED |
โก | STOP ์ผ๋ก ์ค๋จ๋จ | ์ฌ๋์ด ๊ฐ์ ํ ๊ฒ |
FAULT_NAV |
โก | ๊ฒฝ๋ก ์คํจยท์์น ์์ค | NOT_LOCALIZED ๋ฉด ์ฌ์๋ ๊ธ์ง (์๋ ์ฐธ๊ณ ) |
FAULT_LEASE |
โก | ์ ์ด๊ถ์ ๋บ๊น | state.commands_accepted ๊ฐ true ๋ก ๋์์ฌ ๋๊น์ง ๋๊ธฐ |
FAULT_HW |
โก | ํ๋์จ์ด ๋ฌธ์ | ์ด์์ ํธ์ถ |
TIMEOUT |
โก | ์ ํ ์๊ฐ ์ด๊ณผ | ์ฌ์๋ |
โ ๏ธ
navigate_to๋TIMEOUT์ ๋ด์ง ์์ต๋๋ค. ๋ก๋ด์ ๋์ฐฉํ๊ฑฐ๋ ์คํจํ ๋๊น์ง ๊ณ์ ๊ฐ๋๋ค. ์๋ฒ๊ฐ ์์ฒด ์ํ์ ๊ฑธ์ด์ฃผ์ธ์ โ ์ฃผํ ์๋๊ฐ 0.15 m/s ์ด๋ฏ๋ก ๊ฒฝ๋ก ๊ธธ์ด(m) รท 0.15 ์ ์ฌ์ ๋ฅผ ๋ํ ๊ฐ์ด ๊ธฐ์ค์ด ๋ฉ๋๋ค. ์ํ์ ๋๊ฒผ๋ค๊ณ ํ๋จํ๋ฉด ๊ฐ์ ๋ช ๋ น์ ์ฌ์๋ํ์ง ๋ง๊ณstop์ ๋จผ์ ๋ณด๋ด์ฃผ์ธ์. ๋ก๋ด์ ์์ง ๊ทธ ๋ช ๋ น์ ์คํ ์ค์ด๋ผ ์ ๋ช ๋ น์BUSY๋ก ๊ฑฐ์ ๋ฉ๋๋ค.
orchestration-server ๊ฐ ๊ฑฐ๋ ์ํ์ ์ฑ ์ค์
spot_command_timeout_seconds(๊ธฐ๋ณธ 30์ด) ์ ๋๋ค. ๋ฐฑ์คํผ์ค์ค์ ํ๋ฉด์์ ๋ฐ๊ฟ ์ ์๊ณ , ํ์ ์ด๋ฏธ ๋ค์ด๊ฐ ๋ช ๋ น๋ ๋ฐํ ์ง์ ์ ๋ค์ ์ฝ์ผ๋ฏ๋ก ๊ณ ์น๋ฉด ๋ฐ๋ก ๋ค์ ๋ช ๋ น๋ถํฐ ๋จน์ต๋๋ค. ์๋ํ ์ก์ ์timeout_ms๋ฅผ ์ง์ ์ ์ด ๋ ๊ฒฝ์ฐ์๋ ๊ทธ ๊ฐ์ด ์ฐ์ ํฉ๋๋ค. ์ํ์ ๊ฑธ๋ ค ๋ฉ์ถ ๋ช ๋ น์ ์คํํ ํ๋ฉด/staff/spot์ ๋จ๊ณ , ๊ฑฐ๊ธฐ์์ฆ์ ์ ์งโ์ฌ์๋์์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
โ ๏ธ
BUSYยทREJECTED๋ ์๋ฃ ์๋ต์ด ์ค์ง ์์ต๋๋ค. ๋ฌด์กฐ๊ฑด ๊ธฐ๋ค๋ฆฌ๋ฉด ์์ํ ๋ธ๋กํน๋ฉ๋๋ค.ACCEPTED๋ฅผ ๋ฐ์ ๋ช ๋ น๋ง ๊ธฐ๋ค๋ ค์ฃผ์ธ์.
โ ๏ธ ์์ธ ํ๋ โ
run_scenario์์์๋REJECTED๊ฐ ์๋ฃ ์๋ต์ผ๋ก ์ต๋๋ค. ์๋๋ฆฌ์ค๋ ์คํ ์ ์์ํ ๋ค์์ผ ๋ชฉ์ ์ง ์ด๋ฆ์ ํ๊ธฐ ๋๋ฌธ์, ๊ทธ ์ด๋ฆ์ด ํ๋ ธ์ผ๋ฉด ์ ์๋ACCEPTED๋ก ๋๋๊ณ ์คํจ๊ฐ โก๋จ๊ณ๋ก ์ต๋๋ค (fault_detail.failed_step์ผ๋ก ์ด๋ ์คํ ์ธ์ง ์ ์ ์์ต๋๋ค).ACCEPTED๋ฅผ ๋ฐ์ ๋ช ๋ น์REJECTED๋ก ๋๋ ์๋ ์๋ค๊ณ ๋ณด๊ณ ์ข ๊ฒฐ ์ฒ๋ฆฌํด์ฃผ์ธ์.
fault_detail ๊ตฌ์กฐ
| ํ๋ | ํ์ | ์ธ์ |
|---|---|---|
code |
string | ํญ์ (์๋ ํ) |
message |
string | ํญ์. ์ฌ๋์ด ์ฝ๋ ๋ฌธ์ฅ |
failed_step |
number | run_scenarioยทํ๋ ์คํจ ์์๋ง. ์คํจํ ์คํ
์ 0-๋ฒ ์ด์ค ์ฒจ์ |
plan_id |
string | ใ |
fault_detail.code
| ์ฝ๋ | ์ธ์ | ์๋ฒ๊ฐ ํ ์ผ |
|---|---|---|
UNKNOWN_ACTION |
๋ชจ๋ฅด๋ action |
์คํ์ด๊ฑฐ๋ ๋ฏธ์ง์. ์ฌ์๋ ๋ฌด์๋ฏธ |
BAD_PARAM |
ํ์ ํ๋ผ๋ฏธํฐ ์์ | ๋น ์ง ์ด๋ฆ์ด message ์ ์ ํ๋๋ค |
UNKNOWN_WAYPOINT |
destination ์ด ๋ชฉ๋ก์ ์์ |
waypoints ๋ฅผ ๋ค์ ์ฝ์ผ์ธ์ |
AMBIGUOUS_WAYPOINT |
๊ฐ์ ์ด๋ฆ์ ์ง์ ์ด ๋ ์ด์ | ๊ทธ ์ด๋ฆ์ ์ธ ์ ์์ต๋๋ค (3์ ) |
NOT_A_DESTINATION |
์๋ ์์ฑ ๊ฒฝ์ ์ง๋ฅผ ๋ชฉ์ ์ง๋ก ์ง์ | ๊ธธ์ด์ง ์ฅ์๊ฐ ์๋๋๋ค |
NOT_LOCALIZED |
๋ก๋ด์ด ์๊ธฐ ์์น๋ฅผ ๋ชจ๋ฆ | ์ฌ์๋ ๊ธ์ง. ์์น์ถ์ ๋ถํฐ |
BATTERY_LOW |
๋ฐฐํฐ๋ฆฌ ์ ๊ธ โ ๋ณต๊ท ํ ์ฐฉ์ ์ํ (9.2์ ) | ์ถฉ์ ์ ๊น์ง ์ ํ๋ฆฝ๋๋ค. ์ด์์ ํธ์ถ |
MOTION_DISABLED |
์ด์์๊ฐ ๋ชจ์ ์ ์ ๋ฉด ์ฐจ๋จํจ | ์ฌ๋์ด ํ์ด์ผ ํฉ๋๋ค. stop ์ ๊ณ์ ๋จน์ต๋๋ค |
DISPATCH_ERROR |
๋ก๋ด ๋ด๋ถ ์์ธ | ๋ก๊ทธ ํ์ธ์ด ํ์ํฉ๋๋ค |
ack์plan์๋ ์์ฒญ์session_id๋ฅผ ๊ทธ๋๋ก ์ค์ด ๋๋๋ ค์ค๋๋ค. OC ์๋ฒ๊ฐ ์ด ๊ฐ์ ์ฌ๋ฐํ ํ ํฝ ์ด๋ฆ ์์ ๋ผ์ฐํ ํค๋ก ์ฐ๊ธฐ ๋๋ฌธ์ ๋๋ค (orchestration/{session_id}/spot/ack). ์ด ๊ฐ์ด ์์ผ๋ฉด ์ฌ๋ฐํ ์์ฒด๊ฐ ์ผ์ด๋์ง ์์ ํ๋ฉด์ ์๋ฌด๊ฒ๋ ๋จ์ง ์์ต๋๋ค โ ๋ฉ์์ง ์ ์ค์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ผ์ฐํ ์คํจ์ ๋๋ค.
์์
// โ ์ ์
{ "command_id": "cmd-0042", "session_id": "01HW9X8M2K", "robot_id": "spot-01",
"status": "ACCEPTED", "timestamp": "2026-08-08T04:12:03Z",
"fsm_state": "NAVIGATING" }
// โก ์๋ฃ (์ฑ๊ณต)
{ "command_id": "cmd-0042", "session_id": "01HW9X8M2K", "robot_id": "spot-01",
"status": "SUCCESS", "timestamp": "2026-08-08T04:14:11Z",
"fsm_state": "IDLE", "posture": "stand",
"location": "p2", "map_id": "map_0807_2112", "fault_detail": null }
// โก ์๋ฃ (์คํจ)
{ "command_id": "cmd-0042", "session_id": "01HW9X8M2K", "robot_id": "spot-01",
"status": "FAULT_NAV", "timestamp": "2026-08-08T04:13:40Z",
"fsm_state": "IDLE", "posture": "stand",
"location": null, "map_id": "map_0807_2112",
"fault_detail": { "code": "NOT_LOCALIZED",
"message": "robot does not know where it is" } }
5. ์ํ ยท ๋ชฉ๋ก ํ ํฝ
robot/spot-01/state โ 1Hz, retained
{
"connection": "online", // offline ์ด๋ฉด SPOT ์ด ์ฃฝ์ ๊ฒ (์๋ ์ฐธ๊ณ )
"timestamp": "2026-08-08T04:12:03Z",
"fsm_state": "IDLE", // IDLE|NAVIGATING|FOLLOWING|EXECUTING_PLAN
// |POSING|INSPECTING|RELOCALIZING
"battery_pct": 54,
"battery_runtime_min": 93,
"power_state": "ON", // ON|OFF (๋ชจํฐ ์ ์)
"posture": "stand", // stand|sit|unknown โ ์ ์๊ณผ ๋ณ๊ฐ์
๋๋ค
"shore_power": "OFF", // ์ถฉ์ ์ผ์ด๋ธ ON|OFF
"battery_status": "DISCHARGING", // CHARGING|DISCHARGING
"estop_state": "NONE", // NONE|SOFTWARE|HARDWARE
"lease_owned": true, // SPOT ์๋ฒ๊ฐ ์ ์ด๊ถ์ ์ฅ๊ณ ์๋
"lease_owner": "orchestration", // orchestration | operator | none
"commands_accepted": true, // โ
false ๋ฉด ์ง๊ธ ๋ช
๋ น์ ๋ณด๋ด๋ ์คํจํฉ๋๋ค
"localized": true, // ์๊ธฐ ์์น๋ฅผ ์๋
"is_lost": false, // true ๋ฉด ์ด๋ ๋ช
๋ น์ด ์คํจํฉ๋๋ค
"current_waypoint_label": "p2", // ์ฌ๋์ด ์ฝ๋ ์ด๋ฆ
"current_waypoint_id": "papery-toucan-iQ1qโฆ", // ๊ทธ๋ํ ์์ ๊ณ ์ id
"target_waypoint_label": null, // ์ด๋ ์ค์ด๋ฉด ๋ชฉ์ ์ง
"target_waypoint_id": null,
"map_id": "map_0807_2112",
"current_command_id": null, // ์คํ ์ค์ธ ๋ช
๋ น. ์์ผ๋ฉด null
"seed_tform_body": { "x": 1.46, "y": 0.24, "z": -0.42, "yaw_deg": 55.0 },
"world_position_cm": null, // ๋ณด์ ๋๋ฉด { "x": 812.4, "y": -230.1 } (cm, zยทyaw ์์)
"anchor_offset": null, // ์ ๋ณํ์ ๊ทผ๊ฑฐ {rotation_deg, tx_cm, ty_cm}
"faults": [] // ์์ผ๋ฉด [{ "name": "โฆ", "severity": 2 }]
}
commands_accepted๋ฅผ ๋ณด๊ณ ๋ฐํ ์ฌ๋ถ๋ฅผ ํ๋จํด์ฃผ์ธ์.false๊ฐ ๋๋ ๊ฒฝ์ฐ๋ ๊ด๋ฆฌ์๊ฐ ํ์ฅ์์ ์ ์ด๊ถ์ ๊ฐ์ ธ๊ฐ์ ๋, ๋น์์ ์ง ์ค์ผ ๋, ๋ฐฐํฐ๋ฆฌ๊ฐ ๋ฐ๋ฅ์ด๊ฑฐ๋ ์ ๊ฒผ์ ๋(9.2์ ), ๊ทธ๋ฆฌ๊ณ ๋ก๋ด์ด ๊ด์ ๋ชจ๋๋ก ๋ถ์ด ์์ ๋์ ๋๋ค. ์์ ๊ฒ๋ค์lease_ownerยทestop_stateยทbattery_pct๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.๊ด์ ๋ชจ๋๋ SPOT ์๋ฒ๊ฐ E-Stop ๋ฑ๋ก์ ๋ชป ํ ์ํ์ ๋๋ค โ ์ํยท์นด๋ฉ๋ผยท์์น๋ ์ ๋ถ ์ ์์ด๊ณ ๋ชจ์ ๋ง ๋ถ๊ฐํ๋ฉฐ, ์กฐ๊ฑด์ด ํ๋ฆฌ๋ฉด ์ค์ค๋ก ๋ณต๊ตฌ๋ฉ๋๋ค.
state๋ง์ผ๋ก๋ ์ด ๊ฒฝ์ฐ๋ฅผ ๋ฐ๋ก ๊ตฌ๋ถํ ์ ์์ผ๋, ๋ค๋ฅธ ์ ์ด ์ ์์ธ๋ฐcommands_accepted๊ฐfalse๋ฉด ์ด๊ฒ์ด๋ผ๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค.
์ง๋จ์ฉ ํ๋๊ฐ ๋ช ๊ฐ ๋ ์ค๋ฆฝ๋๋ค (
temp_cยทjointsยทjoint_max_loadยทjoints_detail). ๊ณ์ฝ์ด ์๋๋ผ ์๊ณ ์์ด ๋ฐ๋๋ฏ๋ก ํ๋ฉด์์ ์ฐ์ง ๋ง์ธ์.
์ด ํ ํฝ์ ๋ฐํ์๋ SPOT ์๋ฒ ํ๋์ ๋๋ค โ ๋ดํฌ์
source๋ ํญ์/services/spot-mcp-server์ ๋๋ค.
current_command_id๋ ack ๋ฅผ ๋์ณค์ ๋์ ๋ณต๊ตฌ ๋จ์์ ๋๋ค. ์๋ฃack๋ retained ๊ฐ ์๋๋ผ, ์๋ฒ๊ฐ ์ฌ์์ํ๊ฑฐ๋ ๋ธ๋ก์ปค ์ฐ๊ฒฐ์ด ๋๊ธด ์ฌ์ด์ ์ค๋ฉด ์ ์ค๋ฉ๋๋ค. ๊ทธ๋ ์ด ๊ฐ์ ๋ณด๋ฉด ๋ก๋ด์ด ์์ง ๊ทธ ๋ช ๋ น์ ์คํ ์ค์ธ์ง ์ ์ ์์ต๋๋ค โnull์ธ๋ฐ ์๋ฒ ํ์ pending ์ด ๋จ์ ์๋ค๋ฉด ๊ทธ ๋ช ๋ น์ ์ด๋ฏธ ๋๋ ๊ฒ์ ๋๋ค.์ ์
ACCEPTED์์ ์ ์ค๋ฆฌ๊ณ ์๋ฃack์์ ์ ๋ด๋ ค๊ฐ๋๋ค. MQTT ๋ก ๋ฐ์ ๋ช ๋ น๋ง ์ค๋ฆฝ๋๋ค โ ๊ด๋ฆฌ์ UI ๊ฐ MCP ๋ก ์ง์ ์ํจ ๋์ ์ค์๋null์ด๊ณ , ๊ทธ๋๋fsm_state๊ฐIDLE์ด ์๋ ๊ฒ์ผ๋ก ํ๋จํด์ฃผ์ธ์.
stateํ์ด๋ก๋์๋robot_id๊ฐ ์์ต๋๋ค. ์ด๋ ๋ก๋ด์ธ์ง๋ ํ ํฝ ๊ฒฝ๋ก์{id}์ธ๊ทธ๋จผํธ๋ก ํ๋จํด์ฃผ์ธ์ (ack์๋robot_id๊ฐ ์ค๋ฆฝ๋๋ค).
world_position_cm์ ์ต์ปค ํ๊ทธ๋ก ๋ณด์ ํ ๋ค์๋ง ๊ฐ์ด ์์ต๋๋ค. ๊ทธ ์ ์๋null์ ๋๋ค. ์ฝ์์ด ์ด ์ขํ๋ฅผ ์ง๋์ ๋์ฐ์ผ๋ ค๋ฉด ์ญ๋ณํ์ด ํ์ํ๋ฐ, ๊ทผ๊ฑฐ๋anchor_offset๋ฟ์ ๋๋ค. ๋งต์ ๋ค์ ๋ นํํ๋ฉด ๋ ๋คnull๋ก ๋์๊ฐ๋๋ค.
connection: offline์ SPOT ์ด ๋ฐํํ์ง ์์ต๋๋ค. SPOT ์ด ์ฃฝ์ผ๋ฉด ๋ธ๋ก์ปค๊ฐ ๋์ ๋ฐํํฉ๋๋ค(MQTT LWT). retained ๋ผ ๋ฆ๊ฒ ๋ถ์ ๊ตฌ๋ ์๋ ์ฆ์ ์๋๋ค. ๋ค๋ง ๋ธ๋ก์ปค๊ฐ ์์์ฑ๋ ๋ฐ ์ต๋ 60์ด ๊ฑธ๋ฆฌ๋ฏ๋ก,timestamp๋ฅผ ๊ฐ์ด ๋ณด๊ณ ์ค๋๋ ๊ฐ์ธ์ง ํ๋จํด์ฃผ์ธ์.
๊ทธ๋ ์ค๋ ๊ฒ์ ์ ์ ๋ฌธ์ด ์๋๋ผ ์๋ 3ํ๋์ง๋ฆฌ์ ๋๋ค (๋ธ๋ก์ปค๊ฐ ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ ํ์ด๋ก๋๋ฅผ ๊ทธ๋๋ก ๋ฑ๊ธฐ ๋๋ฌธ์ ๋๋ค):
{ "specversion": "1.0", "type": "robot.state",
"source": "/services/spot-mcp-server", "subject": "robot/spot-01",
"data": { "robot_id": "spot-01", "connection": "offline",
"timestamp": "2026-08-08T04:20:00Z" } }
โ ๏ธ ๊ฐ์ ํ ํฝ์ ์คํค๋ง๊ฐ ๋์ด๋ผ๋ ๋ป์ ๋๋ค.
battery_pctยทfsm_state๋ฅผ ํ์๋ก ํ์ฑํ๋ฉด ๋ก๋ด์ด ์ฃฝ๋ ์๊ฐ ํ์๊ฐ ๊นจ์ง๋๋ค.connection์ ๋จผ์ ๋ณด๊ณ ๋ถ๊ธฐํด์ฃผ์ธ์.
โ ๏ธ ์ด ๋ฉ์์ง๋ retained ๋ผ ์ง์ ์ ์ ์ state ๋ฅผ ๋ฎ์ด์๋๋ค. "์ฃฝ๊ธฐ ์ง์ ๋ฐฐํฐ๋ฆฌ๊ฐ ๋ช %์๋" ๋ ๋ธ๋ก์ปค์ ๋จ์ง ์์ต๋๋ค โ ํ์ํ๋ฉด ์๋ฒ๊ฐ ๋ง์ง๋ง ๊ฐ์ ๋ณด๊ดํด์ฃผ์ธ์.
robot/spot-01/waypoints โ retained
๊ฐ ์ ์๋ ๊ณณ ๋ชฉ๋ก. ๋งต์ ์๋ก ๋ง๋ค ๋๋ง๋ค ๊ฐฑ์ ๋ฉ๋๋ค.
{
"map_id": "map_0807_2112",
"updated_at": "2026-08-07T12:54:48Z",
"waypoints": [
{ "label": "origin", "fiducials": [1] },
{ "label": "p2", "fiducials": [0, 2] },
{ "label": "p3", "fiducials": [0] }
]
}
retained ๋ผ์ ์๋ฒ๊ฐ ์ธ์ ์ผ์ง๋ ์ ์ ์ฆ์ ๋ชฉ๋ก์ ๋ฐ์ต๋๋ค. ํ๋ธ๋ฆฟ ๋ชฉ์ ์ง ๋ฉ๋ด๋ฅผ ์ด๊ฑธ๋ก ์ฑ์ฐ๋ฉด ๋ฉ๋๋ค.
โ ๏ธ
label์ ์ ์ผํ์ง ์์ต๋๋ค. ๋งต์ ๋ นํํ ๋ ๊ฐ์ ์ด๋ฆ์ ๋ ๋ฒ ๋ถ์ด๋ฉด ๊ทธ๋๋ก ๋ ๋ค ์ค๋ ค ์ต๋๋ค. ๊ทธ ์ด๋ฆ์ ๋ชฉ์ ์ง๋ก ๋ชป ์๋๋ค(3์ ) โ ๋ฉ๋ด๋ฅผ ๋ง๋ค๊ธฐ ์ ์ ์ค๋ณต์ ๊ฑธ๋ฌ์ฃผ์ธ์.
robot/spot-01/scenarios โ retained
์คํ ๊ฐ๋ฅํ ์๋๋ฆฌ์ค ๋ชฉ๋ก. ๊ด๋ฆฌ์ UI ์ ํธ์ง๊ธฐ๊ฐ ์ ์ฅํ ๋ ๋ฐํํฉ๋๋ค.
{
"updated_at": "2026-08-08TโฆZ",
"scenarios": [
{ "id": "guide", "label": "์ ์ ์๋ด",
"variables": { "spot": "p2" }, // ์คํ ์ ์ฑ์ธ ๊ฐ
"unsupported_steps": [] } // ์์ง ๋ชป ํ๋ ๋์์ด ์์ผ๋ฉด ์ฌ๊ธฐ ํ์
]
}
์คํ
๋ด์ฉ์ ์ค๋ ค ์์ง ์์ต๋๋ค. ์๋ฒ๋ id ์ label ๋ง ์๋ฉด ๋๊ณ ,
๊ทธ ์๋๋ฆฌ์ค๊ฐ ์ด๋ค ๋์๋ค๋ก ์ด๋ฃจ์ด์ก๋์ง๋ SPOT ์ด ์๋๋ค.
robot/spot-01/plan โ ์๋๋ฆฌ์ค ์งํ ์ํฉ
{ "session_id": "01HW9X8M2K", "command_id": "cmd-0050",
"plan_id": "p-1", "scenario_id": "guide", "action": "navigate_to",
"step_index": 0, "total_steps": 3,
"status": "SUCCESS", "timestamp": "2026-08-08T04:12:03Z" }
์ฌ๋ฌ ๋จ๊ณ์ง๋ฆฌ ์๋๋ฆฌ์ค๊ฐ ์ด๋๊น์ง ๊ฐ๋์ง ๋ณด์ฌ์ค๋๋ค. ํ๋ธ๋ฆฟ ์งํ ํ์์ ์ธ ์ ์์ต๋๋ค.
step_index๋ 0๋ถํฐ ์ ๋๋ค (0 โค step_index < total_steps). ์๋ฃack์fault_detail.failed_step๋ ๊ฐ์ ๊ธฐ์ค์ ๋๋ค. ์ด๊ธ๋๋ฉด ๊ฐ์ ์คํ ์ด ํ ํฝ๋ง๋ค ๋ค๋ฅธ ๋ฒํธ๋ก ๋๊ฐ๋๋ค.- ์คํ ๋น 1๊ฑด, ๊ทธ ์คํ ์ด ๋๋ ์์ ์๋ง ๋ฐํํฉ๋๋ค. ์์ ์ด๋ฒคํธ๋ ์์ต๋๋ค. ์งํ ์ค์ธ ์คํ ์ "๋ง์ง๋ง ๋ฐํ + 1" ๋ก ๋ณด๋ฉด ๋ฉ๋๋ค.
- ์คํจํ ์คํ
๋ 1๊ฑด ๋ฐํ๋ฉ๋๋ค โ
status๊ฐSUCCESS๊ฐ ์๋๊ณaborted: true๊ฐ ๋ถ์ต๋๋ค. ๊ทธ ๋ค ์คํ ์ ๋ฐํ๋์ง ์์ต๋๋ค. total_steps๋ ํญ์ ์ค๋ฆฝ๋๋ค. ์คํ ์ด ์คํจํ๋ฉด ๊ฑฐ๊ธฐ์ ๋ฉ์ถ๊ณ ๋๋จธ์ง๋ ๋ฐํ๋์ง ์์ผ๋ฏ๋ก, ์ด ๊ฐ์ด ์์ผ๋ฉด "3๊ฐ ์ค 1๊ฐ๋ง ์๋ค" ์ "1๊ฐ์ง๋ฆฌ๊ฐ ๋ค ์๋ค" ๋ฅผ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.- ์ค๋จ๋๋ฉด
aborted: true๊ฐ ๋ถ์ต๋๋ค. ํ์์๋ ํค ์์ฒด๊ฐ ์์ต๋๋ค.
| ํ๋ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
plan_id |
string | Y | ์คํ ํ ๊ฑด์ id. SPOT ์ด ๋ฐ๊ธํ๋ฉฐ command_id ์ 1:1 ์
๋๋ค. ๊ฐ์ ์๋๋ฆฌ์ค๋ฅผ ๋ค์ ๋๋ฆฌ๋ฉด ์๋ก ๋ฐ๊ธ๋ฉ๋๋ค |
command_id |
string | Y | ์์ฒญ์ ๊ฐ |
session_id |
string | null | Y | ์์ฒญ์ ๊ฐ (์ฌ๋ฐํ ๋ผ์ฐํ ํค) |
robot_id |
string | Y | spot-01 |
scenario_id |
string | null | Y | run_scenario ๊ฐ ์๋๋ฉด null |
action |
string | Y | ๊ทธ ์คํ
์ด ๋ฌด์์ด์๋ (navigate_to ๋ฑ) |
step_index |
number | Y | 0-๋ฒ ์ด์ค |
total_steps |
number | Y | ์ ์ฒด ์คํ ์ |
status |
string | Y | SUCCESS | ABORTED | FAULT_NAV | FAULT_LEASE | FAULT_HW | TIMEOUT |
timestamp |
string | Y | ๋ฐํ ์๊ฐ |
aborted |
bool | N | ์ค๋จยท์คํจ๋ก ๋๋ฌ์ ๋๋ง true |
6. ์์ ํ ํฝ
robot/spot-01/estop โ retained, QoS 2
๋น์์ ์ง๊ฐ ๋ฐ์ํ์ ๋์ ํด์ ๋์ ๋ ๋ฐํํฉ๋๋ค.
{ "active": true,
"source": "operator_console",
"reason": "soft_stop: motion halted, freeze in place",
"timestamp": "2026-08-08T04:12:03Z" }
reason |
๋ฌด์์ด ์ผ์ด๋ฌ๋ |
|---|---|
soft_stop: โฆ |
์์ง์๋ง ๋ฉ์ถค. ์ ์ฑ๋ก ์ ์ง |
stop_sit: โฆ |
๋ฉ์ถ๊ณ ์์ |
hard_estop: โฆ |
๋ชจํฐ ์ ์ ์ฐจ๋จ |
estop_release: โฆ |
ํด์ ๋จ (active: false) |
reason โ state.estop_state
reason |
state.estop_state |
|---|---|
soft_stop ยท stop_sit |
NONE ๊ทธ๋๋ก โ ๋ก๋ด์ E-Stop ๋ฑ๋ก์ ๊ฑด๋๋ฆฌ์ง ์๊ณ , ์ ์ด๊ถ๊ณผ ์ ์ง๋ช
๋ น๋ง์ผ๋ก ์ธ์๋๋ค |
hard_estop |
NONE ์ด ์๋๊ฒ ๋ฉ๋๋ค (๋ชจํฐ ์ ์ ์ฐจ๋จ) |
โ ๏ธ
estop.active: true์ธ๋ฐstate.estop_state: NONE์ธ ์ํ๊ฐ ์ ์์ ๋๋ค. ๋ ํ ํฝ์ด ์ด๊ธ๋ ๊ฒ ์๋๋ผ, ์ํํธ ์ ์ง๋ E-Stop ๋ ์ด์ด๋ฅผ ์ฐ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ๋ฉด์๋estop.active๋ฅผ ๋์ฐ๊ณ ,estop_state๋ "๋ชจํฐ ์ ์์ด ๋๊ฒผ๋" ๋ก๋ง ์ฝ์ด์ฃผ์ธ์.
๋๊ฐ ํธ๋
ํด์ ๋ ๊ณ์ฝ action ์ ์์ต๋๋ค. ์ด์์๊ฐ ๊ด๋ฆฌ์ UI ๋๋ ํ๋ธ๋ฆฟ์์ ํ๋๋ค.
์๋ฒ๋ estop ํ ํฝ์ผ๋ก ํด์ ์ฌ์ค(active: false)์ ๋ฐ์ ๋ฟ, ํด์ ๋ฅผ ์์ฒญํ ์๋จ์ด
์์ต๋๋ค. ํ์ํ๋ค๋ฉด ํ์ ๋์์
๋๋ค(8์ ).
robot/spot-01/fault โ retained, QoS 1
๋ก๋ด์ด ์ค์ค๋ก ํ๋จํ ์ฅ์ ๋ฅผ ์๋ฆฝ๋๋ค. ์๋๋ฆฌ์ค๋ฅผ ์ค๋จ์ํค๋ ์ฌ๊ฑด์ด ์ฌ๊ธฐ๋ก ๋์ต๋๋ค.
{ "robot_id": "spot-01", "code": "BATTERY_LOW", "active": true,
"message": "battery 32% - returning to charge",
"battery_pct": 32.0,
"timestamp": "2026-08-30T06:14:03Z" }
code |
์ธ์ |
|---|---|
BATTERY_LOW |
๋ฐฐํฐ๋ฆฌ๊ฐ ํ๋ ๋ฆฌ๋ฐ์ ๋ฟ์ (9.2์ ) |
-
message๋ ์ฌ๋์ด ์ฝ๋ ๋ฌธ์ฅ์ด๋ฉฐ ์ํฉ๋ง๋ค ๋ค๋ฆ ๋๋ค. ๋ถ๊ธฐ์ ์ฐ์ง ๋ง์ธ์ -
์ฝ๋๋ณ ์ถ๊ฐ ํ๋๊ฐ ๋ถ์ต๋๋ค (
BATTERY_LOW๋battery_pct) -
active๋ก ๋ฐ์๊ณผ ํด์ ๋ฅผ ๊ฐ๋ฆ ๋๋ค โ ํด์ ๋๋ฉด ๊ฐ์code์active: false๊ฐ ํ ๋ฒ ๋ ๋๊ฐ๋๋ค (estopํ ํฝ๊ณผ ๊ฐ์ ๊ท์ฝ) -
SPOT ์๋ฒ๊ฐ ์ฌ์์ํ๋ฉด, ์ง๊ธ ์๋ฌด ์ฅ์ ๊ฐ ์์ ๋ ํด์ ๋ฅผ ํ ๋ฒ ๋ฐํํฉ๋๋ค. retained ๋ ํ๋ก์ธ์ค๊ฐ ์ฃฝ์ด๋ ๋ธ๋ก์ปค์ ๋จ์ ์์ด์, ์๋ก ๋ฌ ์๋ฒ๋ ๋ฌด์์ด ๊ฑธ๋ ค ์๋์ง ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ์์ ๋ณธ ์ ์๋๋ฐ ํด์ ๊ฐ ์ค๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๊ณ ๋ณด์๋ฉด ๋ฉ๋๋ค โ ์ด๋ฏธ ํด์ ๋ ์ํ๋ผ๋ฉด ๋ฌด์ํ์ ๋ ๋ฉ๋๋ค
retained ๋ผ์ ๋ฆ๊ฒ ๋ถ์ ๊ตฌ๋ ์๋ ์ฆ์ ํ์ฌ ์ํ๋ฅผ ๋ฐ์ต๋๋ค.
active๋ฅผ ๋ณด๊ณ ํ๋จํด์ฃผ์ธ์ โtimestamp๋ง ๋ณด๋ฉด "์ค๋๋ ์ฅ์ " ์ธ์ง "์ค๋ ์ง์ ์ค์ธ ์ฅ์ " ์ธ์ง ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
state.faults๋ ์ด๊ฒ๊ณผ ๋ค๋ฆ ๋๋ค. ๊ทธ์ชฝ์ ๋ก๋ด ํ๋์จ์ด๊ฐ ๋ณด๊ณ ํ๋ ์์คํ ํดํธ ๋ชฉ๋ก({name, severity})์ด๊ณ , ์ด ํ ํฝ์ SPOT ์๋ฒ์ ํ๋จ์ ๋๋ค.
7. ์๋๋ฆฌ์ค๋ณ ํ๋ฆ
์ํ์ค ๋ค์ด์ด๊ทธ๋จ๊ณผ ์๋๋ฆฌ์ค๋ณ ์ ์ฑ ์ ์์ sequence ํ์ด์ง์ ์์ต๋๋ค. ๊ฐ์ ๋ด์ฉ์ ๋ ๊ณณ์ ๋๋ฉด ํ์ชฝ๋ง ๊ณ ์ณ์ ธ ์ด๊ธ๋๋ฏ๋ก ๋งํฌ๋ก ๋ก๋๋ค.
| ์๋๋ฆฌ์ค | ์ฐ๋ action |
ํนํ ๋ณผ ๊ฒ |
|---|---|---|
| ์ง์ ์ด๋ | navigate_to |
NOT_LOCALIZED ๋ ์ฌ์๋ํด๋ ์ ํ๋ฆฝ๋๋ค |
| ์๋๋ฆฌ์ค ์คํ | run_scenario |
์ด๋ฆ๋ง ๋ณด๋ด๋ฉด ๋ฉ๋๋ค. ์งํ๋ฅ ์ plan ํ ํฝ |
| ์ฌ๋ ์ถ์ข | follow |
โ ๏ธ ๊ตฌํ ์งํ ์ค. ๋ฐฉ์น๋๋ฉด ์ค์ค๋ก ๋๋ฉ๋๋ค(์๊ฐ์ ์กฐ์ ์ค) |
| ๋ก๋ดํ ์ฐ๋ | navigate_to |
์๋ฃ(SUCCESS)๋ฅผ ๋ฐ๊ณ ํ์ ์ง์ํด์ฃผ์ธ์ |
| ๋น์์ ์งยท๋ณต๊ตฌ | stop |
estop ํ ํฝ์ด retained ๋ก ์ต๋๋ค |
| ์ ์ด๊ถ ์ธ์ยท์ธ๊ณ | โ | state.commands_accepted ๋ก ํ๋จ |
8. ํฉ์๋ ๊ฒ ยท ๋จ์ ๊ฒ
ํฉ์๋จ
| # | ํญ๋ชฉ | ๊ฒฐ๋ก |
|---|---|---|
| 1 | ๋์ ๋ฐํ ์ ๋ฆฌ | OC ์๋ฒ๊ฐ ๋ก๋ด๋ณ ํ๋ก ์์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค (2026-08-10). ํ๋ธ๋ฆฟยท๊ด๋ฆฌ์ ํ๋ฉดยท๋์ฐฉ ์๋ํ๋ ์๋ฒ์ ์์ฒญํ๊ณ , ๋ก๋ด ํ ํฝ์ ๋ด๋ ๊ฒ์ ์๋ฒ๋ฟ์
๋๋ค. SPOT ์ ํ ๋ฒ์ ํ๋๋ง ์คํํ๊ณ ์คํ ์ค ์ ๋ช
๋ น์ BUSY ๋ก ๊ฑฐ์ ํ๋ฏ๋ก(ยง9.1), ์ฌ๋ฌ ๊ณณ์ด ๊ฐ์ ๋ณด๋ด๋ฉด ๋ค์ฃ๊ฒ์ด ์ฃฝ์ต๋๋ค โ ๊ทธ๋์ ํ ๊ณณ์ผ๋ก ๋ชจ์์ต๋๋ค |
๋ก๋ด ์ชฝ์ ์ด ๊ฒฐ์ ์ผ๋ก ๋ฐ๋ ๊ฒ์ด ์์ต๋๋ค. ๋ฐ๋ ํ ํฝยทํ์ด๋ก๋ยทack ๊ท์ฝ์ด ๊ฐ์ต๋๋ค. ๋ฌด์์ด ์ธ์ ๋ช ๋ น์ ๋ง๋๋์ง๋ LOCATION_AUTOMATION_DESIGN ์ ๋ณด์ธ์.
๋จ์ ๊ฒ
| # | ํญ๋ชฉ | ์ง๊ธ | ๋ฌผ์ด๋ณด๊ณ ์ถ์ ๊ฒ |
|---|---|---|---|
| 2 | ์๋๋ฆฌ์ค ๋ชฉ๋ก ๋ฐํ ์ฃผ์ฒด | ๋ก๋ดํ ๊ด๋ฆฌ์ UI ๊ฐ scenarios ํ ํฝ(retained)์ผ๋ก ๋ฐํ |
์๋ฒ๊ฐ ์๋๋ฆฌ์ค๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ด๋ฆฌํ ๊ณํ์ด ์๋ค๋ฉด ๋ฐํ ์ฃผ์ฒด๋ฅผ ์ฎ๊ฒจ์ผ ํฉ๋๋ค. ์ง๊ธ ๊ณํ์ ์๋ ค์ฃผ์ธ์ |
| 3 | ๋ชฉ์ ์ง ๋ผ๋ฒจ | waypoints ํ ํฝ์ label ์ด ์ ๋ณธ |
์ ์์ฅ ๋งต์ ์์ง ์ ์ฐ์ด ๋ผ๋ฒจ์ด ํ์ ๋์ง ์์์ต๋๋ค. ํ์ ๋๋ฉด device_locations.spot_waypoint_label ์ ๋ฃ์ ๊ฐ์ ์ ๋ฌํ๊ฒ ์ต๋๋ค |
| 4 | ๋น์์ ์ง ์๋ฆผ ํ ํฝ | robot/spot-01/estop ์ ์ ๋ณธ์ผ๋ก ํฉ๋๋ค (2026-08-30). ์ ์ญ MQTT_SCHEMA ์ safety/estop ์ ์ค์ผ์คํธ๋ ์ด์
์๋ฒ๊ฐ ๋ฆด๋ ์ดํ์ง ์์ ์๋ฌด๋ ๋ฐ์ง ๋ชปํฉ๋๋ค. ๊ทธ์ชฝ์ ๊ตฌ๋
์ค์ธ ์๋น์ค๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ธ์ โ ์์ชฝ ๋ฐํ์ผ๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค |
9. ๊ณตํต ์ ์ฑ
์๋๋ฆฌ์ค๋ฅผ ๊ฐ๋ฆฌ์ง ์๊ณ ์ ์ฉ๋๋ ๊ฒ๋ค์ ๋๋ค.
9.1 ํ ๋ฒ์ ํ๋
SPOT ์ ๋ช
๋ น์ ํ๋์ฉ๋ง ์คํํฉ๋๋ค. ์คํ ์ค ์ ๋ช
๋ น์ BUSY ๋ก ๊ฑฐ์ ํฉ๋๋ค (STOP ์ ์ธ).
์ ์ โ ์๋ฒ๊ฐ ํ๋ฅผ ๊ด๋ฆฌํด์ฃผ์ธ์. ์ ๋ช
๋ น์ ์๋ฃ ์๋ต(SUCCESS/FAULT_*)์ ๋ฐ์ ๋ค
๋ค์์ ๋ณด๋ด๋ ๋ฐฉ์์ด ๊ฐ์ฅ ๋จ์ํฉ๋๋ค.
9.2 ๋ฐฐํฐ๋ฆฌ
| ์์ค | ๋ฌด์จ ์ผ์ด ์ผ์ด๋๋ | ๋๊ฐ | ์๋ฒ ๋์ ์ ์ |
|---|---|---|---|
| 35% ์ดํ | ์ํ์ ํ์๋ง | โ | ๊ธด ์๋๋ฆฌ์ค๋ฅผ ์๋ก ์์ํ์ง ์๊ธฐ |
| 32% ์ดํ | ์ค์ค๋ก ์ถฉ์ ์๋ก ๋ณต๊ทํฉ๋๋ค. ๋งํ๋ฉด 30% ๊น์ง ์ฌ์๋ํ๊ณ , ๊ทธ๋์ fault ํ ํฝ์ BATTERY_LOW ๋ฅผ ๋
๋๋ค |
SPOT | ์งํ ์ค์ธ ์๋๋ฆฌ์ค๊ฐ ์ค๋จ๋ฉ๋๋ค |
| 30% ์ดํ | ๋ณต๊ท๋ฅผ ํฌ๊ธฐํ๊ณ ๊ทธ ์๋ฆฌ์ ์์ ๋ค ๋ชจ์
์ ์ ๊ธ๋๋ค. ์ด๋ commands_accepted ๊ฐ false ๋ก ๋ด๋ ค๊ฐ๊ณ , ์ด๋ ๋ช
๋ น์ REJECTED(BATTERY_LOW)๋ก ๊ฑฐ๋ถ๋ฉ๋๋ค |
SPOT | ์ด์์ ํธ์ถ. ์ถฉ์ ์ ๊น์ง ์ ํ๋ฆฝ๋๋ค |
| 30% ๋ฏธ๋ง | ์ ์ ์ธ๊ฐ(power_on)๊ฐ ๊ฑฐ๋ถ๋ฉ๋๋ค |
๋ก๋ด ํ์จ์ด | ์ฐ๋ฆฌ๊ฐ ๋ชป ๋ฐ๊ฟ๋๋ค. ์ ๋ ์ค์ด ์ฌ๊ธฐ ๋ฟ์ง ์์ผ๋ ค๋ ์ฅ์น์ ๋๋ค |
| 25% ๋ฏธ๋ง | ์ ๊ธฐ์ง ์์๋๋ผ๋ commands_accepted ๋ฅผ false ๋ก ๋ด๋ฆฝ๋๋ค (๋ง์ง๋ง ๋ฐฉ์ด์ ) |
SPOT | ๋ช ๋ น์ ๋ณด๋ด์ง ๋ง์ธ์ |
9.3 ์ ํด ์ ์๋ ์ฐฉ์
3๋ถ ๋์ ๋ช
๋ น์ด ์์ผ๋ฉด SPOT ์ด ์ค์ค๋ก ์์ต๋๋ค. ๋ค์ ๋ช
๋ น์ ์๋์ผ๋ก ๋ค์ ์ผ์ด์ญ๋๋ค.
์ ์๋ ๊ฒ๋ง์ผ๋ก ๋ฐฐํฐ๋ฆฌ๊ฐ ๋น ๋ฅด๊ฒ ๋ณ๊ธฐ ๋๋ฌธ์ ๋๋ค(์ค์ธก: ์ธ์ ์๋น์ ๋๋ถ๋ถ์ด ๊ธฐ๋ฆฝ ์ ์ง). ์๋ฒ๊ฐ ๋ฐ๋ก ํ ์ผ์ ์์ต๋๋ค.
9.4 ๋ก๋ด์ด ์ฃฝ์์ ๋
state ํ ํฝ์ connection:"offline" ์ด ๋น๋๋ค. SPOT ์ด ๋ฐํํ๋ ๊ฒ ์๋๋ผ
๋ธ๋ก์ปค๊ฐ ๋์ ๋ฐํํฉ๋๋ค(MQTT LWT).
๋ธ๋ก์ปค๊ฐ ์์์ฑ๋ ๋ฐ ์ต๋ 60์ด ๊ฑธ๋ฆฌ๋ฏ๋ก, timestamp ๋ฅผ ๊ฐ์ด ๋ณด๊ณ ์ค๋๋ ๊ฐ์ธ์ง
ํ๋จํด์ฃผ์ธ์.
10. QoS / ๊ธฐํ ์ค์
| ํญ๋ชฉ | ๊ฐ | ์ด์ |
|---|---|---|
| ๋ช ๋ น QoS | 1 | ์ต์ 1ํ ์ ๋ฌ ๋ณด์ฅ. ์ค๋ณต์ ๋ดํฌ์ id ๋ก ๊ฑธ๋ฌ๋ |
| ๋ช ๋ น retained | โ | ์ฌ์ ์ ์ ์ ๋ช ๋ น์ด ์ฌ์คํ๋๋ฉด ์ ๋จ |
| ์ํ retained | โ | ์ ๊ท ๊ตฌ๋ ์๊ฐ ์ฆ์ ํ์ฌ ์ํ ํ๋ |
| E-Stop QoS | 2 | ์ ํํ 1ํ. ์์ ๋ฉ์์ง๋ ์ค๋ณตยท์ ์ค ๋ ๋ค ๊ณค๋ |
| clean session | true | ์คํ๋ผ์ธ ๋์ ์์ธ ์ ๋ช ๋ น์ ๋ฐ์ง ์์ |
๋ถ๋ก. ์ค์ ๋ก ๊ฒ์ฆ๋ ๊ฒ
๋ฌธ์ ๋ด์ฉ ์ค ์ค๋ฌผ ๋ก๋ด์ผ๋ก ํ์ธํ ๊ฒ๊ณผ ์์ง ์๋ ๊ฒ์ ๊ตฌ๋ถํฉ๋๋ค. ์ ํด๋ณธ ๊ฒ์ ํ๋ค๊ณ ์ ์ผ๋ฉด ๊ทธ๊ฑธ ์ ์ ๋ก ๊ฐ๋ฐํ์๊ฒ ๋๋ฏ๋ก ๋๋ ์ ์์ต๋๋ค.
| ํญ๋ชฉ | ์ํ |
|---|---|
navigate_to โ ์์ฃผ |
โ 2026-08-07 ์จ์ดํฌ์ธํธ 7๊ฐ ํต๊ณผ. 2026-08-30 ๊ด๋ฆฌ์ ํ๋ฉด โ OC โ MQTT ๊ฒฝ๋ก๋ก ์ฌํ์ธ |
run_scenario |
โ
3์คํ
์ ๋ถ SUCCESS, session_id ๊ทธ๋๋ก ๋๋์์ด |
follow ์์ยท์ ์ง |
โ ๏ธ ๊ตฌํ ์งํ ์ค โ ๋์ ์ถ์ ์ด ๋ถ์์ ํฉ๋๋ค. ์์ฐ์ ๋ฃ์ง ๋ง์ธ์ |
| ์ถ์ข ์ค STOP | โ 1์ด ์์ ์ ์ง |
state 1Hz |
โ |
stop ์ง๋ น ์์ฉ |
โ
2026-08-30, 4ํ ์ ๋ถ ์ฆ์ ACCEPTED (์ฃผํ ์ค ์ค์ ์ ์ง๊ฑฐ๋ฆฌ๋ 2026-08-09 ๊ธฐ๋ก) |
waypoints retained |
โ |
state.commands_accepted |
โ 2026-08-30, ์ค์ ๊ฒ์ดํธ๋ก ๋์ ํ์ธ |
return_home |
โ 2026-10-04 ์ ์์ฅ, ๊ด๋ฆฌ์ ์ฝ์ โ ๊ธธ๋ชฉ ๊ฒฝ์ ๋ณต๊ทยท์ฐฉ์ยท๋ชจํฐ OFF ํ์ธ |
| ๋ก๋ดํ ์ฐ๋ ์ ์ฒด ํ๋ฆ | โฌ ๋ฏธ์ํ |
world_position_cm / anchor_offset |
โฌ ๊ตฌํ๋จ, ์ค๋ฌผ ๋ณด์ ๋ฏธ๊ฒ์ฆ |