학생이 직접 시연하여 ESP32-CAM 자동차에게 자율주행을 가르치는 교육용 시스템
기존 auto_car/ 프로젝트의 9단계 커리큘럼은 차선 인식·P 제어·YOLO 등을 명시적으로
프로그래밍해서 자율주행을 구현했습니다. 이 폴더(imitation_learning_car)는
같은 하드웨어로 데이터 기반 학습을 다루는 7가지 방식을 제공합니다.
학생은 "사람이 어떻게 운전하는지"를 보여주기만 하면 자동차가 그 행동을 따라하게 됩니다.
| # | 방식 | 어떻게 가르치는가 | 학습 방식 | 추천 단계 |
|---|---|---|---|---|
| 1 | Hand Demonstration | 카메라 앞에서 손 제스처 | 시간 시퀀스 녹화 → 재생 | 체험용 (학습 비권장) |
| 2 | Manual Teaching | 키보드 WASD로 직접 조작 | 키 입력별 스냅샷 녹화 → 재생 | 입문 |
| 3 | ML Imitation | 트랙 주행을 여러 번 반복 | 카메라 픽셀 → (speed, steering) 회귀 학습 | 심화 |
| 4 | Position Teaching | 트랙 주요 지점에서 자세 스냅 | KNN(K=3) 가중평균 추론 | 중급 |
| 5 | Joystick Teaching | PS4/Xbox 아날로그 스틱으로 운전 | 부드러운 시퀀스 녹화/재생 + ML 데이터 수집 | 입문~심화 |
| 6 | Phone Teaching | 스마트폰 기울기/버튼으로 운전 | 시퀀스 녹화/재생 + ML 데이터 수집 | 입문~심화 |
| 7 | OpenCV Auto-Collect | OpenCV 차선추종(전문가)이 직접 운전 | 사람 없이 (화면→명령) 자동 수집 → 모드3/4 학습 | 데이터 자동생성 |
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차시 교재 목차
| 채널 | 범위 | UDP |
|---|---|---|
| Speed | 0~255 | UDP JSON {"speed": N} |
| Steering | 30~150 (90=직진) | UDP JSON {"steering": N} |
| Camera | ESP32-CAM MJPEG | http://IP:80/stream |
키보드 W/A/S/D로 직접 운전. 각 키 입력 시점의 (speed, steering) 스냅샷을 저장하고 P 키로 재생.
Ridge 회귀는 learning_modes/ml_imitation.py:RidgeRegressor에 numpy만으로 17줄로 구현되어 있습니다.
같은 데이터를 모으되, 학습 단계 없이 즉시 사용: 현재 프레임과 가장 가까운 3개 티칭 포인트를 찾아 거리 가중평균으로 (speed, steering) 결정.
왼쪽 스틱으로 운전. C로 ML capture 켜면 주행 중 (화면 특징 + 명령)을 모드 3 dataset에 자동 저장.
컨트롤러: PS4/Xbox를 USB로 연결 권장 (pip install pygame).
폰이 노트북 핫스팟에 접속해 노트북의 조종 페이지를 열고, 기울기/버튼으로 운전. 추가 패키지 불필요. 버튼 조향은 HTTP로 즉시, 기울기 조향은 HTTPS 우회 필요.
| 차시 | 모드 | 학습 목표 |
|---|---|---|
| 1 | 0 (기존 단계 8 P 제어) | "프로그래머가 직접 짠 자율주행" 체험 |
| 2 | 2 (Manual Teaching) | "시퀀스 = 프로그램" 개념 |
| 보충 | 5 (Joystick Teaching) | 디지털 vs 아날로그 입력 |
| 보충 | 6 (Phone Teaching) | 노트북 허브 구조 |
| 3 | 1 (Hand Demonstration) | "사람 동작을 모방하는 로봇" |
| 4 | 4 (Position Teaching) | KNN 보간 — 가장 단순한 ML |
| 5 | 3 (ML Imitation) | 다항회귀 학습, 일반화 |
| 6 | 3 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 디버그 로그