자율주행 자동차 모방학습 (Imitation Learning Car)

학생이 직접 시연하여 ESP32-CAM 자동차에게 자율주행을 가르치는 교육용 시스템

프로젝트 개요

기존 auto_car/ 프로젝트의 9단계 커리큘럼은 차선 인식·P 제어·YOLO 등을 명시적으로 프로그래밍해서 자율주행을 구현했습니다. 이 폴더(imitation_learning_car)는 같은 하드웨어로 데이터 기반 학습을 다루는 7가지 방식을 제공합니다.

학생은 "사람이 어떻게 운전하는지"를 보여주기만 하면 자동차가 그 행동을 따라하게 됩니다.

7가지 학습 방식

#방식어떻게 가르치는가학습 방식추천 단계
1Hand Demonstration카메라 앞에서 손 제스처시간 시퀀스 녹화 → 재생체험용 (학습 비권장)
2Manual Teaching키보드 WASD로 직접 조작키 입력별 스냅샷 녹화 → 재생입문
3ML Imitation트랙 주행을 여러 번 반복카메라 픽셀 → (speed, steering) 회귀 학습심화
4Position Teaching트랙 주요 지점에서 자세 스냅KNN(K=3) 가중평균 추론중급
5Joystick TeachingPS4/Xbox 아날로그 스틱으로 운전부드러운 시퀀스 녹화/재생 + ML 데이터 수집입문~심화
6Phone Teaching스마트폰 기울기/버튼으로 운전시퀀스 녹화/재생 + ML 데이터 수집입문~심화
7OpenCV Auto-CollectOpenCV 차선추종(전문가)이 직접 운전사람 없이 (화면→명령) 자동 수집 → 모드3/4 학습데이터 자동생성
방식 1 (손 제스처) = 체험용 — 손 인식이 불안정해 학습 데이터로는 비권장.
방식 7 (OpenCV 자동수집) — 규칙기반 차선추종(단계8)이 전문가처럼 직접 운전하며 자동 저장. 독립 실행: python opencv_autocollect.py --ip <IP>

빠른 시작

pip install opencv-python numpy mediapipe pygame

python main_learning.py           # 메뉴에서 모드 선택
python main_learning.py 2         # 모드 바로 시작
python main_learning.py --no-car  # 자동차 없이 GUI만 테스트
python main_learning.py --ip 192.168.137.74  # IP 지정

폴더 구조

imitation_learning_car/
├─ main_learning.py             # 통합 진입점 (7모드 메뉴)
├─ ui_common.py                 # 공통 대시보드
├─ car_adapter.py               # UDPSender + VideoStream 어댑터
├─ learning_modes/              # 7가지 모드 + 공통 유틸
│  ├─ hand_demonstration.py     #   방식 1
│  ├─ manual_teaching.py        #   방식 2
│  ├─ ml_imitation.py           #   방식 3 (Ridge 회귀, numpy 자체구현)
│  ├─ position_teaching.py      #   방식 4 (KNN)
│  ├─ joystick_teaching.py      #   방식 5 (pygame)
│  └─ phone_teaching.py         #   방식 6 (http.server)
├─ demonstrations/              # 학생 시연 데이터
├─ models/                      # ridge_model.npz (방식 3 학습 결과)
├─ STUDENT_GUIDE.html           # 학생용 단계별 실습
└─ 교재/README.html             # 6차시 교재 목차

자동차 API

채널범위UDP
Speed0~255UDP JSON {"speed": N}
Steering30~150 (90=직진)UDP JSON {"steering": N}
CameraESP32-CAM MJPEGhttp://IP:80/stream

학습 방식별 상세

방식 2: Manual Teaching

키보드 W/A/S/D로 직접 운전. 각 키 입력 시점의 (speed, steering) 스냅샷을 저장하고 P 키로 재생.

방식 3: ML Imitation (Ridge 회귀)

  1. 학생이 트랙을 직접 운전
  2. T 키로 현재 (카메라 프레임 특징, 명령) 짝을 데이터셋에 추가
  3. 최소 10개 이상 모으면 M 키로 Ridge 선형회귀 학습
  4. G 키로 자율주행 모드 진입

Ridge 회귀는 learning_modes/ml_imitation.py:RidgeRegressor에 numpy만으로 17줄로 구현되어 있습니다.

방식 4: Position Teaching (KNN)

같은 데이터를 모으되, 학습 단계 없이 즉시 사용: 현재 프레임과 가장 가까운 3개 티칭 포인트를 찾아 거리 가중평균으로 (speed, steering) 결정.

방식 5: Joystick Teaching

왼쪽 스틱으로 운전. C로 ML capture 켜면 주행 중 (화면 특징 + 명령)을 모드 3 dataset에 자동 저장.

컨트롤러: PS4/Xbox를 USB로 연결 권장 (pip install pygame).

방식 6: Phone Teaching

폰이 노트북 핫스팟에 접속해 노트북의 조종 페이지를 열고, 기울기/버튼으로 운전. 추가 패키지 불필요. 버튼 조향은 HTTP로 즉시, 기울기 조향은 HTTPS 우회 필요.

추천 수업 흐름

차시모드학습 목표
10 (기존 단계 8 P 제어)"프로그래머가 직접 짠 자율주행" 체험
22 (Manual Teaching)"시퀀스 = 프로그램" 개념
보충5 (Joystick Teaching)디지털 vs 아날로그 입력
보충6 (Phone Teaching)노트북 허브 구조
31 (Hand Demonstration)"사람 동작을 모방하는 로봇"
44 (Position Teaching)KNN 보간 — 가장 단순한 ML
53 (ML Imitation)다항회귀 학습, 일반화
63 vs 4 비교 실험학습 vs 보간의 차이 정량 측정

자세한 내용은 STUDENT_GUIDE 참고.

명령행 옵션

python main_learning.py [mode] [options]

mode             1~6 (생략 시 메뉴)
--ip 192.168.X.X ESP32-CAM IP
--webcam 0       방식 1에서 사용할 웹캠 인덱스
--joystick 0     방식 5에서 사용할 조이스틱 인덱스
--phone-port 8080 방식 6 폰 조종 서버 포트
--no-car         자동차 없이 더미로 GUI 테스트
-v               디버그 로그