순찰 로봇 관제 시스템 PoC: 폐쇄망 환경 관제 서버·웹
네트워크가 차단된 생산 현장에서 순찰 로봇을 운영하는 관리자를 위한 관제 시스템의 실증(PoC) 프로젝트입니다. 관리자가 로봇의 순찰 스케줄을 관리하고, 로봇 위치와 카메라 영상을 실시간으로 확인할 수 있어야 했습니다.
2024.11 – 2025.04 · 관제 웹·관제 서버 단독 개발(API 설계, DB 스키마, 스케줄 배치), 로봇 서버 연동, 폐쇄망 Docker 배포 구성
- NestJS
- TypeORM
- PostgreSQL
- socket.io
- ws
- ffmpeg
- Docker
- nginx
- React
- Vite
- TypeScript
- MUI
- TanStack Query
- Zustand
- React Hook Form
- Konva
프로젝트 개요
네트워크가 차단된 생산 현장에서 순찰 로봇을 운영하는 관리자를 위한 관제 시스템의 실증(PoC) 프로젝트입니다. 관리자가 로봇의 순찰 스케줄을 관리하고, 로봇 위치와 카메라 영상을 실시간으로 확인할 수 있어야 했습니다.
로봇 제조사의 프로젝트에 외부 인력으로 참여해 관제 웹과 관제 서버를 혼자 개발했습니다. 로봇 서버와 네트워크 설계는 다른 담당자가 맡았습니다. 제가 만든 관제 서버는 로봇 서버와 지도 서버의 데이터를 받아 관제 웹에 REST와 WebSocket으로 전달합니다. 실무에서 서버를 개발한 첫 프로젝트였고, PoC까지 개발한 뒤 인계했습니다.
| 항목 | 내용 |
|---|---|
| 팀 구성 | 관제 웹·관제 서버 1명(본인), 로봇 서버·네트워크 담당자 별도 |
| 나의 역할 | 관제 웹·관제 서버 단독 개발(API 설계, DB 스키마, 스케줄 배치), 로봇 서버 연동, 폐쇄망 Docker 배포 구성 |
주요 성과
- NestJS로 관제 서버를 혼자 만들었습니다. 13개 도메인을 controller·service·repository·entity·dto 계층으로 나눴고, Swagger 문서화, 환경변수 검증, 로깅, 헬스체크, 소프트 삭제 공통 엔티티를 넣었습니다. 스케줄 모델은 반복 주기와 주행 속도까지 담아 8개 엔티티로 설계했습니다.
- 로봇 서버와 WebSocket으로 통신하는데, 도착한 응답이 어느 요청에 대한 것인지 알 수 없었습니다. 로봇 서버 담당자에게 요청·응답에 UUID를 넣어 달라고 요청해 프로토콜에 반영했고, 관제 서버에는 UUID로 응답을 짝짓는 요청·응답 처리를 구현했습니다.
- 로봇 서버에 붙는 WebSocket 클라이언트와 웹 클라이언트를 받는 WebSocket 서버를 한 컴포넌트에서 중계했습니다. 로봇 위치·배터리·상태는 접속 중인 모든 웹 클라이언트에 브로드캐스트하고, 로봇 서버와 연결이 끊기면 3초 뒤 다시 접속해 등록하게 했습니다.
- 10분마다 대기 중인 스케줄을 조회해 순찰 지점·영역 작업으로 바꾸고, 속도 값과 충전 스테이션 복귀 작업을 붙여 로봇 서버로 보내는 배치를 만들었습니다.
- 전달받은 RTSP → ffmpeg → WebSocket 스트리밍 코드를 수정해 관제 서버에 통합했습니다. 접속마다 뜨는 ffmpeg 프로세스가 정리되지 않아 영상이 끊기거나 느려졌고, 접속과 프로세스를 1:1로 추적해 접속이 끝나면 프로세스도 종료되게 했습니다.
- Konva로 지도 이미지 위에 캔버스를 얹어 순찰 지점과 사각 영역을 편집하는 관제 화면을 만들었습니다.
- docker-compose 환경별 구성과 nginx 리버스 프록시로 폐쇄망 배포를 구성했습니다. 인터넷이 되는 곳에서 이미지를 빌드해 로 반입하고, 현장에서는 후 재시작만 하는 절차를 문서로 남겼습니다.