본문으로 건너뛰기
← Work

CASE STUDY / SYSTEMS · AUTOMATION · PHYSICAL SYSTEMS

NAMUH

이기종 보드로 구성된 케어 로봇을 제어 신호와 영상으로 나눠 서비스에 연결한 IoT 시스템

Period
2025.10 — 2025.11 (6주)
Team
6인 팀
Role
팀장 · 인프라 · 임베디드
Context
SSAFY 13기 자율 프로젝트
Award
반 1위 · 전국 우수 프로젝트 14선 · 전시발표회 입상
Stack
MQTT · OpenVidu · ESP32 · Docker · Nginx · Jenkins · AWS
Repository
GitHub

Context

감염 위험 때문에 외부와 단절된 소아암 환아를 위해, 비전·음성 AI와 원격 제어를 결합한 휴머노이드 케어 로봇을 만든 프로젝트입니다. 로봇은 예산과 부위별 목적에 따라 ESP32(목·허리), STM32(로봇팔), Raspberry Pi(카메라·오디오)로 나뉘어 있었습니다.

Problem

서로 다른 보드를 하나의 서비스로 묶어야 했고, 대용량 영상이 네트워크를 점유하면 모터 제어 신호가 늦어질 위험이 있었습니다. 동시에 웹 서비스, 미디어 서버, DB를 제한된 인프라 안에서 운영해야 했습니다.

Architecture

  • Robot ↔ MQTT Broker ↔ Spring Boot/Frontend: 서보모터 각도 같은 작은 제어 메시지를 양방향으로 주고받습니다.
  • WebRTC(OpenVidu Pro): 로봇 카메라 영상은 별도 미디어 경로로 전송합니다. 미디어 노드를 시그널링 서버와 분리해, 영상 부하가 커져도 제어 연결은 유지되도록 했습니다.
  • Spring Boot 서버: AI 추론 결과를 MQTT 명령으로 바꿔 로봇 각 부위에 전달합니다.
  • 단일 EC2: Host Nginx 뒤에 OpenVidu 내장 Nginx를 두는 이중 리버스 프록시 구조입니다.

My Contribution

  1. 팀장으로 일정과 역할을 조율했습니다.
  2. MQTT·WebRTC로 나눈 통신 구조를 설계하고 인프라와 CI/CD를 구축했습니다.
  3. ESP32 서보 제어 로직을 구현했습니다.
  4. Fusion 360으로 몸통 프레임을 모델링하고 3D 프린팅으로 제작했습니다.

Engineering Decisions

데이터 특성에 따라 통신을 이원화

제어 신호는 작지만 신뢰성이 중요하고, 영상은 크고 실시간성이 중요합니다. 하나의 채널로 묶으면 영상이 제어를 방해할 수 있어서 제어는 MQTT, 영상은 WebRTC로 분리했습니다.

미디어 서버 장애 격리

OpenVidu Community 버전은 시그널링과 미디어 처리가 한 인스턴스에서 돌아갑니다. 영상 부하가 세션 관리까지 흔들 수 있어, 미디어 노드를 분리할 수 있는 OpenVidu Pro를 택했습니다.

등속 대신 3차 가감속 제어

서보를 목표 각도까지 등속으로 움직이면 시작과 끝이 끊겨 기계적으로 보였습니다. 진행률을 Cubic Ease-In-Out 곡선에 매핑해 부드럽게 가속·감속하도록 바꿨고, 통신이 끊기면 타임아웃 후 IDLE 상태로 돌아가게 했습니다.

Troubleshooting

Nginx와 OpenVidu의 포트 충돌

두 서비스가 모두 80/443을 쓰려고 해 충돌했고, 포트를 바꾸자 OpenVidu 대시보드에서 무한 리디렉션과 인증서 오류가 났습니다.

  1. OpenVidu가 변경된 내부 포트(20443)를 공인 주소로 인식해 클라이언트에 잘못된 엔드포인트를 돌려주는 것이 원인이었습니다.
  2. .env의 공인 포트는 443으로 두고, docker-compose에서 내부 Nginx 수신 포트만 20443/20080으로 바인딩해 논리 주소와 물리 포트를 분리했습니다.
  3. Host Nginx에 Upgrade/Connection 헤더를 추가해 WebSocket 트래픽이 내부로 전달되게 했습니다.

결과적으로 인스턴스를 늘리지 않고 한 서버에서 두 서비스를 운영했고, 인증서 관리는 Host Nginx 한 곳으로 모았습니다.

Redis 접근 거부

Nginx http 블록은 L7에서 동작해 Redis 프로토콜을 전달하지 못했습니다. stream 모듈로 L4 TCP 프록시를 구성해 해결했습니다.

Result

  • SSAFY 13기 자율 프로젝트 반 1위, 전국 우수 프로젝트 14선 선정
  • 전시발표회 발표 부문 입상, 대표 시연자로 발표
  • 상용 휴머노이드 대신 기성 로봇팔과 자체 제작 프레임을 조합해 예산 80만 원 안에서 제작

Retrospective

코드가 실제 움직임으로 이어지는 전 과정을 다루면서, 소프트웨어 설계가 하드웨어 품질에 바로 영향을 준다는 점을 배웠습니다. 다만 모든 서비스가 한 EC2에 있어 단일 장애 지점이 남았고, 영상·센서 처리를 모두 서버에 의존하는 구조라 네트워크가 불안정하면 지연이 생길 수 있습니다. 다음에는 서비스 분리와 로봇 쪽 1차 처리(엣지)를 먼저 검토하겠습니다.

09 — RELATED MEDIA & WRITING