정상적으로 젯슨 오린 나노 보드와 서버 워크스테이션이 통신이 제대로 되는지 테스트하기 위한 실험.
1. 환경 정보
워크스테이션
| OS | Linux Ubuntu |
| GPU | NVIDIA GeForce RTX 5090 (32GB VRAM) |
| CUDA 드라이버 | 580.126.09 |
| CUDA 버전 | 13.0 |
| Python 관리 | Miniconda |
| Python 버전 | 3.10.20 (conda env: yolov8_env) |
| PyTorch | 2.12.0.dev20260407+cu128 (nightly) |
| Ultralytics (YOLOv8) | 8.4.35 |
Jetson Orin Nano
| JetPack | 6.2.2 |
| OS | Ubuntu 22.04 |
| OpenCV | 4.5.4 (apt 설치) |
| Python | 3.x (시스템) |
| 카메라 | Logitech HD Pro Webcam C920 (/dev/video0) |
2. 시스템 아키텍처

통신 방식: HTTP (REST POST + MJPEG Streaming)
프레임 흐름: 캡처 → JPEG 인코딩 → POST → YOLOv8 추론 → 어노테이션 → MJPEG 스트림
3. 워크스테이션 설치 과정
3.1 Conda 환경 생성
conda create -n yolov8_envpython=3.10 -y
conda activate yolov8_env
3.2 PyTorch 설치
처음에는 안정 버전(cu124)을 설치했으나 RTX 5090 호환성 문제로 nightly로 교체 (이슈 1 참조):
pip install --pretorchtorchvisiontorchaudio \\
--index-urlhttps://download.pytorch.org/whl/nightly/cu128
설치된 버전: torch-2.12.0.dev20260407+cu128
3.3 YOLOv8 및 Flask 설치
pip install ultralyticsflask
4. Jetson 설치
1. IP 확인
ip addr show | grep "inet " | grep -v 127.0.0.1
2. 필수 패키지 설치
sudo apt update
sudo apt install ffmpeg python3 -pip -y
pip3 install requests opencv-python
3. 클라이언트 파일 전송 (워크스테이션에서)
- stream 하기위해 만든 파일을 jetson에 전송
5. 트러블슈팅
🔴 이슈 1: RTX 5090 CUDA 호환성 오류
발생 시점:
server.py 실행 후 젯슨에서 첫 프레임이 도착했을 때
에러 메시지:
NVIDIA GeForce RTX 5090 with CUDA capability sm_120 is not compatible
with the current PyTorch installation.
RuntimeError: CUDA error: no kernel image is available for execution on the device
원인 분석:
처음 설치한 PyTorch 2.6.0+cu124 정식 릴리스는 sm_50 ~ sm_90까지만 지원하여 sm_120용 커널 이미지가 바이너리에 포함되어 있지 않습니다. CUDA 드라이버는 13.0으로 최신이지만 PyTorch 바이너리 자체가 해당 아키텍처를 인식하지 못해 런타임 오류가 발생.
해결 방법:
PyTorch nightly 빌드(cu128)로 교체. Nightly 빌드는 최신 GPU 아키텍처(sm_120 포함)를 지원하며, CUDA 드라이버 13.0은 CUDA 12.8 런타임과 하위 호환.
pip uninstall torch torchvision torchaudio -y
pip install --pre torch torchvision torchaudio \\
--index-url <https://download.pytorch.org/whl/nightly/cu128>
결과: CUDA 정상 인식, sm_120 경고 없음, GPU 추론 정상 동작
🔴 이슈 2: Jetson에서 OpenCV 카메라 열기 실패
발생 시점:
jetson_client.py 실행 시
에러 메시지:
WARN: global cap_v4l.cpp:914 open VIDEOIO(V4L2:/dev/video0): can't open camera by index
WARN: backend is generally available but can't be used to capture by index
WARN: backend is generally available but can't be used to capture by name
원인 분석:
Jetson에 설치된 OpenCV 모두 카메라 캡처가 불가능한 것으로 확인.
- pip opencv-python: ARM64 Linux용 바이너리에 V4L2 캡처 미포함
- apt python3-opencv v4.5.4: 시스템 패키지임에도 V4L2·GStreamer 모두 NO로 컴파일됨
python3-c"import cv2; print(cv2.getBuildInformation())" | grep-E"V4L|GStream"
# 결과: GStreamer: NO
JetPack 기본 설치 OpenCV는 GStreamer를 지원해야 하나, 이 보드에 설치된 빌드는 해당 기능이 비활성화 상태.
해결 방법:
OpenCV 카메라 API를 완전히 우회하고 ffmpeg subprocess로 카메라 프레임을 직접 읽습니다. ffmpeg는 자체 V4L2 구현을 가지므로 OpenCV 빌드 상태와 무관하게 동작.
cmd = [
"ffmpeg","-f","v4l2","-input_format","mjpeg",
"-video_size","640x480","-framerate","30",
"-i","/dev/video0",
"-f","rawvideo","-pix_fmt","bgr24","-"
]
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
raw = process.stdout.read(640 *480 *3)
frame = np.frombuffer(raw, dtype=np.uint8).reshape((480,640,3))
C920은 MJPEG 포맷으로 캡처하고, 실패 시 YUYV로 자동 fallback됨.
🔴 이슈 3: 카메라 장치 점유 오류
발생 시점: ffmpeg로 카메라 테스트 시
에러 메시지:
/dev/video0: Device or resource busy
원인 분석:
이전 실행에서 OpenCV가 카메라 열기에 실패했지만, 파이썬 프로세스(PID 5444)가 /dev/video0의 파일 디스크립터를 해제하지 않은 채 백그라운드에 남아 있었습니다. lsof로 점유 확인:
lsof/dev/video0
# python 5444 jetbot 3u CHR 81,0 /dev/video0
해결 방법:
점유 프로세스를 강제 종료.
sudo fuser -k /dev/video0
# 또는
kill -9 5444
6. 실행
워크스테이션
conda activate yolov8_env
cd ~/yolov8_stream
python server.py
정상 시작 확인:
✅ YOLOv8 서버 시작 | <http://0.0.0.0:5000>
모델: yolov8n.pt | 신뢰도 임계값: 0.5
Jetson Orin Nano
# 카메라 점유 해제 (필요 시)
sudo fuser -k /dev/video0
# 클라이언트 실행
python3 jetson_client.py
7. 결과

'Physical AI (피지컬 AI)' 카테고리의 다른 글
| Nvidia Jetson Orin nano (YOLOv8) 자체 성능 테스트 (0) | 2026.05.23 |
|---|---|
| NVIDIA SDK Manager를 이용하여 Jetpack Flash. (0) | 2026.04.02 |
| Physical AI란 무엇인가? (0) | 2026.01.05 |