SYSTEM_DESIGN - zero1ne-26/doc GitHub Wiki
ํ๋ก์ ํธ ์ฝ๋๋ช : 2026-zerone ๋ฒ์ : 0.1 (Initial Draft) ์์ฑ์ผ: 2026-04-28
ํ๋์ ์ ์ ๊ณต๊ฐ์ 4๊ฐ์ ํ ๋ง ์์ญ(์นดํ, ๊ณต์, ์ฐจ๋, ์ง์ ์ค๋ด)์ผ๋ก ๋ถํ ํ๊ณ , 2๋์ ์ด์ข (็ฐ็จฎ) ๋ก๋ด๊ณผ 3๋์ ์ฒดํ์ ํ๋ธ๋ฆฟ, ๊ทธ๋ฆฌ๊ณ CCTV ๊ธฐ๋ฐ ๋น์ ์ถ์ ์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉ์์ ์ปจํ ์คํธ(๊ธฐ๋ถยท๋์ ยทํ๊ฒฝ)์ ์ ์์ ์ผ๋ก ๋ฐ์ํ๋ Physical AI ์ธํฐ๋์ ์ ์ฐ์ถํ๋ค.
- ์ด์ข ๋ก๋ด ์ถ์ํ: SPOT(Boston Dynamics)๊ณผ ๋ฏธ์ ๋ก๋ด์ ๋จ์ผ ๋ช ๋ น ์ธํฐํ์ด์ค๋ก ํตํฉ.
- ์ค์๊ฐ ์ปจํ ์คํธ ์ตํฉ: CCTV ์ถ์ , ์ฌ์ฉ์ ์ ๋ ฅ, ํ๊ฒฝ ๋ฐ์ดํฐ, ๋ก๋ด ํ ๋ ๋ฉํธ๋ฆฌ๋ฅผ ํ๋์ ์ผ๊ด๋ ์ํ(state)๋ก ์ ์ง.
- LLM(Large Language Model, ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ)์ ๊ฒฐ์ ๋ก ์ ์ด์: ๋น๊ฒฐ์ ์ LLM ์ถ๋ ฅ์ ์์ ํ ๋ก๋ด ๋ช ๋ น ์งํฉ์ผ๋ก ์ ์ฝ(guardrail).
- ๋ฌผ๋ฆฌ์ ์์ ์ฑ: ์ฌ์ฉ์์ ๋ก๋ด์ด ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ฐ์ ๊ณต๊ฐ์ ์กด์ฌํ๋ ํ๊ฒฝ์์์ e-stop(emergency stop, ๊ธด๊ธ ์ ์ง)ยท์ถฉ๋ ํํผ.
| ํญ๋ชฉ | ๋ชฉํ |
|---|---|
| ์ฌ์ฉ์ ์ ์ฅ ๊ฐ์ง โ ๋ก๋ด ๋ฐ์ ์์ | < 1.5s end-to-end |
| ํ๋ธ๋ฆฟ ๋ช ๋ น โ ๋ก๋ด ๋์ ์์ | < 800ms |
| LLM ์์ฌ๊ฒฐ์ (๋๊ตฌ ํธ์ถ ํฌํจ) | p95 < 2.5s |
| ์์คํ ๊ฐ์ฉ์ฑ (์ ์ ์ด์์๊ฐ ๊ธฐ์ค) | 99.5% |
| CCTV ์ถ์ ์ ํ๋ (๊ณต๊ฐ ๋จ์ in/out) | > 98% |
| ๋์ ์ฒดํ์ | ์ต๋ 3๋ช (ํ๋ธ๋ฆฟ ์์ ๋์ผ) |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Exhibition Site (LAN) โ
โ โ
โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ CCTV (n) โ โ Tablets x3 โ โ Robots x2 โ โ
โ โ Cameras โ โ (์ฒดํ์) โ โ SPOT + TBD โ โ
โ โโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโโ โ
โ โ RTSP โ WSS โ gRPC/ROS2 โ
โ โผ โผ โผ โ
โ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ Vision โ โ Tablet โ โ Robot โ โ
โ โ Tracker โ โ Gateway โ โ Adapter โ โ
โ โโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโ โโโโโโโโฌโโโโโโโโ โ
โ โ โ โ โ
โ โผ โผ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Event Bus (MQTT) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโ โ
โ โผ โผ โผ โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ โ
โ โ Context โ โ LLM โ โ Monitoring โ โ
โ โ Store โโโโโค Orchestra โ โ & Dashboard โ โ
โ โ (SQLite) โ โ -tor โ โ (live only) โ โ
โ โ โ โ โ โ โ โ
โ โโโโโโโโโโโโ โโโโโโโฌโโโโโโโ โโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โผ (Tool Calls โ Robot/Tablet) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- Perception ๋๋ฉ์ธ: CCTV ์์ โ ์ฌ์ฉ์ IDยท์์นยท๋์ ์ด๋ฒคํธ.
- Interaction ๋๋ฉ์ธ: ํ๋ธ๋ฆฟ UIยท์ฌ์ฉ์ ์ํ(๊ธฐ๋ถ ๋ฑ) ์ ๋ ฅ.
- Cognition ๋๋ฉ์ธ: LLM ๊ธฐ๋ฐ ์์ฌ๊ฒฐ์ , ๋๊ตฌ ํธ์ถ(tool use), ์์ ๊ฒ์ฆ.
- Actuation ๋๋ฉ์ธ: ๋ก๋ด ๋ช ๋ น ๋์คํจ์น, ํ ๋ ๋ฉํธ๋ฆฌ ์์ง.
- State ๋๋ฉ์ธ: ๋ชจ๋ ๋๋ฉ์ธ์ ๋จ์ผ ์ง์ค ๊ณต๊ธ์(SoT).
์ฑ ์: ์ฌ์ฉ์ยท๊ณต๊ฐยท๋ก๋ด ์ํ์ ์ค์๊ฐ ๋จ์ผ ์ง์ค ๊ณต๊ธ์(SoT).
โ ๏ธ OSS ๊ตฌํ ๋งคํ: ๋ณธ ์ ์ ์ถ์ ์ฑ ์์ ์ ์ํ๋ค. OSS ์ฑํ(OSS_INTEGRATION.md ยง1, ยง9)์ ๋ฐ๋ผ ์ด ์ฑ ์์ Home Assistant๊ฐ ํก์ํ๋ค โservices/context-server๋ผ๋ ๋ณ๋ ์๋น์ค๋ฅผ ๋ง๋ค์ง ์๋๋ค. ์๋ ๋ฐ์ดํฐ ๋ชจ๋ธยท์ ์ฅ์ ์ค๋ช ์ **HA์ entity state + recorder(SQLite)**๋ก ๋งคํ๋๋ค.
-
ํ์ฑ ์ธ์
:
sessionsํ ์ด๋ธ ๊ฐ๋ โ HA์sensor.session_<id>_*์ํฐํฐ ๊ทธ๋ฃน. -
๋ก๋ด ์ค๋
์ท:
robotsํ ์ด๋ธ ๊ฐ๋ โ HA์sensor.<robot_id>_*์ํฐํฐ ๊ทธ๋ฃน (MQTT(Message Queuing Telemetry Transport, ๋ฉ์์ง ํ ํ ๋ ๋ฉํธ๋ฆฌ ์ ์ก ํ๋กํ ์ฝ) Discovery๋ก ์๋ ๋ฑ๋ก). -
์์์ฑ: HA recorder๊ฐ SQLite(
/config/home-assistant_v2.db)์ ์๋ ๊ธฐ๋ก,purge_keep_days: 3. -
์ธ์
์ข
๋ฃ:
session/end์์ ์ ์๋ํ๊ฐ ํด๋น ์ํฐํฐ๋ฅผunavailable๋ก ํ์ + ์๋ฒ ๋ฉ ํ๊ธฐ ํธ๋ฆฌ๊ฑฐ (SCRUB ์๋ฏธ). - ํต๊ณยท์ด๋ ฅ์ ๋ณธ ๋จ๊ณ ๋ฒ์ ์ธ โ ํฅํ archiver ์๋น์ค๋ ๋ณ๋ ๋ถ์ DB ๋์ ๊ฐ๋ฅ.
| ์ถ์ ์ธํฐํ์ด์ค | ์ค์ ๊ตฌํ |
|---|---|
GET /context/user/{session_id} |
HA REST(Representational State Transfer, ํํ ์ํ ์ ์ด) GET /api/states/sensor.session_<id>_*
|
PATCH /context/user/{session_id} |
MQTT publish context/user/<session_id>/update (HA๊ฐ ์์ ํ entity ๊ฐฑ์ ) |
WS /context/stream |
HA WebSocket API subscribe_events: state_changed
|
- ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ ๋ชจ๋ Event Bus๋ก publish โ ๋ชจ๋ ๋ค๋ฅธ ์๋น์ค๋ ๊ตฌ๋ ์ผ๋ก๋ง ๋ฐ์.
- ๋ณ๋ ์บ์ ๊ณ์ธต(Redis ๋ฑ)์ ๋์ง ์์: ๋จ์ผ ์ฌ์ดํธยท๋์ 3 ์ธ์ ๊ท๋ชจ์์ HA recorder์ SQLite๋ก ์ถฉ๋ถ.
๋ฐ์ดํฐ ๋ชจ๋ธ(ยง4.1, ยง4.2)์ TypeScript ์ธํฐํ์ด์ค๋ ๊ทธ๋๋ก ์ ํจ โ ์ง๋ ฌํ ํ์ยทํ๋ ๊ตฌ์กฐ์ ์ ์์ด๋ฉฐ, ์ ์ฅ ์์น๋ HA๋ก ๋งคํ๋๋ค.
์ฑ ์: ๋ค์ค CCTV ์คํธ๋ฆผ์์ ์ธ๋ฌผ ๊ฐ์งยท์ถ์ ยท์ฌ์๋ณ(re-id), ๊ณต๊ฐ in/out ์ด๋ฒคํธ ์์ฑ.
- ํ์ดํ๋ผ์ธ: RTSP(Real Time Streaming Protocol, ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ํ๋กํ ์ฝ) ์ ๋ ฅ โ ๋์ฝ๋ฉ(GPU) โ YOLO(You Only Look Once, ๋จ์ผ ํจ์ค ๊ฐ์ฒด ํ์ง ๋ชจ๋ธ)v8 detection โ ByteTrack(Byte-level Multi-Object Tracking, ๋ฐ์ดํธ ๋จ์ ๋ค์ค ๊ฐ์ฒด ์ถ์ ์๊ณ ๋ฆฌ์ฆ)/BoT-SORT(Bootstrapped Object Tracking with SORT, ๋ถํธ์คํธ๋ฉ ๊ธฐ๋ฐ ๊ฐ์ฒด ์ถ์ ์๊ณ ๋ฆฌ์ฆ) tracking โ cross-camera re-id (OSNet(Omniscale Feature Network, ์ด๋์ค์ผ์ผ ํน์ง ๋คํธ์ํฌ) ์๋ฒ ๋ฉ) โ zone polygon ๋งค์นญ.
- ๊ณต๊ฐ ์ ์: ๊ฐ ๊ณต๊ฐ(์นดํยท๊ณต์ยท์ฐจ๋ยท์ค๋ด)์ ์นด๋ฉ๋ผ ์ขํ polygon์ผ๋ก ์ฌ์ ์ ์.
-
์ฒดํ์ ์๋ณ: ์
์ฅ ์ ํ๋ธ๋ฆฟ ํ์ด๋ง ๋จ๊ณ์์ ์๋ฅ/์ธํ ์๋ฒ ๋ฉ์ ์บก์ฒํด
session_id์ ๋ฐ์ธ๋ฉ. -
์ถ๋ ฅ ์ด๋ฒคํธ (MQTT ํ ํฝ):
-
vision/zone/enter/vision/zone/exit(session_id, zone_id, timestamp, confidence) -
vision/position/update(์ ๋น๋ ~5Hz, ํ๋ฉด ์ขํ)
-
์ฃผ์: ์๋ฉด ์ธ์์ด ์๋ ์ธํ ์๋ฒ ๋ฉ ๊ธฐ๋ฐ ๋จ๊ธฐ ์ถ์ ์ ์ฌ์ฉํด ๊ฐ์ธ์ ๋ณด ์ํฅ์ ์ต์ํ. ์๋ฒ ๋ฉ์ ์ธ์ ์ข ๋ฃ ์ ์ฆ์ ํ๊ธฐ.
์ฑ ์: ์ด์ข ๋ก๋ด์ ๋จ์ผ ๋ช ๋ น ์ธํฐํ์ด์ค๋ก ์ถ์ํ.
-
๊ณตํต ๋ช
๋ น ์คํค๋ง (Robot Capability Model):
capabilities: - locomotion: { goto, follow, stop, sit, stand } - expression: { gesture, look_at, sound } - perception: { detect_person, read_qr }
-
์ด๋ํฐ ๊ตฌํ:
-
SpotAdapter: Boston Dynamics SDK(Software Development Kit, ์ํํธ์จ์ด ๊ฐ๋ฐ ํคํธ) (gRPC(Google Remote Procedure Call, ๊ตฌ๊ธ ์๊ฒฉ ํ๋ก์์ ํธ์ถ)),bosdyn-clientPython wrapper. -
GenericAdapter: ROS2 ๊ธฐ๋ฐ ์ถ์ํ (๋ฏธ์ ๋ก๋ด ๊ฒฐ์ ํ ๊ตฌํ). ํ ํฝ:/cmd_vel,/pose, action servermove_to.
-
-
๋ช
๋ น ํ + ์ธํฐ๋ก:
- ์ฐ์ ์์ ํ (Safety > Operator > LLM).
-
Safety Interlock:
e_stop๋๋proximity_violation์ด๋ฒคํธ ๋ฐ์ ์ ํ fence โ ์ดํ ๋ชจ๋ ๋ช ๋ น์ ๊ฑฐ๋ถ, ์ด์์ reset ํ์.
-
ํ
๋ ๋ฉํธ๋ฆฌ: 1Hz๋ก
robot/{robot_id}/state๋ฐํ (battery, pose, current_action, fault).
์ฑ ์: ์ปจํ ์คํธ๋ฅผ ์ข ํฉํด LLM์ ์ง์ํ๊ณ , ๋๊ตฌ ํธ์ถ(tool use)์ ํตํด ๋ก๋ดยทํ๋ธ๋ฆฟ ์ก์ ์ ๊ฒฐ์ .
- ๋ชจ๋ธ: Claude (Anthropic API). ์์ฌ๊ฒฐ์ ํ์ง์ด ์ค์ํ๋ฉด Opus, ์ง์ฐ์ด ์ค์ํ๋ฉด Sonnet.
-
ํธ๋ฆฌ๊ฑฐ:
-
vision/zone/enter์ด๋ฒคํธ (MQTT) - ํ๋ธ๋ฆฟ์์ ์์ฐ์ด/์๋์ฑ ๋ช
๋ น ์
๋ ฅ (
tablet/{id}/intent) - ์ฌ์ฉ์ ์ปจํ
์คํธ ์ ์๋ฏธ ๋ณํ (
context/user/{id}/update)
-
-
์ปจํ
์คํธ ์ด์
๋ธ๋ฆฌ:
๊ณต๊ฐ๋ณ playbook(์นดํ=์๋ฃ ์ถ์ฒ ์ธํฐ๋์ , ๊ณต์=๋ํ ์ฐ์ฑ ๋ฑ)์ prompt์ ์ฃผ์ .
system_prompt + space_state + user_context + robot_state + zone_playbook -
Tool Use ์ ์ (LLM์ด ํธ์ถ ๊ฐ๋ฅํ MCP(Model Context Protocol, ๋ชจ๋ธ ์ปจํ
์คํธ ํ๋กํ ์ฝ) ๋๊ตฌ, snake_case):
-
robot_command(robot_id, capability, params)โmcp-robot-adapter -
show_options(tablet_id, options[])โmcp-tablet-gateway -
show_message(tablet_id, text, media)โmcp-tablet-gateway -
context_update(session_id, patch)โ orchestrator ๋ด๋ถ (MQTT publish)
-
-
๊ฐ๋๋ ์ผ:
- JSON ์คํค๋ง ๊ฒ์ฆ (๋๊ตฌ ์ธ์).
- ํ์ดํธ๋ฆฌ์คํธ: capabilityยทtarget์ ์ฌ์ ์ ์๋ enum๋ง ํ์ฉ.
- ์ขํยท์๋ ํ๊ณ๊ฐ(velocity_max, zone polygon ๋ด๋ถ) hard clamp.
- ๊ฑฐ๋ถ๋ ํธ์ถ์ Prometheus counter(
llm_tool_call_rejected_total)๋ก ์นด์ดํธํ๊ณ ์ด์ ๋ก๊ทธ(Loki)์ ํ ์ค ๋จ๊น. ์ด๋ฒคํธ ์์ ์ ์ฅ์ ํ์ง ์์.
- ํ๋กฌํํธ ์บ์ฑ: system prompt + zone playbook์ stable โ Anthropic prompt cache๋ก ๋น์ฉยท์ง์ฐ ์ ๊ฐ.
์ฑ ์: ์ฒดํ์์๊ฒ ํ์ฌ ๊ฐ๋ฅํ ์ก์ ์ ์ ์ํ๊ณ ์ ๋ ฅ์ ๋ฐ์.
- ์คํ: React Native (๊ถ์ฅ 1์์ โ HA WebSocketยทMQTT ํด๋ผ์ด์ธํธยท๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ๊ฐ ํ๋ถ). Flutter๋ ์ต์ ์ด์ง๋ง ๋ณธ ์์คํ ๊ธฐ๋ณธ๊ฐ ์๋. iOSยทAndroid ๋์ ๋์.
-
์ธ์
ํ์ด๋ง: ์์ ์ QR ์ค์บ โ
session_id๋ฐ๊ธ โ vision ์๋ฒ ๋ฉ ์บก์ฒ. -
UI ์ํ ๋ชจ๋ธ:
- ๊ฐ๋ฅ ๋ช
๋ น์ LLM์ด
show_options๋๊ตฌ ํธ์ถ๋ก push (์ฌ์ฉ์ ์ํ์ ๋ฐ๋ผ ๋์ ). ๊ฒฐ๊ณผ๋tablet/{id}/show_optionsํ ํฝ์ผ๋ก ๊ฒ์ดํธ์จ์ด๊ฐ WSS(WebSocket Secure, ๋ณด์ ์น์์ผ) ์ ๋ฌ. - ์ฌ์ฉ์๊ฐ ์ต์
์ ํ โ
tablet/{id}/intent์ด๋ฒคํธ ๋ฐํ โ LLM์ด ๋ค์ ํ๊ฐ.
- ๊ฐ๋ฅ ๋ช
๋ น์ LLM์ด
- ์ฐ๊ฒฐ: WSS over TLS(Transport Layer Security, ์ ์ก ๊ณ์ธต ๋ณด์), ์๋ ์ฌ์ฐ๊ฒฐ + ๋ก์ปฌ ํ (๋คํธ์ํฌ ๋จ์ ๋๋น).
์ฑ ์: ์ด์์๊ฐ ๋ชจ๋ ๋ก๋ดยท์ฒดํ์ยท์์คํ ์ํ๋ฅผ ํ์ฌ ์์ ๊ธฐ์ค์ผ๋ก ๊ฐ์. (์ด๋ ฅ ๋ถ์ ๊ธฐ๋ฅ์ ๋ฏธํฌํจ.)
-
๋ทฐ (์ ๋ถ ๋ผ์ด๋ธ ์ํ๋ง ํ์):
- ๋ก๋ด๋ณ ํฌ์ค(๋ฐฐํฐ๋ฆฌยท์ฐ๊ฒฐยทํ์ฌ ๋์ยท๊ณ ์ฅ ์ฝ๋)
- ํ์ฑ ์ธ์ ๋ชฉ๋ก(ํ์ฌ ๊ณต๊ฐ, ๋ง์ง๋ง ์ธํฐ๋์ ) โ ์ธ์ ์ข ๋ฃ ์ ๋ชฉ๋ก์์ ์ ๊ฑฐ
- ์ด๋ฒคํธ ์คํธ๋ฆผ ๋ผ์ด๋ธ ํ ์ผ (๋ฉ๋ชจ๋ฆฌ ring buffer, ๋์คํฌ ์ ์ฅ ์์)
- ์๋ฆผ: ๋ก๋ด fault, e-stop, LLM ๊ฑฐ๋ถ์จ ์๊ณ ์ด๊ณผ ์ ์ด์์ ์ฝ์ + ์ฌ์ด๋.
-
์๋จ: Grafana(๋ฉํธ๋ฆญ) + ์์ฒด React ๋์๋ณด๋(๋๋ฉ์ธ ๋ทฐ), Loki(๋ก๊ทธ), Prometheus(๋ฉํธ๋ฆญ).
- ๋ฉํธ๋ฆญ/๋ก๊ทธ๋ ์ด์์ฉ ๋จ๊ธฐ ๋ณด์กด (Prometheus ๊ธฐ๋ณธ 15d, Loki 7d ๋ฑ) โ ๋ถ์/ํต๊ณ ๋ชฉ์ ์๋.
๋ณธ ์ ์ ์ธํฐํ์ด์คยทDDL(Data Definition Language, ๋ฐ์ดํฐ ์ ์ ์ธ์ด)์ ์ถ์ ๋ฐ์ดํฐ ๋ชจ๋ธ์ด๋ค. ์ค์ ์ ์ฅ์ ยง3.1 ๋งคํ์ ๋ฐ๋ผ HA entityยทrecorder๊ฐ ๋ด๋นํ๋ค. DDL์ ๋ฐ์ดํฐ ํํ ๋ช ์ธ ์ฉ๋๋ก๋ง ์ฐธ๊ณ .
interface UserContext {
session_id: string; // ULID, PK
paired_tablet_id: string;
visual_embedding_ref: string; // ๋ฉ๋ชจ๋ฆฌ์ ID, ์ธ์
์ข
๋ฃ ์ ํ๊ธฐ (DB์ ์ ์ฅ ์ ํจ)
mood: "calm" | "excited" | "tired" | "neutral";
preferences: {
music_genre?: string;
drink?: string;
};
current_zone: ZoneId | null;
zone_history: { zone_id: ZoneId; entered_at: ISO8601; exited_at?: ISO8601 }[];
environmental: {
weather: { temp_c: number; condition: string };
time_of_day: "morning" | "afternoon" | "evening";
};
created_at: ISO8601;
updated_at: ISO8601;
ended_at: ISO8601 | null; // ์ธ์
์ข
๋ฃ ์๊ฐ, ๋ฏธ์ข
๋ฃ ์ null
}DDL:
CREATE TABLE sessions (
session_id TEXT PRIMARY KEY,
paired_tablet_id TEXT NOT NULL,
mood TEXT,
preferences TEXT, -- JSON
current_zone TEXT,
zone_history TEXT, -- JSON array
environmental TEXT, -- JSON
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
ended_at TEXT
);interface RobotState {
robot_id: string; // ๋ฐํ์์ config/robots.yaml ๋ ์ง์คํธ๋ฆฌ๋ก ๊ฒ์ฆ (ยง7.2)
capabilities: Capability[];
pose: { x: number; y: number; yaw: number; zone_id: ZoneId };
battery_pct: number;
current_action: { type: string; started_at: ISO8601; eta_s?: number } | null;
faults: Fault[];
connection: "online" | "degraded" | "offline";
updated_at: ISO8601;
}DDL:
CREATE TABLE robots (
robot_id TEXT PRIMARY KEY,
pose TEXT, -- JSON
battery_pct INTEGER,
current_action TEXT, -- JSON
faults TEXT, -- JSON
connection TEXT NOT NULL,
updated_at TEXT NOT NULL
);
capabilities๋ ์ ์ ์ด๋ผ DB์ ์ ์ฅํ์ง ์๊ณ ์ค์ ํ์ผ(YAML)๋ก ๊ด๋ฆฌ.
CloudEvents ํ์ค ์์ฒด์ ๋ํ ๋ฐฐ๊ฒฝ(CNCF ์กธ์ ํ์คยท์คํ์์คยท์ฐธ๊ณ ๋งํฌ)์ MQTT_SCHEMA.md ยง1 ์ฐธ์กฐ.
{
"specversion": "1.0",
"type": "vision.zone.enter",
"source": "/services/vision",
"id": "01HXYZ...",
"time": "2026-04-28T10:00:00Z",
"subject": "session/01HXYZ",
"data": { "session_id": "...", "zone_id": "cafe", "confidence": 0.97 }
}ํ๊ธฐ ๊ท์น: MQTT ํ ํฝ์ ์ฌ๋์(/) ๊ตฌ๋ถ, CloudEvents type ํ๋๋ ์ (.) ๊ตฌ๋ถ.
์) topic = vision/zone/enter โ CloudEvents type = vision.zone.enter.
์ ์ฒด ํ ํฝ ์นดํ๋ก๊ทธยทpayload ์คํค๋งยทQoS(Quality of Service, ์๋น์ค ํ์ง ๋ฑ๊ธ)๋ MQTT_SCHEMA.md ์ฐธ์กฐ.
์์ฝ:
-
vision/zone/enter,vision/zone/exit,vision/position/update tablet/{tablet_id}/{intent|show_options|show_message|ack}robot/{robot_id}/{command|state|ack|fault}-
session/start,session/end -
context/user/{session_id}/update,context/environmental/update -
safety/estop,safety/proximity system/heartbeat/{service}
LLM ๊ฒฐ์ ยท๊ฑฐ๋ถ๋ ๋ณ๋ ํ ํฝ ๋ฐํ ์์ด ๋ฉํธ๋ฆญ(Prometheus)๊ณผ ๋ก๊ทธ(Loki)๋ก๋ง ์ฒ๋ฆฌ.
CCTV โโโบ Vision Tracker
โ publish: vision/zone/enter (data: session=A, zone=cafe)
โผ
Event Bus
โ
โโโโโโโโโโดโโโโโโโโโ
โผ โผ
Context Store LLM Orchestrator
(zone update) โ assemble(context, zone_playbook)
โ Anthropic API call (with tools)
โผ
Tool Calls:
โข robot_command(spot-01, "look_at", target=session_A) [MCP]
โข show_options(tablet_A, ["์ปคํผ ์ถ์ฒ ๋ฐ๊ธฐ", "์์
๋ฃ๊ธฐ"]) [MCP]
โ
โโโโโโโโดโโโโโโโโ
โผ โผ
Robot Adapter Tablet Gateway
โ โ
โผ โผ
SPOT Tablet UI
- ์ฌ์ฉ์๊ฐ ํ๋ธ๋ฆฟ์์ ์ต์
์ ํ โ
tablet/{id}/intent์ด๋ฒคํธ. - LLM Orchestrator๊ฐ ์๋+ํ ์ปจํ ์คํธ ์ฌํ๊ฐ.
- Claude tool call โ orchestrator๊ฐ MCP๋ก
mcp-robot-adapter์robot_command๋๊ตฌ ํธ์ถ (MQTT ๋ฏธ๊ฒฝ์ ). - Robot Adapter: ์์ ์ธํฐ๋ก ๊ฒ์ฆ โ SPOT SDK ํธ์ถ โ ์คํ.
- 1Hz
robot/{id}/stateํ ๋ ๋ฉํธ๋ฆฌ๊ฐ ๋์๋ณด๋ยทํ๋ธ๋ฆฟ(action progress)์ผ๋ก ์ ํ.
ํด๋ฐฑ ๊ฒฝ๋ก: orchestrator/Claude๊ฐ ์๋ต ๋ชป ํ๋ ๊ฒฝ์ฐ HA ์๋ํ๊ฐ
robot/{id}/commandMQTT publish โ ๋์ผ ํ๋ก ์๋ ด. ์์ธํ ๊ฒฝ๋ก ์ ์ฑ ์ MQTT_SCHEMA.mdrobot/+/command์ฐธ์กฐ.
- ํ๊ฒฝ ์๋น์ค ๋๋ ์ฌ์ฉ์ ์
๋ ฅ์ผ๋ก
context/user/{session_id}/update๋ฐํ. - LLM Orchestrator๊ฐ ๋ณ๊ฒฝ๋ ์ปจํ ์คํธ๋ก zone playbook ์ฌํ๊ฐ.
-
tablet/{id}/show_options๋ฅผ ๊ฐฑ์ ๋ ์ต์ ์ผ๋ก ๋ค์ push.
| ํ๋กํ ์ฝ | ์ฉ๋ | ์ฌ์ฉ์ฒ |
|---|---|---|
| MQTT | ๋๋ฉ์ธ ์ด๋ฒคํธ ๋ฐฑ๋ณธ | ๋ชจ๋ ์๋น์ค โ Mosquitto |
| MCP (JSON-RPC over HTTP/SSE) | LLM ๋๊ตฌ ํธ์ถ |
orchestrator โ mcp-robot-adapter, orchestrator โ mcp-tablet-gateway
|
| HA REST | ์ปจํ ์คํธ ์กฐํยท์๋น์ค ํธ์ถ |
orchestrator โ HA /api/states/*, /api/services/*
|
| HA WebSocket | ์ํฐํฐ ๋ณ๊ฒฝ ๊ตฌ๋ |
orchestrator ๋๋ tablet-app โ HA /api/websocket
|
| WSS (์์ฒด) | ํ๋ธ๋ฆฟ ์๋ฐฉํฅ ์ฑ๋ |
tablet-app โ mcp-tablet-gateway
|
| HTTP | UI ์ ๊ทผ | ์ด์์ PC โ HA Lovelace(8123), Frigate UI(5000), Grafana(3000) |
| RTSP | ์นด๋ฉ๋ผ ์ ๋ ฅ | CCTV โ Frigate(detect) / CCTV โ cctv-relay(๋ผ์ด๋ธ) |
| WebRTC (WHEP ์๊ทธ๋๋ง + SRTP ๋ฏธ๋์ด) | ๋ธ๋ผ์ฐ์ CCTV ๋ผ์ด๋ธ ์์ (์ ์์ฅ ํ์ ) | ๋ธ๋ผ์ฐ์ โ cctv-relay(go2rtc, ๋
๋ฆฝ ์๋น์ค); ์๊ทธ๋๋ง์ tablet-fe BFF ๊ฒฝ์ โ ยง8.4 |
| ๋ก๋ด SDK ์ ์ฉ | ๋ก๋ด ์ ์ด |
mcp-robot-adapter โ SPOT(bosdyn-client/gRPC) / ๋ฏธ์ ๋ก๋ด |
๋ด๋ถ ์๋น์ค ๊ฐ gRPC๋ ์ฌ์ฉํ์ง ์๋๋ค. SPOT SDK๊ฐ ๋ด๋ถ์ ์ผ๋ก gRPC๋ฅผ ์ฐ์ง๋ง, ์ฐ๋ฆฌ ์ฝ๋ ๊ฒฝ๊ณ์์
bosdyn-clientPython API๋ง ๋ ธ์ถ๋๋ฏ๋ก ์ง์ ๋ค๋ฃจ์ง ์์. WebRTC ๋ผ์ด๋ธ ์์์ ๋ช ์์ ์์ธ๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ RTSP๋ฅผ ์ง์ ๋ชป ๋ฐ์ผ๋ฏ๋ก ๋ ๋ฆฝcctv-relay(go2rtc)๋ฅผ ๋๋ค โ ์ ์์ฅ LANยทread-only ํ์ ์ ๋ณ๋ ๋ฏธ๋์ด ํ๋ฉด์ด๋ฉฐ, MQTT ์ด๋ฒคํธ ๋ฐฑ๋ณธยท๋ก๋ด ๋ช ๋ น ๊ฒฝ๋ก์ ๋ฌด๊ดํ๋ค(ยง8.4).
- MQTT (QoS 1): ๋ชจ๋ ๋๋ฉ์ธ ์ด๋ฒคํธ์ ๋จ์ผ ๋ฒ์ค. ๋ชจ๋ ๋ฉ์์ง๋ ํ๋ฐ์ฑ์ผ๋ก ์ฒ๋ฆฌ โ ์์ ์ ์ฅ์ด๋ ์ฌ์ฒ๋ฆฌ๋ ๋ณธ ๋จ๊ณ์์ ์ ๊ณตํ์ง ์์.
- ์ถํ ํต๊ณยท์ฌ์ฒ๋ฆฌ ์๊ตฌ๊ฐ ์๊ธฐ๋ฉด MQTT ๊ตฌ๋ ์๋ก ๋ณ๋ archiver ์๋น์ค๋ฅผ ์ถ๊ฐํ๋ ํํ๋ก ์ ์ง ๋์ (ํ ์์ ๋ฒ์ ์ธ).
-
bosdyn-client(Python) ๊ธฐ๋ฐ, e-stop์ SDK์ EstopClient ์ฌ์ฉ. - ๋ช
๋ น์
RobotCommandClient๋ก ์ ์ก, async future๋ก ์๋ฃ ๋๊ธฐ. - ์์ธยท๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์ฌ์ ์ ์ ์๋ ํ๋ ํ๋ฆฌ์
(์:
wave,sit_and_look)์ capability๋ก ๋ ธ์ถ.
- ROS2
Humble๊ธฐ๋ฐ ์ถ์ํ๋ฅผ ์ฐ์ ๊ฐ์ . ๊ฒฐ์ ์์ ์ ๋ค์ ๋งคํธ๋ฆญ์ค๋ก ํ๊ฐ:- SDK ์์ ์ฑ, ์ค์๊ฐ ์ ์ด latency, ์นด๋ฉ๋ผ/์ผ์ ๋ ธ์ถ, ์์ ๊ธฐ๋ฅ(e-stop, bumper).
- ์ด๋ํฐ ๊ตฌํ ์ SPOT๊ณผ ๋์ผํ Capability Model์ ๋ง์กฑํ๋๋ก ๊ฐญ(gap) ๋ถ์.
ํ์ฌ ๋ฌธ์ยท์คํค๋ง๋ robot-02๋ฅผ placeholder๋ก ์ฌ์ฉํ๋, ๊ฒฐ์ ํ ๋ณ๊ฒฝ ๋น์ฉ์ ์ต์ํํ๊ธฐ ์ํด:
-
literal ์ฌ์ฉ ์ต์ํ:
RobotIdํ์ ์ strict literal("spot-01" | "robot-02")์ด ์๋ string + ๋ฐํ์ ๊ฒ์ฆ์ผ๋ก ๋ณ๊ฒฝ.type RobotId = string; // ๋ฐํ์์ ROBOT_REGISTRY๋ก ๊ฒ์ฆ
-
๋จ์ผ ์์ค ๋ ์ง์คํธ๋ฆฌ:
config/robots.yaml์ ๋ชจ๋ ๋ก๋ด ์ ์:robots: spot-01: model: boston_dynamics_spot capabilities: [goto, follow, stop, sit, stand, gesture, look_at] max_velocity_mps: 1.6 spot-02: # ๊ฒฐ์ ํ ์ค์ ID๋ก ๊ต์ฒด model: <vendor>_<model> capabilities: [...]
-
๊ฒ์ฆ ์์น:
- orchestrator: Claude tool ํธ์ถ ์
robot_id๊ฐ ๋ ์ง์คํธ๋ฆฌ์ ์๋์ง ํ์ธ. - mcp-robot-adapter: ์์ ์ ๋ ์ง์คํธ๋ฆฌ ๋ก๋ + ์ด๋ํฐ ์ธ์คํด์ค ์์ฑ.
- guardrail: ํ์ดํธ๋ฆฌ์คํธ๋ ๋ ์ง์คํธ๋ฆฌ์์ ๋์ ์์ฑ.
- orchestrator: Claude tool ํธ์ถ ์
-
๋ณ๊ฒฝ ์ ์ํฅ ๋ฒ์:
-
config/robots.yamlํธ์ง (1๊ณณ). -
mcp-robot-adapter์ ์ ์ด๋ํฐ ํด๋์ค ์ถ๊ฐ (adapters/<vendor>.py). - ์บ๋ฆฌ๋ธ๋ ์ด์ (ยง8.3.2) ์ํ.
- HA ์ํฐํฐ ์๋ ๋ฑ๋ก (MQTT Discovery)์ด๋ผ ๋ณ๋ ์์ ๋ถํ์.
-
- ํ์ง ๋ง ๊ฒ: ์ฝ๋ยทpromptยทํ ์คํธ fixture์ robot_id๋ฅผ literal๋ก ๋ฐ์๋ฃ์ง ๋ง ๊ฒ. ํญ์ ๋ ์ง์คํธ๋ฆฌ ์กฐํ.
์ฒดํ์๋ ๋์ ์ต๋ 3๋ช , ๋ก๋ด์ 2๋. ์์ ๊ฒฝํฉ์ด ๋ฐ์ํ๋ ๋ ๊ฒฝ์ฐ์ ์ ์ฑ :
-
mcp-robot-adapter์ ๋จ์ผ priority queue๋ก ์ง๋ ฌํ. - ์ฐ์ ์์:
safety>operator(HA) >llm(orchestrator). - ๋์ผ priority ๋ด: FIFO + ๋ค์ ๊ท์น์ผ๋ก redundant ๋ช
๋ น dedupe:
- ๋์ผ robot_id + ๋์ผ capability + ์ธ์ ์ฐจ์ด < ์๊ณ๊ฐ (์: goto ์ขํ < 0.3m) โ ํํ ๋ช ๋ น์ ์ ํ์ ๋์ฒด (ํ์ 1๊ฐ๋ง ์ ์ง).
-
stop์ ๋๊ธ ๋ช ๋ น ์์ผ๋ฉด ์ฆ์ ์คํ (ํ ์์ผ๋ก ์ด๋).
-
expires_at๋ง๋ฃ ์ ์๋ ํ๊ธฐ.
- ์๋๋ฆฌ์ค: ์ฌ์ฉ์ A๊ฐ ์นดํ์ ์๊ณ B๊ฐ ๊ณต์์ ๋ค์ด์ด โ SPOT์ ํ ๋ช ๋ง ์๋ ๊ฐ๋ฅ.
-
์ธ์
๋จ์ ์ ๊ธ (orchestrator):
- ๋ก๋ด์ด ์ด๋ค ์ธ์
์ ์๋ ์ค์ธ์ง
attached_session: spot-01 โ session_A๋ฅผ in-memory + HAsensor.spot_01_attached_session์ ๊ธฐ๋ก. - ์ฌ์ฉ์ A ์๋ ์ค ์ฌ์ฉ์ B์ ํธ๋ฆฌ๊ฑฐ ๋์ฐฉ ์:
- ์ ํ 1 (์ ์ฑ ๊ธฐ๋ณธ): ๋ค๋ฅธ ๋ก๋ด(robot-02)์ผ๋ก ์๋ โ orchestrator์ ๋๊ตฌ ํธ์ถ์์ ๊ฐ์ฉ ๋ก๋ด ํ ์กฐํ ํ ๊ฒฐ์ .
- ์ ํ 2: ๋ชจ๋ ๋ก๋ด์ด ์ ์ ์ค์ด๋ฉด B๋ ํ๋ธ๋ฆฟ ์ธํฐ๋์ ๋ง (๋ก๋ด ์์ด ์ต์ ยท๋ฉ์์ง) + "๊ณง ๋ก๋ด์ด ํฉ๋ฅํ ์์ " ์๋ด.
- ์๋ ์ข ๋ฃ (์ฌ์ฉ์๊ฐ zone exit ๋๋ ๋ช ์์ ๋)์ attached_session=null๋ก ํด์ .
- ๋ก๋ด์ด ์ด๋ค ์ธ์
์ ์๋ ์ค์ธ์ง
-
attached_session์ ๋ณด๋ orchestrator์ ์์คํ ํ๋กฌํํธ์ ํฌํจ โ Claude๊ฐ ๊ฐ์ฉ ๋ก๋ด๋ง ์ ํํ๋๋ก ์ ๋.
- LangGraph๋ ์ธ์คํด์ค๊ฐ statelessํ๋ฏ๋ก ์ด๋ฒคํธ ๋จ์ ๋์ ์คํ OK (asyncio).
-
์ ๊ธ ๋จ์๋
(session_id, zone_id)โ ๊ฐ์ ์ฌ์ฉ์(session)๋ผ๋ ๋ค๋ฅธ zone์ด๋ฉด ๋ณ๋ ฌ ์คํํ๋ค. ๊ฐ zone์๋ ์ ์ฉ ๋ก๋ด์ด ๋ฐฐ์น๋๋ฏ๋ก(์:park=spot-01,home=kaist-01), ํ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ์์ญ์์ ์๋ก ๋ค๋ฅธ ๋ก๋ด์ ๋ ๋ฆฝ ๋์์ ๋์์ ๋ฐ์ ์ ์๋ค. ์ง๋ ฌํ๋ ๊ฐ์(session, zone)์ ๋ํด์๋ง ์ ์ฉ โ ๊ฐ์ ๋ก๋ด์ ๋ชจ์๋ ๊ฒฐ์ ์ด ๋์์ ๊ฐ๋ ๊ฒ์ ๋ฐฉ์ง.# ์ ๊ธ ํค: (session_id, zone_id) โ ๋ค๋ฅธ zone(=๋ค๋ฅธ ๋ก๋ด)์ด๋ฉด ๋ณ๋ ฌ ํ์ฉ zone_locks: dict[tuple[str, str], asyncio.Lock] = defaultdict(asyncio.Lock) async def handle(event): key = (event["session_id"], event["zone_id"]) async with zone_locks[key]: await flow.ainvoke(...)
โ ๏ธ ๋ฉํฐ ๋ก๋ด ๋ณ๋ ฌ ๋์์ ๊ทผ๊ฑฐ ๊ฒฐ์ . ์ฌ์ฉ์๊ฐ ์ค์ธ(park)์ ์์ด๋ ์ค๋ด(home)์ ๋๋ฐ์ํฉ์ ๋ฐ๋ผ ํด๋น ์์ญ ๋ก๋ด์ด ์ฆ์ ๋ฐ์ํด์ผ ํ๋ค โ ๊ทธ๋์ same-session cross-zone์ ์ง๋ ฌํํ์ง ์๋๋ค. ๋จ ๊ฐ์ robot์ ๋ํ ๋ช ๋ น ์์ยท์ถฉ๋ ๋ฐฉ์ง๋ ๋ณ๊ฐ ๋ณด์ฅ์ผ๋ก, ยง7.3.A์mcp-robot-adapter๋จ์ผ priority queue๊ฐ ์ฑ ์์ง๋ค(์ ๊ธ ๋จ์์ ๋ฌด๊ด). -
session ์๋ช
์ฃผ๊ธฐ ์ด๋ฒคํธ(
session/endSCRUB ยง11.3)๋ zone ๋ฌด๊ด โ ๋ชจ๋(session, *)์ ๊ธ์ ๊ฐ๋ก์ง๋ฅด๋ ๋ฐฐ๋ฆฌ์ด๋ก ์ฒ๋ฆฌํด ์์ฌ ๊ฒฐ์ ๊ณผ ๊ฒฝํฉํ์ง ์๊ฒ ํ๋ค.
- ๋์ 3๋ช ์ ๊ฐ์ฅ ๋๋ฆฐ path latency๋ ๊ทธ๋๋ก < 1.5s ์ ์ง (LLM ํธ์ถ ๋ณ๋ ฌ + Anthropic API rate limit ์ฌ์ ).
- Anthropic API ํธ์ถ ๋์์ฑ ํ๊ณ๋
max_concurrent: 5๋ก ์์ ๋ง์ง ํ๋ณด.
- Hardware e-stop: ์ด์์ ๋ฌผ๋ฆฌ ๋ฒํผ โ ๋ชจ๋ ๋ก๋ด ์ฆ์ ์ ์ง.
- Software fence: zone polygon ์ธ๋ถ ์ขํ ๋ช ๋ น ๊ฑฐ๋ถ.
- Proximity guard: vision tracker๊ฐ ๋ฐํํ๋ ์ฌ์ฉ์-๋ก๋ด ๊ฑฐ๋ฆฌ < ์๊ณ ์ ๋ชจ๋ ์ด๋ ๋ช ๋ น ์ผ์ ์ฐจ๋จ.
- Watchdog: ๋ก๋ด ํ ๋ ๋ฉํธ๋ฆฌ ๋๊น > 2s โ ์๋ stop ๋ช ๋ น.
- ๊ฐ ๊ณต๊ฐ ์ต์ 2๋(๊ฒน์น๋ ์์ผ๊ฐ์ผ๋ก ์ ์ ๊ฒ์ฆ), ์ฒ์ฅ + ์ฌ์ ์กฐํฉ.
- ๊ณต๊ฐ ๊ฐ ์ ์ด ์์ญ์ 1๋์ฉ(re-id ์ ํ๋ ํฅ์).
- Detection: YOLOv8m TensorRT.
- Tracking: ByteTrack (single cam).
- Re-ID: OSNet ์๋ฒ ๋ฉ + Hungarian matching across cams.
- ์ธํ๋ผ: NVIDIA Jetson AGX Orin ร n (์นด๋ฉ๋ผ ๊ทธ๋ฃน๋ณ) ๋๋ ๋จ์ผ GPU ์๋ฒ + DeepStream.
๋ณธ ์์คํ ์๋ 3๊ฐ์ ์ขํ๊ณ๊ฐ ๊ณต์กดํ๋ฉฐ, ๋ชจ๋ ๋ช ์์ ๋ณํ์ ํตํด ๋งคํ๋๋ค.
| ์ขํ๊ณ | ๋จ์ | ์ฌ์ฉ ์์น |
|---|---|---|
| Camera pixel | px (u, v) | Frigate ์ ๋ ฅยทzone polygon |
| World plane (์ ์์ฅ ํ๋ฉด) | meters (x, y) | bridge๊ฐ ๋ฐํํ๋ vision/* payload, zone polygon (world), HA picture-elements |
| Robot odom frame | meters (x, y, yaw) | ๋ก๋ด SDK ํธ์ถ (SPOT goto, ROS2 /cmd_vel) |
- ์ ์์ฅ ๋ฐ๋ฅ์ ArUco ๋ง์ปค 4๊ฐ ์ด์์ ์๋ ค์ง world ์ขํ(์:
(0,0),(5,0),(0,3),(5,3)m)์ ๋ฐฐ์น. - ๊ฐ ์นด๋ฉ๋ผ๊ฐ ๋ง์ปค๋ฅผ ๋ชจ๋ ์ดฌ์ํ ์ ์๋๋ก ์์นยท๊ฐ๋ ์กฐ์ .
- OpenCV
cv2.findHomography๋ก ์นด๋ฉ๋ผ๋ณ 3x3 ํ๋ ฌ H_c ์ฐ์ถ. - ๊ฒฐ๊ณผ๋ฅผ
config/calibration/cameras.yaml์ ์ ์ฅ:cafe_cam_01: homography: [[h11, h12, h13], [h21, h22, h23], [h31, h32, h33]] calibrated_at: 2026-04-30T10:00:00Z
-
bridge์๋น์ค๊ฐ ์์ ์ ์ด ํ์ผ์ ๋ก๋ํ์ฌ ํฝ์ โ world ๋ณํ์ ์ฌ์ฉ.
- ๋ก๋ด์ world ์์ (
(0,0))์ ๋ฐฐ์น ํbodyframe yaw=0 ์์ธ๋ก ์ ๋ ฌ. - ๋ก๋ด SDK์์ odom frame์ ํ์ฌ pose๋ฅผ ์บก์ฒ โ
T_odom_to_world4x4 ๋ณํ ํ๋ ฌ ์ฐ์ถ. - ๊ฒฐ๊ณผ๋ฅผ
config/calibration/robots.yaml์ ์ ์ฅ:spot-01: odom_to_world: translation: [tx, ty, 0] yaw: theta calibrated_at: 2026-04-30T11:00:00Z
-
mcp-robot-adapter๊ฐ ์์ ์ ๋ก๋. orchestrator๊ฐ world ์ขํ๋ก ๋ช ๋ นํ๋ฉด ์ด๋ํฐ๊ฐ odom์ผ๋ก ๋ณํ ํ SDK ํธ์ถ. - ๋ก๋ด์ด ์ถฉ์ ๋ํฌ ๋ฑ์ผ๋ก odom ๋์ ์ค์ฐจ ๋ฐ์ ์: ๋ํฌ ์์น๋ฅผ world ๊ธฐ์ค์ ์ผ๋ก ๋๊ณ ๋ํฌ ์ง์ ์๋ง๋ค ์๋ ์ฌ๊ต์ .
-
config/zones.yaml์ world ์ขํ๋ก polygon ์ ์ (๋จ์ผ ์ง์ค ๊ณต๊ธ์):zones: cafe: polygon_world: [[0,0], [5,0], [5,3], [0,3]] # meters park: [[5,0], [10,0], [10,3], [5,3]] vehicle: [[0,3], [5,3], [5,6], [0,6]] home: [[5,3], [10,3], [10,6], [5,6]]
- ๋น๋ ์์ ์ ๋ณํ ์คํฌ๋ฆฝํธ (
scripts/gen-frigate-zones.py)๊ฐ:- ์นด๋ฉ๋ผ๋ณ H_cโปยน๋ก world polygon โ camera pixel polygon ๋ณํ
- Frigate
config.yml์zones.<name>.coordinates๋ฅผ ์๋ ์์ฑ
- ์ด๋ก์จ zone ์ ์๊ฐ ํ ๊ณณ์๋ง ์กด์ฌ โ ๋ณ๊ฒฝ ์ Frigateยท๋ก๋ด ์์ชฝ ๋์ ๊ฐฑ์ .
- ์นด๋ฉ๋ผ ์์น ๋ณ๊ฒฝ ์: ํด๋น ์นด๋ฉ๋ผ๋ง ยง8.3.1 ์ฌ์คํ.
- ์ ์์ฅ floor plan ์ขํ ์์ ์ด๋ ์: ๋ชจ๋ ์นด๋ฉ๋ผยท๋ก๋ด ์ฌ์บ๋ฆฌ๋ธ๋ ์ด์ .
- ๋ก๋ด fault ํ odom ๋์ ์ค์ฐจ ์์ฌ ์: ยง8.3.2 ์ฌ์คํ (๋ํฌ ์๋ ์ฌ๊ต์ ์ผ๋ก ์ผ์ ์ด์ ์ค์๋ ๋ถํ์).
- Frigate ์์ฒด UI์ zone editor ๋ด์ฅ โ ์ด์ ์ค ๋ฏธ์ธ ์กฐ์ ์ ์ฌ์ฉ.
- ๋จ ยง8.3.3 ๋จ์ผ ์์ค๋ฅผ ๊นจ์ง ์๋๋ก ํธ์ง ๊ฒฐ๊ณผ๋
config/zones.yaml์ ์ญ๋ณํฉ ํ ์ฌ์์ฑ.
โ ๏ธ ์ ์์ฅ ์ ์ฉ(๋น๊ณต๊ฐยทLAN) ์์ธ. ๋ธ๋ผ์ฐ์ ๋ RTSP๋ฅผ ์ง์ ์ฌ์ํ ์ ์๋ค(raw TCP/UDP socket ๋ถ๊ฐ). CCTV ๋ผ์ด๋ธ ์์์ ํ๋ฉด์ ๋์ฐ๋ ค๋ฉด RTSP๋ฅผ ๋ธ๋ผ์ฐ์ ํธํ ์ ์ก์ผ๋ก ๋ณํํด ์ค๊ฐ์์ ์ ๋ฌํ๋ ์ค๊ณ์๋ฒ(relay) ๊ฐ ๋ฐ๋์ ํ์ํ๋ค. ๋ณธ ์์คํ ์ ์ด๋ฅผ ๋ ๋ฆฝ ์๋น์คcctv-relay(go2rtc ๊ธฐ๋ฐ) ๋ก ๋๋ค โ Frigate(detect/์ด๋ฒคํธ)์ ๋ถ๋ฆฌํด ๋ผ์ด๋ธ ์์๋ง ์ฑ ์์ง๋ค. ์ด๋ ยง6.1์ "๋ด๋ถ ์๋น์ค ๊ฐ HTTP/gRPC ๊ธ์ง" ๋ถ๋ณ์์ ๋ผ์ด๋ธ ์์(read-only) ํ์ ์ผ๋ก ์๋์ ์ผ๋ก ์ํํ ๊ฒ์ด๋ฉฐ, MQTT ์ด๋ฒคํธ ๋ฐฑ๋ณธยท๋ก๋ด ๋ช ๋ น๊ณผ ๋ฌด๊ดํ ๋ณ๋ ๋ฏธ๋์ด ํ๋ฉด(media plane) ์ด๋ค. ์์ ๋ณธ์ฒด๋ ๋์คํฌ์ ๋จ๊ธฐ์ง ์๋๋ค(ยง11.3, ๋ นํยท์ค๋ ์ท ๋ฏธ์ฌ์ฉ โ ๋ผ์ด๋ธ ํต๊ณผ๋ง). ์๋น์คยท์ค์ ์์ธ๋ SERVICES.md ยง2.5.
| ๋ฐฉ์ | ์ง์ฐ(latency) | ๋ธ๋ผ์ฐ์ ํธํ | ์ฑํ |
|---|---|---|---|
| WebRTC (WHEP) | ~0.2โ0.5s | ์ ๋ธ๋ผ์ฐ์ (H.264๋ง, HEVC ๋ถ๊ฐ) | 1์์ โ ๋ผ์ด๋ธ ๋ชจ๋ํฐ๋ง ์ต์ |
| MSE (fMP4 over WS) | ~0.5โ1.5s | Chrome/Edge/FF (iOS Safari ์ ์ฝ) | ํด๋ฐฑ |
| LL-HLS / HLS | ~2โ4s / 6โ20s | ์ ๋ธ๋ผ์ฐ์ (iOS ๋ค์ดํฐ๋ธ) | ์ง์ฐ ๊ณผ๋ค โ ๋ฏธ์ฑํ |
| JSMpeg (MPEG-TS over WS) | ~1s | ์ ๋ธ๋ผ์ฐ์ | JS ๋์ฝ๋ฉยท๋ฌด์ค๋์คยท์ ํจ์จ โ ๋ฏธ์ฑํ |
RTSP (n๊ฐ ์์ค, config ๊ตฌ๋)
โโโโโโโโโโ โโโโโโโโโโโโโโโโบ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ CCTV n โ โ 1 (go2rtc, ๋
๋ฆฝ) โ
โโโโโโโโโโ โ config/cctv-relay.yaml ์ โ
โ streams ๋งต โ ์๋ ๋ฑ๋กยท์ฐ๊ฒฐ โ
โ RTSP โ WebRTC/MSE restream โ
โโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโ
โ โ WHEP ์๊ทธ๋๋ง (SDP offer/answer, HTTP)
โ ๋ธ๋ผ์ฐ์ โ tablet-fe BFF(same-origin) โ cctv-relay
โโโโโโโโโโโโโโโโโโโโ โ
โ ๋ธ๋ผ์ฐ์ โ โโโโโโโโโโโโโโโโโ
โ (tablet-fe ํ๋ฉด) โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโบ cctv-relay
โโโโโโโโโโโโโโโโโโโโ โก ๋ฏธ๋์ด(SRTP)๋ ICE๋ก ๋ธ๋ผ์ฐ์ โ cctv-relay ์ง์ (P2P)
-
n-stream config ๊ตฌ๋: ์นด๋ฉ๋ผ ์์ค๋
config/cctv-relay.yaml์streams:๋งต์ ์๋ณธ RTSP ์ฃผ์๋ฅผ ํ ์ค ์ถ๊ฐํ๋ฉด ์๋ ๋ฑ๋กยท์ฐ๊ฒฐ๋๋ค(์ฝ๋ ๋ณ๊ฒฝ ๋ถํ์). n๋ ํ์ฅ = ํญ๋ชฉ n๊ฐ. ์ค์ ยท์์ฑ ์คํฌ๋ฆฝํธ๋ SERVICES.md ยง2.5. -
์๊ทธ๋๋ง(โ ): ๋ธ๋ผ์ฐ์ ๋ RTSP ์๊ฒฉ์ฆ๋ช
ยทrelay ์ฃผ์๋ฅผ ๋ชจ๋ฅธ ์ฑ, same-origin์ผ๋ก tablet-fe BFF(
/api/cctv/webrtc/<cam>)์ WHEP offer(SDP)๋ฅผ ๋ณด๋ธ๋ค. BFF๊ฐ cctv-relay API(/api/webrtc?src=<cam>)๋ก ํ๋ก์ํ๊ณ answer(SDP)๋ฅผ ๋๋ ค์ค๋ค. ์นด๋ฉ๋ผ ์๊ฒฉ์ฆ๋ช ์ cctv-relay(์๋ฒ)๋ง ๋ณด์ โ ๋ธ๋ผ์ฐ์ ๋ฒ๋ค์ ๋ ธ์ถ๋์ง ์๋๋ค(๊ธฐ์กด CCTV SSE ๋ธ๋ฆฌ์ง์ ๋์ผํ ์๊ฒฉ์ฆ๋ช ๊ฒฉ๋ฆฌ ์์น). - ๋ฏธ๋์ด(โก): SDP ํ์ ํ ์์(SRTP)์ ๋ธ๋ผ์ฐ์ โ cctv-relay ๊ฐ ICE๋ก ์ง์ (P2P) ํ๋ฅธ๋ค. Node BFF๋ ์๊ทธ๋๋ง๋ง ์ค๊ณํ๊ณ ๋ฏธ๋์ด๋ ๊ฑฐ์น์ง ์๋๋ค(Node๊ฐ SRTP๋ฅผ relayํ์ง ์์ โ BFF ๋ถํยท์ง์ฐ ํํผ).
- LAN ํ์ โ STUN/TURN ๋ถํ์: cctv-relay๊ฐ host candidate(์ ์์ฅ LAN IP:8555)๋ง ๊ด๊ณ ํ๋ฉด ์ถฉ๋ถํ๋ค. ๊ณต๊ฐ ์๋น์ค ์ ํ ์์๋ง TURN์ ๊ฒํ ํ๋ค.
- RTSP pull ํ ํด๋ก์ง: ๊ธฐ๋ณธ์ cctv-relay๊ฐ ์นด๋ฉ๋ผ์์ ๋ ๋ฆฝ pull(Frigate detect์ ๋ถ๋ฆฌ โ ์ฅ์ ๊ฒฉ๋ฆฌ). ์นด๋ฉ๋ผ ๋์ ์ฐ๊ฒฐ ์ ํ์ด ๋นก๋นกํ๋ฉด ๋จ์ผ-pull ๋ณํ ๊ฐ๋ฅ(ํธ๋ ์ด๋์คํ๋ SERVICES.md ยง2.5).
- WebRTC๋ H.264๋ง ์ค์ง ์ง์(HEVC/H.265 ๋ถ๊ฐ). ์นด๋ฉ๋ผ๊ฐ H.265 ์ก์ถ์ด๋ฉด go2rtc์์ H.264 transcode๊ฐ ํ์ โ CPU/GPU ๋น์ฉ ๋ฐ์. ๋์
์
ffprobe rtsp://...๋ก ์ฝ๋ฑ ํ์ธ์ด ์ ๊ฒฐ. - ์ค๋์ค๋ WebRTC ํธํ(OPUS/PCMU)์ผ๋ก transcode๊ฐ ํ์ํ๋, CCTV ๋ชจ๋ํฐ๋ง์ ํต์ ์ค๋์ค ๋นํ์ฑ์ผ๋ก ๋๋ค.
- WebRTC ํ์ ์คํจ(์ฝ๋ฑยทICE) ์ MSE(fMP4 over WS) ๋ก ํด๋ฐฑ โ ์ตํ HLS.
- ์ด์์ ์ฝ์์ Frigate ์์ฒด UI(
:5000)๋ก๋ ๋ผ์ด๋ธ ํ์ธ ๊ฐ๋ฅ(ยง6.1).
๋น์ ์ ์ ์์ฅ Physical AI์ ๊ฒฐ์ ์์ง์ด๋ค.
์
๋ ฅ: ์ฌ์ฉ์ ์ปจํ
์คํธ, ๊ณต๊ฐ ์ํ, ๋ก๋ด ์ํ, zone playbook.
์ถ๋ ฅ: ๋๊ตฌ ํธ์ถ๋ง (์์ฐ์ด ์๋ต ๊ธ์ง, ๋จ show_message์ ์ธ์๋ก๋ ํ์ฉ).
์ ์ฝ: capability ํ์ดํธ๋ฆฌ์คํธ, zone ๊ฒฝ๊ณ, robot fault ์ ํด๋น ๋ก๋ด ๋ช
๋ น ๊ธ์ง.
{
"name": "robot_command",
"input_schema": {
"type": "object",
"properties": {
"robot_id": { "type": "string" }, // ๋ฐํ์์ config/robots.yaml ๋ ์ง์คํธ๋ฆฌ๋ก ๊ฒ์ฆ
"capability": { "enum": ["goto", "follow", "stop", "gesture", "look_at"] },
"params": { "type": "object" }
},
"required": ["robot_id", "capability"]
}
}- LLM ํธ์ถ์ latency, ๊ฑฐ๋ถ์จ, ํ ํฐ ์ฌ์ฉ๋์ Prometheus ๋ฉํธ๋ฆญ์ผ๋ก๋ง ์์ง.
- ๊ฐ๋๋ ์ผ์์ ๊ฑฐ๋ถ๋ ํธ์ถ์ ๊ตฌ์กฐํ ๋ก๊ทธ(Loki, ๋จ๊ธฐ ๋ณด์กด)์ ํ ์ค์ฉ ๊ธฐ๋ก โ ์ด์ ์ค ๋๋ฒ๊น ์ฉ๋.
- ํธ์ถ ๋ณธ๋ฌธ(input/response ์ ๋ฌธ)์ ์์ ์ ์ฅํ์ง ์์ โ ํต๊ณยทํ๋ ๋ชฉ์ ์ ๋ณด๊ด์ ๋ณธ ๋จ๊ณ ๋ฒ์ ์ธ.
- LLM ํธ์ถ ์คํจ/ํ์์์ โ zone playbook์ ์ ์ ๋ํดํธ ์๋๋ฆฌ์ค(rule-based)๋ก ํด๋ฐฑ.
- ๋์ผ zone์์ N์ด ๋ด LLM ํธ์ถ dedup (debounce).
| ์ ํธ | ๋๊ตฌ | ํต์ฌ ์งํ |
|---|---|---|
| ๋ฉํธ๋ฆญ | Prometheus + Grafana | latency p95/p99, LLM ๊ฑฐ๋ถ์จ, ๋ก๋ด fault ํ์ |
| ๋ก๊ทธ | Loki | ๊ตฌ์กฐํ JSON ๋ก๊ทธ, trace_id ์ ํ |
| ํธ๋ ์ด์ฑ | OpenTelemetry โ Tempo | visionโbusโllmโrobot ์ ์ฒด ํธ๋ ์ด์ค |
๋ชจ๋ ๊ด์ธก ์ ํธ๋ ์ด์ ๋๋ฒ๊น ์ฉ ๋จ๊ธฐ ๋ณด์กด. ๋ถ์ยทํต๊ณยท์ฌ์ฒ๋ฆฌ๋ฅผ ์ํ ์ด๋ฒคํธ ledger๋ ๋ณธ ๋จ๊ณ์ ํฌํจํ์ง ์์.
์๋ฆผ ์ ์ฑ :
- ๋ก๋ด offline > 10s โ P1
- LLM ๊ฑฐ๋ถ์จ 5๋ถ ํ๊ท > 10% โ P2
- ๋น์ ์ถ์ ์ ๋ขฐ๋ ํ๊ท < 0.85 (5๋ถ) โ P2
- ์ ์์ฅ ๋ด๋ถ LAN์ ์ธ๋ถ์ ๋ถ๋ฆฌ (Anthropic APIยทghcr.io outbound๋ง ํ์ฉ).
- ๋ก๋ด ์ ์ด ํธ๋ํฝ์ ๊ฐ๋ฅํ๋ฉด ๋ณ๋ VLAN(Virtual Local Area Network, ๊ฐ์ ๋ก์ปฌ ๋คํธ์ํฌ)(ํ๋ธ๋ฆฟยท๊ด๋๊ฐ Wi-Fi์ ๋ถ๋ฆฌ).
-
TLS ์ ์ฉ ๋ฒ์ (๋จ์ผ ์ฌ์ดํธยทํ ๋ก์ปฌ ์ด์ ๊ธฐ์ค):
- ํ์: ์ธ๋ถ ๋ ธ์ถ๋๋ ์ธํฐํ์ด์ค โ Cloudflare Tunnel/Tailscale ํตํ ์๊ฒฉ ์ด์์ ์ ๊ทผ(HAยทGrafana), ํ๋ธ๋ฆฟ โ tablet-gateway WSS(์์ฒด ์ธ์ฆ์ ๋๋ LAN ๋ด๋ถ์์ wss ์๋ต ํ์ฉ).
- ์ ํ: ๋ด๋ถ LAN ํ์ ํต์ ์ user/password + ACL(Access Control List, ์ ๊ทผ ์ ์ด ๋ชฉ๋ก)๋ก ์ถฉ๋ถ (mosquitto, MCP, HA REST). mTLS(mutual TLS, ์ํธ ์ธ์ฆ TLS)๋ ์ด์ ๋ถ๋ด ๋๋น ํจ์ต ๋ฎ์.
- ์์คํ ๊ฒฉ์ ์: ๋ค์ค ์ฌ์ดํธ๋ก ํ์ฅํ๊ฑฐ๋ ์ธ๋ถ ๋ ธ์ถ ๋ฉด์ ์ด ๋๋ฉด ๋ชจ๋ ์๋น์ค ๊ฐ mTLS ๋์ ์ฌ๊ฒํ .
- ์์ฒด ์๋น์ค(orchestrator/bridge/...)๋ ๋ชจ๋ ๋ณ๋ ๋น-root uid๋ก ์คํ (Dockerfile
USER).
- ํ๋ธ๋ฆฟ: ๋๋ฐ์ด์ค ์ธ์ฆ์ + ์ธ์ ํ์ด๋ง ํ ํฐ.
- ์ด์์ ๋์๋ณด๋: SSO(Single Sign-On, ๋จ์ผ ๋ก๊ทธ์ธ ์ธ์ฆ) + RBAC(Role-Based Access Control, ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด) (์ด์์/๊ด๋์ ๊ถํ ๋ถ๋ฆฌ).
-
์๋ฒ ๋ฉ ํ๊ธฐ ํธ๋ฆฌ๊ฑฐ: ๋ณ๋ SCRUB ํ ํฝ์ ๋์ง ์๊ณ
session/end๋ฉ์์ง๊ฐ SCRUB์ ๊ฒธํ๋ค. ๋ชจ๋ ๊ตฌ๋ ์๋session/end์์ ์ฆ์ ๋ค์์ ์ํ:-
bridge:session_id์ ๋ฐ์ธ๋ฉ๋ ์ธํ ์๋ฒ ๋ฉ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ + ReID(Re-identification, ๋ณดํ์ ์ฌ์๋ณ) registry์์ unbind. -
mcp-tablet-gateway: ํ์ด๋ง ํ ํฐ ๋ฌดํจํ, WSS ์ฐ๊ฒฐ ์ข ๋ฃ. -
home-assistant: ํด๋นsensor.session_<id>_*์ํฐํฐ๋ฅผunavailable๋ก ํ์ (์๋ํ ๋๋ template). -
orchestrator: in-memory ์ปจํ ์คํธ ์บ์ evict.
-
-
๊ฒ์ฆ: ์ด์ ํ ์๋ฒ ๋ฉ์ด ๋ฉ๋ชจ๋ฆฌ์ ๋จ์ ์์ง ์์์ง
SIGUSR1ํธ๋ค๋ฌ๋ก self-audit (์๋น์ค๋ณ ๋๋ฒ๊ทธ ์๋ํฌ์ธํธ). - ์์ ์๋ณธ์ ๋์คํฌ ์ ์ฅํ์ง ์์(Frigate
record.enabled: false,snapshots.enabled: false๊ฐ์ ). - ๋ฐ์ดํฐ ํ๋ฆยท๋ณด์กด ์ ์ฑ ์ ์ ์ ์ ๊ตฌ์ ๊ณ ์ง (๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ฒ ์ค์).
ยง16์ "์ ์ ์ ์ธ์ยท๋ฌ๋ ํ์ด์ค ์ฝ์นญ" ์๋๋ฆฌ์ค๋ฅผ ์ํด ๋์ ๊ฒํ ์ ์ ์ฉ.
- ์ ์(identity) ์ถ์ถ์ ์๊ตฌ ๊ธ์ง โ face recognition ๋ชจ๋ธ์ ๋์ ํ์ง ์๋๋ค (CLAUDE.md invariant). ์ธํ(appearance) ์๋ณ์ OSNet ์๋ฒ ๋ฉ๋ง ์ฌ์ฉ.
-
ํ์ (facial expression)ยท์์ธ(pose) feature๋ ephemeral โ
bridge(๋๋ ๋ณ๋ ์ธํผ๋ฐ์ค ์๋น์ค)๊ฐ frame ๋จ์๋ก ํ๊ฐํ์ฌcontext/user/<session_id>/update์moodยทpostureํ๋๋ง ๊ฐฑ์ . raw featureยทembedding์ ๋์คํฌ/DB์ ์ ์ฅํ์ง ์์. -
SCRUB ํธ๋ฆฌ๊ฑฐ ๋์ผ โ
session/end์์ ์ in-memory์ ํ์ ยท์์ธ ์ํ๋ฅผ ์ฆ์ ํ๊ธฐ (ยง11.3 ๋ณธ๋ฌธ์ ์๋ฒ ๋ฉ ํ๊ธฐ์ ๊ฐ์ ํธ๋ค๋ฌ์ ๋ฌถ์). - ๋ชจ๋ธ ํ๋ณด: pose๋ YOLOv8-pose / MediaPipe BlazePose ์ค GPU(Graphics Processing Unit, ๊ทธ๋ํฝ ์ฒ๋ฆฌ ์ฅ์น) ๋ถํ ์ธก์ ํ ์ ์ . expression์ FER+(Facial Expression Recognition Plus, Microsoft ๊ณต๊ฐ ํ์ ๋ถ๋ฅ ๋ชจ๋ธ) ๋ฑ 7-class classifier๋ก ์ถฉ๋ถ (mood enum๊ณผ ๋งคํ).
-
session/end์ orchestrator๊ฐ LLM์ ์์ฝ์ ์์ฒญํ์ฌ ์์ฑํ ํ ์คํธ๋ง ๋ณด์กด ๊ฐ๋ฅ โ ์์ยท์๋ฒ ๋ฉยทํ์ด๋ง ํ ํฐ์ SCRUB ์ ์ฑ ๊ทธ๋๋ก. - ๋ณด์กด ์์น: HA recorder์ ๋ณ๋ text sensor (
sensor.session_<id>_diary) ๋๋/data/diaries/<session_id>.json. - ๋ณด์กด ๊ธฐ๊ฐ: ์ต๋ 7์ผ ํ ์๋ ์ญ์ (HA recorder
purge_keep_days: 3๋ณด๋ค ๊ธธ๋ฉด ๋ณ๋ cleanup cron ํ์). - ์ผ๊ธฐ ํ ์คํธ๋ LLM์ด ์์ฑ ๋จ๊ณ์์ PII(Personally Identifiable Information, ๊ฐ์ธ ์๋ณ ์ ๋ณด โ ์ด๋ฆยท์ ํํ ์ธ๋ชจ ๋ฌ์ฌยท์ฒด๋ฅ ์๊ฐ ์ธ ์๋ณ ๋จ์)๋ฅผ ์ ๊ฑฐํ๋๋ก system prompt์ ๊ฐ๋ ๋ช ์.
- LLM์ด ์์จ์ ์ผ๋ก ๋ฐํํ ์ ์๋ capability whitelist์์ ๋ถ๋ฆฌ. orchestrator์ ๋๊ตฌ ์คํค๋ง(ยง9.2)์์
physical_security์นดํ ๊ณ ๋ฆฌ๋ ๋ ธ์ถํ์ง ์์. - ๋ฐํ ๊ฐ๋ฅ ๊ฒฝ๋ก:
-
HA rule-based automation: ์ฌ์ ์ ์๋ ์กฐ๊ฑด(์:
session_id=nullANDvehicle.zone=homeANDunknown_visitor=true)์์๋ง ํธ๋ฆฌ๊ฑฐ. - operator console: ์ด์์ ๋ช ์ ์น์ธ.
-
HA rule-based automation: ์ฌ์ ์ ์๋ ์กฐ๊ฑด(์:
- Figma "๊ฐ์ ๊ธฐ์ฌ๊ฐ ์ผ์ฐ ์์ AI๊ฐ ์์ ํ ์ ๊ธ" ์๋๋ฆฌ์ค๋ ์ HA rule ๊ฒฝ๋ก๋ก๋ง ์์ฐ โ LLM ์์จ ๊ฒฐ์ ๊ธ์ง.
- ยง7.4 ์ธํฐ๋ก + ์ด์์ ์์ ๋ชจ๋ํฐ๋ง + ๋ก๋ด๋ณ ๋ฌผ๋ฆฌ e-stop ๋น์น.
- ๊ถ์ฅ: ํตํฉ ์ํฌ์คํ ์ด์ 1๋ (CPU 8C16T / RAM 32GB / GPU RTX 4060 8GB / NVMe(NVM Express, ๊ณ ์ ์ ์ฅ ์ธํฐํ์ด์ค) 1TB) โ ๋ชจ๋ ์ปจํ ์ด๋ ํธ์คํ . ์์ธํ ์ฌ์ยท์ฐ์ ๊ทผ๊ฑฐ๋ DEPLOYMENT.md ยง0 ์ฐธ์กฐ.
- ๋ถ๋ฆฌํ ์ต์ : GPU ๋ ธ๋(Frigate) + CPU ๋ ธ๋(๋๋จธ์ง)๋ก 2 ๋ ธ๋.
- Jetson ์ฃ์ง: ์นด๋ฉ๋ผ ์๊ฐ ๋๊ฑฐ๋ GPU ๋ถํ ๋ถ์ฐ์ด ํ์ํ๋ฉด ๊ทธ๋ฃน๋ณ ์ถ๊ฐ (์ ํ).
- ๋ฌด์ : ํ๋ธ๋ฆฟ์ฉ ๋ณ๋ SSID(Service Set Identifier, ๋ฌด์ ๋คํธ์ํฌ ์๋ณ์) (5GHz, AP 2๋๋ก ์ปค๋ฒ๋ฆฌ์ง).
- ์ ์ : ๋ก๋ด์ ๊ฐ๋ฅํ ๋ฌด์ ์ด์ง๋ง SPOT์ 5GHz Wi-Fi ๋๋ Ethernet over robot dock ํ์ฉ.
- ๋ชจ๋ ์๋น์ค ์ปจํ ์ด๋ํ(Docker), Compose๋ก ๊ตฌ๋(์ ์ ๋จ์ผ ์ฌ์ดํธ๋ผ K8s ์ค๋ฒํฌ).
- ์ธํ๋ผ as Code: docker-compose + Ansible (์ ์์ฅ ์ ์ ์๋ํ).
- ์ฌ๋ฌด์ค์ ๋ฏธ๋ ๋ฏธ๋ฌ ํ๊ฒฝ(์นด๋ฉ๋ผ 1, ํ๋ธ๋ฆฟ 1, SPOT ๋จ๋ )์ผ๋ก ํตํฉ ํ ์คํธ.
| ๋ฆฌ์คํฌ | ์ํฅ | ์ํ |
|---|---|---|
| LLM ์ง์ฐ/์คํจ | ์ธํฐ๋์ ๋๊น | rule-based ํด๋ฐฑ, ์บ์ |
| ๋น์ re-id ์คํจ(ํผ์ก ์) | ์๋ชป๋ ์ฌ์ฉ์ ์ธ์ | ๋์ ์ฒดํ ์ธ์ 3๋ช ์ ํ, ํ๋ธ๋ฆฟ QR ์ฌํ์ด๋ง ๋์ |
| ๋ก๋ด fault | ์์ฐ ์ค๋จ | ์ด์คํ ์๋๋ฆฌ์ค(๋ค๋ฅธ ๋ก๋ด์ผ๋ก ๋์ฒด) + ์ด์์ ์๋ ๋ชจ๋ |
| Wi-Fi ํผ์ | ํ๋ธ๋ฆฟ/๋ก๋ด ํต์ ๋๊น | ๋ณ๋ SSID + ์ฑ๋ ํ๋๋, ๋ก๋ด ์ ์ฉ AP |
| LLM ํ๊ฐ โ ์ํ ๋ช ๋ น | ์์ ์ฌ๊ณ | ํ์ดํธ๋ฆฌ์คํธยท์คํค๋งยทํ๋ ํด๋จํ + ๊ฑฐ๋ถ ๋ฉํธ๋ฆญ ์๋ฆผ |
| ๋ฏธ์ ๋ก๋ด SDK ๋ฏธ์ฑ์ | ํตํฉ ์ผ์ ์ง์ฐ | ์ด๋ํฐ ํจํด์ผ๋ก ์ธํฐํ์ด์ค ๊ฒฉ๋ฆฌ, ROS2 ํ์ค ์ฐ์ |
- M0 โ ์ธํ๋ผ ๋ถํธ์คํธ๋ฉ (2์ฃผ): Event Bus, Context Server, ๋์๋ณด๋ ์ค์ผ๋ ํค.
- M1 โ ๋น์ + ๋จ์ผ ๊ณต๊ฐ (3์ฃผ): 1๊ฐ ๊ณต๊ฐ(cafe) ๊ธฐ์ค enter/exit ์ด๋ฒคํธ โ ํ๋ธ๋ฆฟ ์ต์ ๋ ธ์ถ.
- M2 โ SPOT ํตํฉ (3์ฃผ): SPOT ์ด๋ํฐ, ์์ ์ธํฐ๋ก, 1๊ฐ ๊ณต๊ฐ ์ธํฐ๋์ end-to-end.
- M3 โ LLM Orchestrator (2์ฃผ): ๋๊ตฌ ํธ์ถ, ๊ฐ๋๋ ์ผ, zone playbook 2๊ฐ.
- M4 โ 4๊ฐ ๊ณต๊ฐ + 2๋ฒ์งธ ๋ก๋ด (4์ฃผ): ๋ฏธ์ ๋ก๋ด ์ด๋ํฐ, ๋ฉํฐ ๊ณต๊ฐ re-id.
- M5 โ ์ด์ ๊ฐํ (2์ฃผ): ์๋ฆผ, ํด๋ฐฑ, ๋ถํ ์์ฐ ๋ฆฌํ์ค.
- 2๋ฒ์งธ ๋ก๋ด ๋ชจ๋ธ ์ ์ (ํด๋จธ๋
ธ์ด๋ / ํ ํ / ํ๋๋ก๋ด).
- Figma 1์ฐจ ๊ธฐํ(2026-05-04 ํ์)์์ KAIST ๋ก๋ด์ด ํ๋ณด๋ก ์ธ๊ธ๋จ โ ์ง์ ๋ณด์กฐ(์ธ์ถ ์ค๋น๋ฌผ ์ฑ๊นยท์ฝ/์๋ฃ ์ค๋นยท๋์ ๊ฐ์ง). ๊ฒฐ์ ์ ยง7.2 ๊ฒฐ์ ๋งคํธ๋ฆญ์ค์ ๋ฐ๋ผ ์งํ, ๋ณธ ํญ๋ชฉ์ ํ๋ณด ์ถ๊ฐ๋ง.
- LLM ๋ชจ๋ธ ์ ํ (Opus vs Sonnet) โ ์ธํฐ๋์
ํ์งยท์ง์ฐ ์ธก์ ํ ๊ฒฐ์ .
- Figma ์๋๋ฆฌ์ค์ ๊ฐํ ์ ์ ์ ์ถ๋ก ยท๋งฅ๋ฝ ์ฐ์์ฑ ์๊ตฌ๋ Opus 4.7 ์ฐํธ์ ์ ํธ. NFR p95 < 2.5s ์ธก์ ์ ํ๊ฐ ํญ๋ชฉ์ผ๋ก ํฌํจ ํ์.
- ์ฌ์ฉ์ mood ์
๋ ฅ ๋ฐฉ์ (ํ๋ธ๋ฆฟ self-report vs ๋น์ ยท์์ฑ ์ถ๋ก ).
- Figma๋ vision(ํ์ ยท์์ธ ๋ถ์, ยง11.3.1)๊ณผ self-report(์ธํธ๋ก 4ํ ๋ง ์ ํ, ยง16.2 ์ธํธ๋ก ๋จ๊ณ) ๋ ๋ค ์์ฌ. ์์ชฝ ๋ณํ ๊ฐ๋ฅ์ฑ ๊ฒํ ํ์.
- ์์ ์ ์ฅ ์ ์ฑ
(์์ ๋ฏธ์ ์ฅ vs ์ต๋ช
ํ ํ ๋จ๊ธฐ ๋ณด๊ด).
- Figma "๋ํ์ผ๊ธฐ ์์นด์ด๋น" ์๊ตฌ๋ LLM ํ ์คํธ ์์ฝ์ ํ์ ๋๋ฉฐ ์์ ๋ณธ์ฒด ๋ณด์กด์ ์์ฌํ์ง ์์ โ ํ ์ ์ฑ (์์ ๋ฏธ์ ์ฅ) ์ ์งํ๋ฉด์ ยง11.3.2 ์ผ๊ธฐ ์ ์ฑ ์ผ๋ก ์ถฉ์กฑ ๊ฐ๋ฅ.
- ์ด์์ ์ธ์ (๋จ๋
vs 2์ธ ๊ต๋).
- Figma VIP ์๋๋ฆฌ์ค(15๋ถ, ๋์ ์ ์์ง์)์ ์ผ๋ฐ ์์ ๊ด๋ ๋์ ์งํ ๊ฐ๋ฅ์ฑ โ 2์ธ ๊ต๋(์์ฐ + ๋ชจ๋ํฐ๋ง) ์ฐํธ์ ์ ํธ.
์ถ์ฒ: Figma
tTC1SxVaA9D3Be1ghF1QLRโ 2026-05 ๊ธฐํยท๋์์ธ 1์ฐจ ํ์ ์ฐ์ถ๋ฌผ. ์ฑํ์: ์ฑ๊ฑด์ฐ ๋งค๋์ ์ "Physical AI Companion: Traveling Soul" โ 2026-05-04 ํ์์์ ์ค์ฌ์ถ์ผ๋ก ๊ฒฐ์ . ํ๋ํ(SOUL/์ฐ์์ฑ)ยท์ด์น์ฝ(๋ฌ๋/๊ฑด๊ฐ)ยทํํ์(๋๋ฆฌ์ํ) ์์ด๋์ด๋ฅผ ๊ฐ์ง(ๆ)๋ก ๋ง๋ถ์ด๋ ๋ฐฉ์.
๋ณธ ์ ์ ๊ธฐํ์์ 6๋จ๊ณ ์ฌ์ฉ์ ์ฌ์ ยท๋๋ฐ์ด์ค ๊ตฌ์ฑ์ ๋ณธ ์์คํ
์ ์ปดํฌ๋ํธยทํ ํฝยทMCP ๋๊ตฌยทplaybook์ผ๋ก ๋งคํํ๋ค. ์ ๊ท MQTT ํ ํฝ์ 0๊ฐ(ยง16.6)์ด๋ฉฐ, ํต์ฌ ๋ณ๊ฒฝ์ โ intro/outro playbook 2๊ฐ ์ ์ค โก ์ ๊ท capability 2๊ฐ(bringยทlock) ์ถ๊ฐ์ ํ์ ๋๋ค. ๊ทธ ์ธ ๋ชจ๋ ํ๋ฆ์ ยง5์ ์ผ๋ฐ ํจํด(ํธ๋ฆฌ๊ฑฐ โ assemble โ guardrail โ dispatch)์ ์๋ ดํ๋ค.
Figma ํค ๋ฉ์์ง 6๊ฐ๋ฅผ ๊ทธ๋ฃนํํ์ฌ ๋งคํ.
| ํค ๋ฉ์์ง (Figma ์๋ฌธ) | ์์คํ ๋์ |
|---|---|
| "์ธ์ ์ด๋์๋ ํจ๊ป" / "๋๋ฅผ ๊ธฐ์ตํ๊ณ ์ดํดํ๋" / "ํ๋์ ์ธ๊ฒฉ์ฒด๋ก ๋๊ปด์ง๋" | session_id ๋จ์ ์ปจํ
์คํธ ๋์ โ vision/zone/{enter,exit} + context/user/<id>/update (retain:true) + HA sensor.session_<id>_* SoT (ยง3.1, ยง4.1) |
| "๋์ ํจ๊ป ์ฑ์ฅํ๋" / "๋งฅ๋ฝ์ด ํ๋์ ๊ฐ์น๋ฅผ ๋ถ์ฌ" | orchestrator๊ฐ zone playbook์ ์ปจํ ์คํธ๋ก ์ด์ ๋ธ โ Claude tool use โ MCP dispatch (ยง5.1, OSS_INTEGRATION.md ยง3.3). Anthropic prompt cache๋ก system prompt + zone playbook ์ฌ์ฌ์ฉ (ยง9.1). |
| "๋์ฒด ๋ถ๊ฐ๋ฅํ ๋๋ฐ์" | ์ฒดํ ์ข ๋ฃ ์ SCRUB(ยง11.3)๋ก ์๊ตฌ ๋๋ฐ์๋ ๊ตฌํ ๋ถ๊ฐ. ์์ฐ ํ์ ์ผ๋ก ๋ํ์ผ๊ธฐ(ยง11.3.2)๊ฐ ํ๊ณ ํํ์ ์ฐ์์ฑ ํ์ ์ ๊ณต. |
| # | ๋จ๊ณ | zone | ํธ๋ฆฌ๊ฑฐ | playbook | ํต์ฌ ๋๊ตฌ (MCPยทHA) | ์ฃผ์ ์ฐ์ถ ํ ํฝ |
|---|---|---|---|---|---|---|
| 1 | ์ธํธ๋ก (4ํ ๋ง ์ ํ) | ์์ฐ ์์ zone (ํ cafe โ ์นดํโ๋งํธ/ํ์ฌ ๋ณ๊ฒฝ ์ zones.yaml 1๊ณณ๋ง ์์ ) |
vision/zone/enter (sess ์ ๊ท ํ์ด๋ง) |
intro.md โ
์ ์ค |
mcp-tablet-gateway.show_options |
tablet/<id>/show_options |
| 2 | ๊ธฐ (์์นจ ์ถ๊ทผ ์ค๋น) | home |
tablet/<id>/intent (ํ
๋ง ์๋ต ์์ ) |
home.md (sub: morning) |
show_message, robot_command(KAIST: bring) โ , HA light.turn_on
|
tablet/<id>/show_message, robot/<kaist>/command
|
| 3 | ์น (์์ฐจ ์ถ๊ทผ) | vehicle |
vision/zone/enter (zone=vehicle, sess ๋์ผ) |
vehicle.md |
show_message(์ฐจ๋ ๋์คํ๋ ์ด), HA light.turn_on / media_player.play_media / climate.set_temperature
|
tablet/<vehicle_disp>/show_message |
| 4 | ์ (๊ณต์ ๋ฌ๋ + ์ง ๋๋ฐ์ํฉ) |
park (๋ฉ์ธ) โฅ home (๋ณํ) |
vision/zone/enter (zone=park) โฅ Frigate ๋ฏธ๋ฑ๋ก ์ธ๋ฌผ detect |
park.md + ํ์ ยท์์ธ(ยง11.3.1) |
robot_command(spot-01: follow), HA automation lock.lock (ยง11.3.3 rule ๊ฒฝ๋ก) |
robot/spot-01/{command,state}, HA service call |
| 5 | ๊ฒฐ (๊ท๊ฐ ํ ํ๋ณต) |
home (์ฌ์ง์
) |
vision/zone/enter (zone=home, sess ๋์ผ, prev_zoneโ home) |
home.md (sub: evening) |
HA climate.set_temperature / media_player.play_media, robot_command(KAIST: bring) โ , show_message
|
robot/<kaist>/command, tablet/<id>/show_message
|
| 6 | ์์ํธ๋ก (๋ํ์ผ๊ธฐ) | (zone ๋ฌด๊ด) | session/end |
outro.md โ
์ ์ค |
LLM ํ
์คํธ ์์ฑ + HA text.set_value + show_message
|
tablet/<id>/show_message, sensor.session_<id>_diary
|
โ = ์ ์ค playbook (ยง16.5). โ = ๋ณธ ๋จ๊ณ capability enum(ยง9.2)์ ์์ โ KAIST ๊ฒฐ์ ํ ์ถ๊ฐ (ยง16.5).
๋จ๊ณ ๊ตฌ๋ถ ๋ ธํธ:
- ๊ฐ์
homezone์ ์ฌ์ฉํ๋ โก๊ธฐ์ โค๊ฒฐ์prev_zone์ปจํ ์คํธ๋ก ๊ตฌ๋ณํ๋ค โ ์ธํธ๋ก ์งํ ์ฒซ enter๋ฉด ๊ธฐ, ๋ค๋ฅธ zone ๊ฒฝ์ ํ ์ฌ์ง์ ์ด๋ฉด ๊ฒฐ. orchestrator์ assemble ๋จ๊ณ์์zone_history(ยง4.1) ๋ง์ง๋ง ํญ๋ชฉ ๋น๊ต๋ก ๋ถ๊ธฐ. - โฃ์ ์ ๋ฉ์ธ ์์ฐ์๊ฐ
park์ ์๋ ๋์home์ ๋๋ฐ์ํฉ detect๊ฐ ๋ณ๋ ฌ ์คํ. ๋์ผ session_id๋ผ๋ zone์ด ๋ค๋ฅด๋ฏ๋ก(park=spot-01,home=kaist-01) ยง7.3.C์(session, zone)์ ๊ธ์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ โ ์ฌ์ฉ์๊ฐ ์ค์ธ์ ์์ด๋ ์ค๋ด ๋ก๋ด์ด ๋๋ฐ์ํฉ์ ๋ ๋ฆฝ ๋ฐ์ํ๋ค. ๊ฐ์ robot์ ๋ํ ๋ช ๋ น ์ถฉ๋์ ยง7.3.A ๋จ์ผ priority queue๊ฐ ๋ณ๋ ๋ฐฉ์ง. -
5/8 ์ค์ฅ๋ ํผ๋๋ฐฑ(๋ค์ค ์ผ์ ์ถฉ์กฑ ์์ ์ถ์ฒ)์ โก๊ธฐ์
home.mdmorning sub-prompt์ ๋ฐ์ โ ์ผ์ 2~3๊ฑด์ ๋๋ ์ค ์ฝ๋๋ฅผ ๋์์ ๋ง์กฑํ๋ ์ต์ ์show_options๋ก push.
| Figma ๋๋ฐ์ด์ค | ์์คํ ๋งคํ | ๋น๊ณ |
|---|---|---|
| SPOT (๊ณต์ ๋ํ) |
robot_id: "spot-01" (ยง7.1) |
๋ณ๊ฒฝ ์์ โ capability followยทlook_at ๊ทธ๋๋ก |
| KAIST ๋ก๋ด (์ง์ ๋ณด์กฐ) |
robot_id: "kaist-01" (ํ๋ณด, ยง15 ๋ฏธ๊ฒฐ) |
robots.yaml์ placeholder ์ถ๊ฐ. ์ด๋ํฐ๋ ยง7.2 ๊ฒฐ์ ๋งคํธ๋ฆญ์ค์ ๋ฐ๋ผ ROS2 ์ฐ์ ๊ฐ์ |
| ์ฐจ๋ ๋์คํ๋ ์ด/์ค๋์ค |
paired_tablet_id: "vehicle_disp_01"๋ก ์ถ์ํ |
๋ณ๋ mcp-vehicle-gateway ์ ์คํ์ง ์์ โ ๊ธฐ์กด tablet ํ ํฝ(show_messageยทintent) ์ฌ์ฌ์ฉ. ๋ผ์ดํธยท๋ํจ์ ยท์์
์ HA smart-home integration |
| ๋ชจ๋ฐ์ผยท์ค๋งํธ์์น | HA Companion App + Wear OS / Apple Health integration (๋์ ๊ฒฐ์ ์) | ยง15 mood ์ ๋ ฅ ๊ฒฐ์ ๊ณผ ์ฐ๋. ๋ฏธ๋์ ์ vision rPPG(remote PhotoPlethysmoGraphy, ์๊ฒฉ ๊ด์ฉ์ ๋งฅํ ์ธก์ ) ์ถ์ ์ผ๋ก ๋์ฒด โ ์ฒดํ์ ๋ฌด์ฐฉ์ฉ ์์ฐ ๊ฐ๋ฅ |
| CCTV (์ ์ ์ ์ธ์) | Frigate + bridge OSNet appearance + pose(ยง11.3.1) | ์ท ์์ยท์์งํยท์์ธ ๋ฉํ๋ฐ์ดํฐ๋ฅผ context/user/<id>/update patch๋ก ์ ๋ฌ. identityยท์ฑ๋ณยท๋์ด๋ ์ถ์ถํ์ง ์์ (ยง11.3.1) |
| ์ธํ๋ผ์กด (๊ฐ์ด๋ฐ ๋ฏธ๋์ด์ณ) | HA Lovelace ์ด์์ view + Grafana(ยง10) โ ยง16.4 ์ฐธ์กฐ | ์์ฐ ์ฌ์ฉ์ ์ปจํ ์คํธ๋ ์๋ ์ด์ ํํ ๊ณต๊ฐ |
๊ธฐํ์์ ํฌํจ๋ ์ด์ ์ฐจ์ ์๊ตฌ๋ ๋ณธ ์์คํ ์ ์ด์(ยง10)ยท์์ (ยง11.4)ยท๋ฐฐํฌ(ยง12) ์ ์ฑ ์์ ๋ค์๊ณผ ๊ฐ์ด ์น๋๋ค.
-
VIP ์๋๋ฆฌ์ค (15๋ถ, ๋์ ์ ์์ง์) โ VIP-์ ์ฉ ํ๋ธ๋ฆฟ 1๋๋ฅผ ๋ณ๋
paired_tablet_id๋ก ํ์ด๋งํ๊ณ ,tablet/<vip>/show_message๋ก ๋ณธ ์์ฐ์์ zone ์ ํยท๋ก๋ด ๋์ยทLLM ๊ฒฐ์ ์งํ๋๋ฅผ ํ๋ถ ์ ๋ณด๋ก push. NFR(ยง1.3)์ "๋์ ์ฒดํ์ 3๋ช " ์ธ ์ถ๊ฐ ์ฒญ์ค ์ฌ๋กฏ์ผ๋ก ๋ถ๋ฆฌ ์ด์. - ์ธํ๋ผ์กด (๊ฐ์ด๋ฐ ๋ฏธ๋์ด์ณ) โ 4 zone ์ธ ํํ ๊ณต๊ฐ. ์ฌ์ฉ์ ์ปจํ ์คํธ ์์. โ HA Lovelace ๋ณ๋ view์ ์ถฉ์ ยท์์ฐยท์ถ๊ณ ๋ชจ์ entity ํ์, โก Grafana ๋์๋ณด๋๋ก ์ ์ฒด AI ์์ฌ๊ฒฐ์ ยท๋ก๋ด ํ ๋ ๋ฉํธ๋ฆฌ ์กฐ๊ฐ. ์ ๊ท ์ปดํฌ๋ํธ ์์.
- ๋๋ฐ์ํฉ ํํ ์ฅ์น โ ๊ฐ์ ๊ธฐ์ฌยท๋์ยท๋ฐ๋ ค๋๋ฌผยท์์ด ๋ฑ์ ์ง zone ๋ด ์ฐฝ๋ฌธํ ๋์คํ๋ ์ด์ ์ธ๋ถ ์์์ ์ฌ์ํ๊ณ , ๊ทธ ๋์คํ๋ ์ด๋ฅผ ํฅํ Frigate ์นด๋ฉ๋ผ๊ฐ ์์ ์ person์ ๊ฐ์งํ๋ ๋ฐฉ์์ผ๋ก ์์จ ์์ฐ ๊ฐ๋ฅ (์ค์ ์ธ๋ถ ์ธ์ ๋์ ๋ถ์). ์นด๋ฉ๋ผ 1๋ ์ถ๊ฐ ๋ฐฐ์น๋ง ํ์.
- ๋์์ฑยท๋๋ฆฌ์ํ (5/4 ํํ์ ์ ์) โ "์ฌ์ฉ์๊ฐ ์ง์ ๊ฐ์ง ์์๋ SPOT์ด ๋์ ์ผํ/์ฌ๋ถ๋ฆ" ์๋๋ฆฌ์ค. ๋ณธ ๋จ๊ณ ๋ฒ์ ์ธ์ด์ง๋ง MCP ์ํคํ ์ฒ ์์ฒด๋ ๋๊ตฌ ์ถ๊ฐ๋ง์ผ๋ก ์์ฐ ํ์ฅ ๊ฐ๋ฅ โ ยง16.5 ์์ ํญ๋ชฉ์๋ง ํ๊ธฐ.
- 3rd party ๋ฝ์ธ ์ํ๊ณ ์์ฌ โ ์ฐจ๋ ์ฑ โ ๋ก๋ด ์ ์ฒด ์ฑ ์ํ๊ณ ๋ฉ์์ง๋ MCP ์๋ฒ ์ถ๊ฐ ๋ฐ๋ชจ๋ก ์ด์์ ๋ธ๋ฆฌํ์์ ์์ฐ. ๋ณ๋ ๊ตฌํ๋ฌผ ์์.
๋ณธ ๋งคํ์ด ํจ์ํ๋ ์ ๊ท/ํ์ฅ ์์ . ๋ง์ผ์คํค์ ยง14 ๊ธฐ์ค.
| ํญ๋ชฉ | ์ํฅ ์์น | ๋ง์ผ์คํค |
|---|---|---|
prompts/playbooks/intro.md, outro.md ์ ์ค |
SERVICES.md ยง5 (orchestrator) | M3 |
| pose estimation ํตํฉ (YOLOv8-pose / MediaPipe) | SERVICES.md ยง4 (bridge) ๋๋ ๋ณ๋ ์ธํผ๋ฐ์ค service | M2 ์งํ |
| expression(FER+) ํตํฉ โ ยง11.3.1 ์ ์ฑ ์ ์ฉ ํ | SERVICES.md ยง4 (bridge) | M3 |
tablet.intent์ intent_type์ intro_theme ์ถ๊ฐ |
MQTT_SCHEMA.md ยง3.5 | M3 |
์ ๊ท capability bring (๋ฌผ๊ฑด ํธ๋ค๋ง) โ KAIST ๊ฒฐ์ ํ |
ยง9.2 ๋๊ตฌ ์คํค๋ง, mcp-robot-adapter | ยง15 ๊ฒฐ์ ํ |
์ ๊ท capability lock ๋ถ๋ฆฌ โ LLM ์์จ ๋ฐํ ๊ธ์ง(ยง11.3.3) |
ยง9.2, mcp-robot-adapter ๊ฐ๋ | M2 |
| ์ฐจ๋ ๋์คํ๋ ์ด์ฉ tablet-app ๋ณํ (full-screen, ์์ฑ ์ฐ์ ) | SERVICES.md ยง6 (mcp-tablet-gateway) | M4 |
sensor.session_<id>_diary text sensor + 7์ผ cleanup cron |
SERVICES.md ยง3 (home-assistant) | M5 |
KAIST ๋ก๋ด ์ด๋ํฐ adapters/kaist.py
|
SERVICES.md ยง6 (mcp-robot-adapter), config/robots.yaml | ยง15 ๊ฒฐ์ ํ |
| ๋์์ฑยท๋๋ฆฌ์ํ ์๋๋ฆฌ์ค (5/4 ํํ์) | OSS_INTEGRATION ์ ๊ท ์ํ์ค | ๋ณธ ๋จ๊ณ ๋ฒ์ ์ธ |
๋ณธ ยง16์ ๋ชจ๋ ๋งคํ์ CLAUDE.md์ ์ค๊ณ invariant๋ฅผ ์๋ฐฐํ์ง ์๋๋ค. ํต์ฌ ๋ณดํธ ์ฅ์น๋ ยง11.3.1ยท11.3.2ยท11.3.3์์ ์๋ก ๋ช
๋ฌธํํ ์ ์ฑ
โ ํ์ ยท์์ธ ephemeral / ๋ํ์ผ๊ธฐ ํ
์คํธ ํ์ ยท7์ผ ๋ณด์กด / ๋ฌผ๋ฆฌ ๋ณด์ ๋ช
๋ น LLM ์์จ ๋ฐํ ๊ธ์ง โ ๋ก ํ๋ณด๋๋ค. zones.yaml(4 zone)ยทrobots.yamlยทMQTT ํ ํฝ ์นดํ๋ก๊ทธยทMCP ๋๊ตฌ ์คํค๋ง๋ ์ ๊ท capability 2๊ฐ(bringยทlock) ์ธ ๋ชจ๋ ๋ณ๊ฒฝ ์์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, MQTT ์ ๊ท ํ ํฝ์ 0๊ฐ๋ค.