자율주행 로봇 원격 학습 및 실시간 스트리밍 시스템 구축 프로젝트 구조

김민준·2025년 5월 12일


🚗 자율주행 로봇 원격 학습 및 실시간 스트리밍 시스템 구축기

🎯 목표

연구실 내 **메인 서버(WSL2 + Ubuntu 22.04)**를 중심으로,
외부에서 운행 중인 Jetson 기반 자율주행 차량과 다음 기능을 수행하는 시스템을 구축한다:

  1. 차량에서 1시간마다 2분 영상을 녹화하여 메인 서버에 전송
  2. 실시간 상황 확인을 위한 스트리밍 기능 제공
  3. 수집된 데이터를 메인 서버에서 딥러닝 학습 → Jetson에 모델 자동 배포
  4. 전체 시스템을 Docker + Kubernetes + CI/CD 구조로 관리
  5. 차량의 상태 (위치, 센서 등)를 실시간으로 모니터링

🧱 사용 기술 스택 및 역할 정리

기술역할
Docker각 기능(딥러닝 학습, ROS2, 스트리밍 등)을 컨테이너화하여 독립 실행
Kubernetes (k3s)Jetson과 서버를 하나의 클러스터로 묶어 컨테이너를 오케스트레이션
CI/CD (GitHub Actions or GitLab CI)메인 서버에서 학습된 모델 및 자율주행 코드를 자동 빌드·배포
ROS2 Humble차량 내부 ROS2 토픽 처리 및 서버와의 위치/상태 통신에 사용
Tailscale VPNJetson과 메인 서버가 서로 다른 네트워크(에그/LAN)에 있어도 통신 가능
PyTorch + CUDA + cuDNNGPU 학습 최적화된 환경에서 영상 데이터 학습
Flask + OpenCVJetson에서 실시간 MJPEG 스트리밍 서버 운영

🔁 구현 시나리오

📤 [1] Jetson → 메인 서버: 주기적 영상 전송

  • Jetson 내부에서 OpenCV로 2분간 영상 녹화
  • cron으로 매시간 스크립트 자동 실행
  • Tailscale VPN을 통해 메인 서버로 scp 전송
  • 메인 서버의 딥러닝 컨테이너는 해당 디렉토리를 mount하여 자동 수신
# 예시 cronjob
0 * * * * /usr/bin/python3 /home/jetson/upload_video.py

📺 [2] Jetson → 메인 서버: 실시간 영상 스트리밍

  • Flask 기반 MJPEG 스트리밍 서버 항상 실행 (port 8000)
  • 메인 서버에서 브라우저 또는 GUI로 접속하여 실시간 확인
# 접속 URL
http://<Jetson tailscale IP>:8000/video_feed

⚙️ [3] 딥러닝 학습 및 자동 배포

  • 메인 서버에서 수신된 영상을 기반으로 PyTorch 학습

  • 학습 완료 시 CI/CD가 자동으로:

    1. 모델 저장
    2. Docker 이미지 생성
    3. Kubernetes를 통해 Jetson에 배포

🧠 주요 고민 & 해결

고민해결
서로 다른 네트워크에 있는 Jetson과 메인 서버 간 ROS2/파일 전송Tailscale VPN을 통해 가상 네트워크 구성
영상 스트리밍과 파일 업로드를 동시에 하려면?각 기능을 독립 프로세스로 실행하여 병행
ROS2로 영상도 전송할 수 있을까?가능하지만 고화질 영상은 topic보다 파일 전송이 더 안정적
Jetson이 ARM 기반인데 PC에서 만든 모델 쓸 수 있나?모델은 아키텍처 무관, 단 Jetson엔 별도 환경 설치 필요 (torch, torchvision for ARM)

🗂️ 정리된 시스템 구성

         [연구실 메인서버 (WSL2 + Docker + K8s)]
               ┌──────────────────────────┐
               │ - 딥러닝 학습 컨테이너    │
               │ - ROS2 수신 컨테이너     │
               │ - CI/CD, 웹 모니터링    │
               └────────────┬─────────────┘
                            │
            Tailscale VPN (가상 네트워크)
                            │
               ┌────────────┴─────────────┐
      [Jetson 자율주행차]            [Jetson 자율주행차]
    ┌──────────────────────┐      ┌──────────────────────┐
    │ - 카메라 녹화 + 업로드  │      │ - 실시간 스트리밍 서버 │
    │ - ROS2 센서 데이터 발행 │      │ - Docker + ROS2 실행    │
    └──────────────────────┘      └──────────────────────┘
[연구실 메인서버 (WSL2 + Docker + Kubernetes)]
┌────────────────────────────────────────────────────┐
│ [1] 딥러닝 학습 컨테이너                            │
│     - 영상데이터 학습 (PyTorch + CUDA + cuDNN)     │
│     - 모델 저장 및 테스트                          │
│                                                    │
│ [2] ROS2 수신 컨테이너                              │
│     - Jetson 차량의 위치, 상태, 센서데이터 수신    │
│     - /gps, /imu, /camera_info 등 ROS2 topic 수신   │
│                                                    │
│ [3] 실시간 스트리밍 수신 컨테이너                   │
│     - MJPEG or RTSP 영상 수신                       │
│     - 웹/GUI 연동 (RViz, Flask 웹뷰 등)             │
│                                                    │
│ [4] CI/CD + 웹 모니터링 컨테이너                    │
│     - GitHub Actions 또는 GitLab CI Runner 포함     │
│     - 모델/코드 변경 → Jetson에 자동 배포           │
│     - 실시간 차량 상태 웹 대시보드 제공             │
└────────────────────────┬────────────────────────────┘
                         │
           Tailscale VPN (가상 네트워크, 고정 가상 IP)
                         │
┌────────────────────────┴────────────────────────────┐
│                                                    │
│  [Jetson 자율주행차 A]                              │       [Jetson 자율주행차 B]
│ ┌───────────────────────────────┐         ┌───────────────────────────────┐
│ │ - 카메라 녹화 + 업로드 (cron + scp)     │         │ - 실시간 스트리밍 서버 (Flask/RTSP) │
│ │ - 영상 저장 후 주기적으로 메인 서버로 전송 │         │ - 외부 요청 시 영상 스트리밍 제공     │
│ │ - ROS2 센서 데이터 발행 (/imu, /gps 등) │         │ - Docker + ROS2 실행 환경 운영        │
│ └───────────────────────────────┘         └───────────────────────────────┘
│  (Tailscale 실행 중)                               │       (Tailscale 실행 중)
└────────────────────────────────────────────────────┘


✨ 앞으로 할 일

  • Tailscale 자동 실행 설정 (systemd 등록)
  • Jetson 영상 녹화 스크립트 최적화
  • CI/CD + Docker 자동 배포 워크플로 구성
  • Kubernetes 매니페스트 정의 및 k3s 연결
  • ROS2 + GPS 토픽 정제 및 시각화 (RViz / Web)

🏁 마무리

이번 구성은 에그/핫스팟 환경에서의 자율주행 로봇 원격 연결이라는 특수한 조건에서도
안정적인 데이터 전송과 제어를 가능하게 만드는 구조입니다.

실제 구현을 거치며 많은 시행착오가 있었지만,
결론적으로 Tailscale 기반 VPN + MJPEG 스트리밍 + cron 기반 업로드가 가장 간단하고 효과적인 조합이었습니다.

이 구조를 기반으로, CI/CD와 클러스터 관리까지 확장해 나가며
로봇 제어와 관제를 통합하는 ROS2 기반 자율주행 서비스 플랫폼을 완성할 예정입니다.


profile
지금까지 해온 여러 활동들을 간략하게라도 정리해보고자 합니다.

0개의 댓글