1. 개요

학습된 모델을 실제 RC카에서 동작하도록 하는 배포 단계는 Phase 2-C에서 다룹니다. 핵심 요구사항은 Jetson 환경에서 30Hz 추론 주기를 안정적으로 유지하는 것입니다.

2. 배포 파이프라인

flowchart LR
    A[PyTorch .pth] --> B[ONNX 변환]
    B --> C[TensorRT 빌드<br>FP16 우선]
    C --> D[ROS2 패키지<br>Jetson 배포]
    D --> E[RC카 실증]

3. 하드웨어 구성

구성 요소 사양
메인 컴퓨트 NVIDIA Jetson Xavier NX (8GB) 또는 Orin Nano
카메라 USB 카메라 (전방 1대, AVM은 Phase 3+)
차량 1/10 스케일 RC카
서보 컨트롤러 PCA9685 (I2C, 16채널)
배터리 3S LiPo 5,000mAh

4. ROS2 배포 토폴로지

graph TB
    subgraph Jetson
        FC[Front Cam Node<br>30Hz]
        IN[Inference Node<br>TRT FP16<br>~5ms]
        CN[Control Node<br>+ Safety Check]
        PWM[PWM Servo Node]
    end
    
    Cam[USB Camera] -->|V4L2| FC
    FC -->|/sensor/front| IN
    IN -->|/inference/cmd| CN
    CN -->|/control/vehicle_command| PWM
    PWM -->|I2C| Servo[PCA9685 → Servo]

5. 안전 정책 (Safety Properties)

설계 문서에는 10개의 명시적 안전 속성이 정의되어 있습니다. 주요 항목은 다음과 같습니다.

번호 속성
P1 추론 결과의 절댓값이 1.0을 초과하면 1.0으로 클리핑
P2 30Hz 주기를 200ms 이상 놓치면 비상 정지 발동
P3 카메라 입력이 1초 이상 끊기면 비상 정지
P4 충돌 감지 센서(범퍼) 신호 시 즉시 정지
P5 추론 출력의 NaN/Inf 검출 시 직전 명령 유지
P6 최대 속도(throttle)는 안전을 위해 0.3으로 제한
P7 조향 변화율은 0.5/tick 이내로 제한
P8 ROS2 노드 중 하나라도 죽으면 시스템 전체 정지
P9 배터리 전압 모니터링, 임계치 이하 시 안전 정지
P10 모든 명령은 1ms 이내에 PWM으로 전달되어야 함

6. 모델 변환 명령

# 1. ONNX 변환 (개발 머신에서)
python tools/export_onnx.py \
  --checkpoint checkpoints/bc_best.pth \
  --output bc_model.onnx

# 2. Jetson에서 TensorRT 빌드
trtexec \
  --onnx=bc_model.onnx \
  --saveEngine=bc_model_fp16.trt \
  --fp16 \
  --workspace=2048

# 3. ROS2 노드 빌드
cd ros2_ws && colcon build --packages-select sit_inference

7. 성능 목표

메트릭 목표 측정 방법
추론 지연 < 10ms (95%ile) rosbag 기록 후 분석
ROS2 제어 주기 ≥ 30Hz timer callback 카운트
직선 주행 거리 > 10m (충돌 없이) 실내 직선 코스
전력 소모 < 15W INA219 측정