인터랙티브 아키텍처 보기 →
홈 synapse TOM AND GERRI NEXUS 체험해보기 GitHub ↗
KETI 지능로보틱스연구센터 · STAR TEAM · Technical Report 2026

SYNAPSE

이기종 멀티로봇을 위한 End-to-End 원격조작·플릿 관제 플랫폼

A Unified Message Standard for Heterogeneous Multi-Robot Tele-Operation & Fleet Management

synapse1 ·  tom_and_gerri2 ·  nexus3 ·  nexus_ui4 ·  tag_{robot}★
1공통 표준 (pip)   2온-로봇 제어 SW (GERRI·AND)   3플릿 관제 서버   4관제 프론트엔드   ★로봇별 구현 레포
6핵심 컴포넌트
6표준 메시지 토픽
1:1 · N:N조작 + 플릿 동시
E2EEnd-to-End 플랫폼

Figure 1. SYNAPSE 시스템 개요. 모든 컴포넌트는 중심의 synapse 표준을 import 하여 동일한 status·command 인터페이스로 대화한다. 의존성은 언제나 안쪽(표준)을 향한다.

Abstract

하나의 메시지 표준, 두 가지 운용 모드

status·command를 통일하면, 어떤 관제 화면이든 모든 로봇을 같은 인터페이스로 다룰 수 있다.

SYNAPSE는 모바일·매니퓰레이터·휴머노이드 등 이기종 멀티로봇을 단일 메시지 표준(synapse)으로 추상화하는 플랫폼이다. 로봇에 tom_and_gerri를 설치하는 것만으로 표준 status/command가 자동으로 노출되며, 별도 서버 연동 작업 없이 1:1 원격조작(COCKPIT)과 N:N 플릿 관제(NEXUS)가 하나의 코드베이스 위에서 동시에 활성화된다.

설계의 중심에는 클린 아키텍처가 있다. 모든 컴포넌트는 가장 안쪽의 synapse 표준을 import하고, 의존성은 언제나 안쪽을 향한다. 전송 계층(WebRTC), GUI, 데이터베이스, 로봇 SDK는 모두 바깥의 교체 가능한 세부사항이다. 상태의 원본은 로봇(엣지)이 소유하고, 서버는 그 사본(뷰)만 캐시한다 — Edge-Authoritative 원칙이다.

Motivation

왜 이 프로젝트인가 — 마주한 문제

이 스프린트는 비용이 크지만, 얻는 것이 더 크다.SYNAPSE는 기술 표준과 팀 문화 둘 다를 겨냥한다.

PROBLEM 01
🏝️
정보 섬 (Information Islands)
rubberneck, tom_and_gerri, solar … 각 프로젝트가 작은 섬을 만든다. 섬마다 정보가 따로 흐르고 서로 연결되지 않는다.

파편화 — 같은 일이 흩어짐
중복 — 같은 정보를 따로 보관
왜곡 — 섬마다 조금씩 달라짐
PROBLEM 02
🔀
코드 패턴 불일치
호환성보다 "일단 되게"에 급급한 결과 패턴이 제각각이다.

예 — MCAP 빌더: dict로 status를 관리하다 MCAP 저장을 위해 Pydantic으로 바꿨지만 내부는 여전히 dict. 결국 로봇마다 Pydantic·dict 혼재.

→ 이해·확장 비용 폭증. 안 쓰는 코드는 또 하나의 섬.
SOLUTION
🤝
표준 + 문화, 둘 다
Technical: synapse가 메시지·status·자료구조를 통일해 섬을 잇는다. standardize()가 dict·Pydantic 모두 수용 → 전면 재작성 없이 점진 마이그레이션.

Cultural: 주(2주) 단위 랩 세미나로 최신 기술·큰 변경점을 공유하고 함께 브레인스토밍한다.
핵심: 표준이 섬을 잇고, 소통이 표준을 살아있게 한다.최소 한 명 이상은 이 SW 아키텍처를 전부 이해하고, 수요에 맞게 필요/불필요를 조정할 수 있어야 한다.
Key Concept

올인원 — 설치 즉시 플릿의 일부

로봇에 tom_and_gerri를 설치하면 synapse 표준 status/command가 자동 노출된다.별도 작업 없이 NEXUS 플릿에서 즉시 관제 가능 — 한 번의 설치로 1:1 + N:N 동시 ON.

→
1
🖥️
tom_and_gerri 설치
로봇 위 TOM(물리 HW)에 코어 SW를 올리고, SubController를 작성해 로봇 SDK와 연결한다.
→
2
📡
표준 자동 노출
synapse 메시지 표준대로 status·command를 자동 발행한다. 별도 서버 연동 작업 불필요.
3
🗄️
플릿 자동 관제
NEXUS가 즉시 인식. 1:1 COCKPIT 조작과 N:N 플릿 관제가 동시에 활성화된다.
Architecture

클린 아키텍처 — 의존성은 안쪽으로

바깥은 교체 가능한 세부사항, 안쪽은 안정적인 표준.의존 화살표는 항상 바깥에서 안쪽을 향하며, 안쪽은 바깥을 모른다.

세부 · 교체 가능 (바깥)
🌐 WebRTC 전송 — 교체 가능
🤖 로봇 SDK 벤더별
🖥️ Web GUI Vanilla JS
🥽 Unity / VR 입력 장치
🗄️ DB in-memory → SQLite
의존 방향 (바깥 → 안쪽). 안쪽은 바깥을 모른다.
구현 레이어
synapse — 관제·로봇·UI의 메시지 계약 (독립 signaling은 import하지 않음)

Figure 2. 레이어드 클린 아키텍처. synapse는 정의만 담고 실행 로직이 없다 — 여기를 바꾸면 전체가 흔들리므로 가장 신중히 관리된다.

🧠 synapse 공통 표준 · pip · 모두가 import
▲ import▲ import▲ import
🖥️ tom_and_gerri 온-로봇 제어 코어
▲ import + clone
📦 tag_{robot_name} 로봇별 별도 레포
🗄️ nexus 플릿 관제 서버
📊 nexus_ui 관제 프론트엔드

Figure 3. 레포 의존 그래프. nexus는 tom_and_gerri·tag 코드를 import하지 않는다 — 오직 네트워크 표준으로만 대화한다(코드 결합도 0). tag는 gerri/ 밑에 clone(submodule 아님).

Components

6개의 핵심 컴포넌트

각 컴포넌트는 명확한 단일 책임을 가진다.TAG = TOM + AND + GERRI, 한 로봇 분(分)의 묶음이다.

🧠
synapse
공통 표준 레이어 · pip 패키지
모든 컴포넌트가 import하는 중심 표준. Topics, Messages 6종, Enum 카탈로그, 자료구조, 미션 모델, standardize()를 정의한다. 정의만 하고 실행 로직은 없다.
TopicsMessages·6Enum 카탈로그standardize()단위(deg)trace 계약
자세히 보기↗
🖥️
TOM
Tele-operation Module · 물리 HW
로봇에 1:1로 부착되는 물리 컴퓨팅 모듈(NUC·Jetson 등). tom_and_gerri SW를 구동하는 현장 엣지 장치이자 상태 원본의 소유자.
NUC / JetsonEdge DeviceEdge-Authoritative
자세히 보기↗
🌐
AND
Adaptive Network Daemon · 외부 통신
외부 통신 전담 데몬(_and_/). 현재 WebRTC(rtc2kng) 기반. 내부 버스(pypubsub)와 완전 분리되어 전송 방식 교체 시 GERRI 로직 불변. Sub는 AND 직접 사용 금지.
WebRTCpypubsub 브리지Transport 독립
자세히 보기↗
🎮
GERRI
Global Extended Remote Robot Interface · 제어 SW
로봇 제어 SW 패밀리. Base(게이트웨이·분배·base_state 파생) / Sub(Capability 구현, 외부 통신 모름) / Mission(시퀀스) 3계층.
BaseControllerSubControllerMissionRunner
자세히 보기↗
🗄️
NEXUS
플릿 관제 서버 · 게이트웨이
N:N 다중로봇 통합 관제 + 원격 접속 게이트웨이. FastAPI + Uvicorn, 상태는 in-memory 레지스트리(재시작 생존용 SQLite 스냅샷 영속 옵션). API-first. python -m nexus 단일 명령 기동.
FastAPI/ws/{room}API-firstSingle-site흐름 추적 집계
자세히 보기↗
🕹️
COCKPIT
1:1 원격 조작 UI · WebRTC P2P
단일 로봇과 WebRTC P2P로 직결되는 1:1 조작 인터페이스. window.__COCKPIT__ 설정 주입으로 동작. Standalone / NEXUS-context 두 모드.
WebRTC P2P1:1config 주입tag별 커스텀
자세히 보기↗
Communication

관제 · 시그널링 · WebRTC 통신

NEXUS는 관제·인증·상태 레지스트리·제어 세션·입장 승인을 담당하고, synapse-signaling이 WebRTC 연결 협상을 중계한다. 영상·오디오·teleop는 WebRTC peer 사이로 전달하며, 직결이 어려우면 별도 TURN을 거친다.

🧑‍💻
사용자 / COCKPIT
웹 브라우저
WebRTC Client
HTTP / WS 관제
🗄️
NEXUS
관제 · 인증 · 상태
제어 세션 · 입장 승인
WS 지속 연결
🖥️
TOM (AND 포함)
status 푸시
command 수신
🧑‍💻 사용자
WebRTC peer 사이
영상 · 오디오 · teleop (직결 / 별도 TURN)
🖥️ TOM (로봇)
NEXUS ↔ TOM
WebSocket 지속 연결(/ws/{robot_id}). status·mission_event 푸시, 관제 명령·제어 세션 수신. TOM이 outbound로 접속.
사용자 ↔ NEXUS
HTTP / WebSocket으로 인증·관제·제어 세션·입장 승인을 처리한다.
사용자 / TOM ↔ synapse-signaling
별도 WebSocket /ws/{room}으로 ready / leave · SDP / ICE만 중계한다. 미디어·teleop·상태 캐시는 담당하지 않는다.
사용자 ↔ TOM (WebRTC)
WebRTC로 카메라·오디오·DataChannel을 전달한다. NEXUS와 synapse-signaling은 이 데이터 경로에 들어가지 않는다. 대칭 NAT·사내망처럼 직결이 안 서는 현장은 TURN(coturn) 릴레이로 폴백 — 크리덴셜은 /api/ice가 통화 직전에 발급하는 시간제한 값이다.

Figure 4. NEXUS 관제와 독립 시그널링을 분리한다. synapse-signaling은 sender / receiver를 보고 연결 협상만 중계하며, WebRTC 데이터는 peer 사이에서 직결 또는 별도 TURN으로 전달된다.

사용자 3계층 — 역할이지 고정 위치 아님

2 ⇄ 3 전환은 클릭 한 번.N:N 관제와 1:1 조작 사이를 지연·재접속 없이 오간다.

1
현장 관리자
Local · LAN 직접 접속
사이트 현장에서 LAN으로 NEXUS에 직접 접속. 지연 없이 로봇 상태 확인 및 간단 조작.
2
서버 관제사
WebSocket · N:N 플릿
NEXUS 관제 UI로 전체 플릿 N:N 모니터링. 미션 조작·스케줄링. 특정 로봇 클릭 → 1:1 전환.
3
1:1 원격 관제사
WebRTC · COCKPIT
대시보드에서 로봇 클릭 → 즉시 WebRTC P2P COCKPIT 진입. 카메라·조이스틱으로 정밀 원격 조작.
Mission System

3계층 미션 구조

"실패는 정상, 인간 개입 우선."FleetMission → RobotMission → Task 순으로 위임한다.Python 함수·JSON·REST 모두 지원.

1
FleetMission
다중 로봇 조율. FleetTask 그래프(DAG)를 depends_on으로 정의. NEXUS가 조율(FleetMissionRunner 구현됨), 로봇 점유·실행은 TOM 책임.
NEXUS
▼ RobotMission 위임
2
RobotMission
단일 로봇의 Task 시퀀스 실행. MissionRunner가 관리. 상태는 로봇 측 보유 → 재접속 시 자동 복구. 개입: NEED_HELP → TELEOP → resume/abort.
GERRI
▼ Task 실행
3
Task (5가지 타입)
capability(SDK 호출) · wait_input(입력 대기) · wait_teleop(텔레옵 호출) · notify(알림) · func(임의 Python). 헬퍼로 간결 정의.
synapse
입력 형식 3가지 모두 지원
🐍 Python 함수 — 직접 정의 (가장 유연)
📄 JSON mission_pack — 사이트·고객별 분리 파일
🌐 REST API — 동적 실행

FleetMission — 커피 배달 예시 (DAG)

synapse.missions 헬퍼
def coffee_delivery() -> FleetMission:
    return FleetMission(
        name="coffee_delivery", site="itp",
        tasks={
            "go":       call("mobile_01", "go_to_coffee"),
            "make":     call("coffee_01", "make_americano",
                          depends_on=["go"]),
            "transfer": call("arm_01", "transfer_cup",
                          depends_on=["make"]),
            "deliver":  call("mobile_01", "go_to_dest",
                          depends_on=["transfer"]),
        })

RobotMission — 5층→1층 배달

synapse.missions 헬퍼
def delivery_5f_to_1f() -> RobotMission:
    return RobotMission(name="delivery", tasks=[
        cap("undock", "undock"),
        cap("go", "navigate_to_pose", x=1.0, y=2.0),
        wait_input("confirm", prompt="도착했나요?",
                   buttons={"yes": "예"}),
        cap("dock", "dock"),
        notify("done", "배달 완료"),
    ])
Roadmap

기반 E2E는 완료, 지금은 조율·개입·트윈·SDK로 확장 중

초기 목표였던 "NEXUS UI로 모바일 로봇을 실제로 움직인다"(status→command→이동→N:N↔1:1)는 달성됐다.이후 플릿 조율·인간 개입·디지털 트윈·크로스랭귀지 SDK로 범위를 넓히고 있다.

기반 E2E ✓
단일 로봇 원격조작
synapse 표준·로봇/서버 연결·실시간 재접속 + UI 명령→실제 이동 + N:N↔1:1 전환. 전체의 토대(완료).
플릿 · 영속 ✓
다중 로봇 조율
FleetMissionRunner DAG 조율(/api/fleet/*) · SQLite 스냅샷 영속 · 표준맵 정렬 부착.
개입 · 트윈 · 비전 · 대화
인간 개입 + 3D 트윈 + 비전 피킹 + AI 인터페이스
A4 통합 개입 엔진(NEED_HELP→TELEOP takeover) · URDF/GLB 3D 트윈 콕핏 · IoT(엘리베이터·자동문) 연동 · 디텍션→OBB→파지계획 공통 라이브러리와 콕핏 클릭·박스 피킹 · 말과 글로 로봇을 부리는 AI 인터페이스(마이크·ai_chat → 같은 두뇌 → capability·미션) · 한 명령의 end-to-end 경로를 보는 흐름 추적(trace.hop — 4레포 관통, 기본 꺼짐).
SDK 🎯
크로스랭귀지 확장
기계판독 wire contract(JSON Schema·픽스처·VP8/Opus)로 Unity 등 제3 UI·타 언어 SDK를 같은 계약으로 잇는다.
Resources

더 알아보기