
연구실 내 **메인 서버(WSL2 + Ubuntu 22.04)**를 중심으로,
외부에서 운행 중인 Jetson 기반 자율주행 차량과 다음 기능을 수행하는 시스템을 구축한다:
| 기술 | 역할 |
|---|---|
| Docker | 각 기능(딥러닝 학습, ROS2, 스트리밍 등)을 컨테이너화하여 독립 실행 |
| Kubernetes (k3s) | Jetson과 서버를 하나의 클러스터로 묶어 컨테이너를 오케스트레이션 |
| CI/CD (GitHub Actions or GitLab CI) | 메인 서버에서 학습된 모델 및 자율주행 코드를 자동 빌드·배포 |
| ROS2 Humble | 차량 내부 ROS2 토픽 처리 및 서버와의 위치/상태 통신에 사용 |
| Tailscale VPN | Jetson과 메인 서버가 서로 다른 네트워크(에그/LAN)에 있어도 통신 가능 |
| PyTorch + CUDA + cuDNN | GPU 학습 최적화된 환경에서 영상 데이터 학습 |
| Flask + OpenCV | Jetson에서 실시간 MJPEG 스트리밍 서버 운영 |
cron으로 매시간 스크립트 자동 실행scp 전송# 예시 cronjob
0 * * * * /usr/bin/python3 /home/jetson/upload_video.py
port 8000)# 접속 URL
http://<Jetson tailscale IP>:8000/video_feed
메인 서버에서 수신된 영상을 기반으로 PyTorch 학습
학습 완료 시 CI/CD가 자동으로:
| 고민 | 해결 |
|---|---|
| 서로 다른 네트워크에 있는 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 실행 중)
└────────────────────────────────────────────────────┘
systemd 등록)이번 구성은 에그/핫스팟 환경에서의 자율주행 로봇 원격 연결이라는 특수한 조건에서도
안정적인 데이터 전송과 제어를 가능하게 만드는 구조입니다.
실제 구현을 거치며 많은 시행착오가 있었지만,
결론적으로 Tailscale 기반 VPN + MJPEG 스트리밍 + cron 기반 업로드가 가장 간단하고 효과적인 조합이었습니다.
이 구조를 기반으로, CI/CD와 클러스터 관리까지 확장해 나가며
로봇 제어와 관제를 통합하는 ROS2 기반 자율주행 서비스 플랫폼을 완성할 예정입니다.