홍쌤의 인포클래스AI + X · 기술 블로그

← 목록

[10/17 강의자료] 카메라로 보고 스스로 피하는 제봇: Jetson Orin Nano 자율주행 6시간

작성 2026.10.18 · 수정 2026.10.28 · 홍창민

10월 17일 매원고등학교에서 진행한 6시간 강의 자료예요. 카메라로 보고, Jetson Orin Nano가 판단하고, 두 바퀴로 움직이는 제봇(JetBot)을 학생이 한 단계씩 직접 확인하며 만드는 과정입니다. 강의 슬라이드, 실습 코드, 학습된 모델, 교사용 안내까지 한 폴더에 모았고, 맨 아래에 받는 방법을 적어 두었습니다.

카메라 자율주행 제봇 한눈에 보기: 장비 연결 · 프로그램 동작 · 모델 학습

무엇을 만드나

제봇은 세 부분으로 나눠 생각하면 쉬워요.

  1. 장비 연결: USB 카메라 → Jetson Orin Nano → L298N 모터 드라이버 → 좌·우 모터. Jetson은 개발자 키트 기본 19V 어댑터로, 모터는 따로 2S LiPo(7.4V, 완충 8.4V) 배터리로 전원을 넣고 GND를 공통으로 묶습니다.
  2. 프로그램 동작: 영상 읽기 → 숫자 9개로 바꾸기(화면을 5구역으로 나눠 얼마나 막혔는지 등) → 판단(규칙 기반 또는 학습 정책) → 정지 확인 → 바퀴 명령. 움직인 뒤 바뀐 화면을 받아 다시 판단해요.
  3. 모델: 장애물을 피하는 정책은 2D 시뮬레이션(Gymnasium + PPO)에서 따로 학습해 PT·ONNX로 변환한 뒤 Jetson에서 실행합니다.

이 자료에서 제일 강조한 것은 "계산만 하는 DRY"와 "실제 모터를 돌리는 REAL"을 분리하는 습관이에요. 같은 녹화 영상으로 먼저 계산 결과를 확인하고, 교사가 배선과 정지를 확인한 조만 낮은 출력으로 짧게 실제 주행을 하도록 했어요.

6시간 흐름

시간 내용
0:00~0:20 목표·역할·안전, 폴더와 안내서 열기
0:20~1:10 로그인, 터미널, 가상환경, Python 파일 열기·편집·실행
1:20~2:15 전원·L298N 배선, PWM 설정, 바퀴를 공중에 띄우고 1초 시험
2:25~3:10 USB 카메라 찾기, 사진·영상, YOLO로 물체 찾기와 실패 관찰
3:10~3:50 5구역 규칙, 정지 조건, 숫자 하나 바꿔 보기, 낮은 출력 주행
4:00~4:50 9개 관측값과 2개 행동, PT/ONNX, 같은 100프레임으로 규칙과 비교
5:00~6:00 Isaac 가상 로봇 관찰, 짧은 추가 학습·변환·평가, 팀별 발표

쉬는 시간 10분을 네 번 넣었어요. 슬라이드는 186장이지만 다 강의하는 분량은 아니에요. 본문을 따라가고, 부록(Windows·macOS 설치, SSH, JetPack 설치, 오류 해결)은 막혔을 때 찾아갑니다.

10단계로 하나씩 확인하기

학생이 "지금 어디까지 됐는지"를 스스로 알 수 있게 10단계 실행기를 만들었어요. 단계마다 명령 하나를 실행하면 PASS·WAIT·FAIL·DEMO 중 하나가 나오고, 결과가 outputs/10단계_점검/…/전체현황.html에 쌓입니다.

단계 하는 일 어디서
01 환경과 파일 Python·패키지·모델 파일, 실제 행렬 연산 확인 Jetson·노트북
02 Python과 방향 계산 예제 3개, 오른쪽 조향·정지 계산 Jetson·노트북
03 USB 카메라 한 장 찍어 저장 카메라 연결 장비
04 YOLO 사진 추론 동봉 사진으로 물체 찾기 Jetson·노트북
05 규칙 기반 DRY 녹화 영상 100프레임으로 주행값 계산(모터 OFF) Jetson·노트북
06 학습 모델 DRY PT·ONNX 각각 100프레임, 두 결과가 같은지 Jetson·노트북
07 실모터 방향 시험 바퀴 공중에서 좌·우·전진·회전 1초씩 교사와 함께
08 5초 실차 주행 실카메라 DRY 뒤 낮은 출력으로 5초 교사와 함께
09 추가 학습과 비교 1,024스텝 추가 학습 → 변환 → 기존/새 모델 평가 노트북·교사 Spark
10 Isaac 가상 로봇 공식 Jetbot 예제의 직진·회전·정지 관찰 교사 Spark

WAIT는 실패가 아니라 "이전 단계나 사람의 확인이 필요하다"는 뜻이에요. 07·08은 기본으로 WAIT이고, 교사가 옆에서 보고 정상이라고 입력해야 PASS가 됩니다. 프로그램이 배선이나 안전을 대신 보증하지 않게 만들고 싶었어요.

# 02_실습코드 폴더에서 (Windows는 같은 번호의 .cmd)
bash 단계별_10단계/01_environment.sh          # 처음이면 --install
bash 단계별_10단계/05_rule_dry.sh
bash 단계별_10단계/07_motor.sh --real --arm     # 교사와 함께, 바퀴를 띄운 채로

YOLO 점수는 안전 확률이 아니다

교실에서 찍은 사진을 YOLO로 추론한 결과: 의자·모니터·마우스

04단계에서는 YOLO로 사진 속 물체를 찾아요. 활동지에 꼭 넣은 질문은 "점수가 높으면 그 길이 안전한가?"예요. 0.87은 "모니터일 가능성"이지 "부딪히지 않을 확률"이 아니에요. 그래서 제봇의 기본 판단은 YOLO 결과가 아니라 화면 5구역이 얼마나 막혔는지로 하고, YOLO는 보조로만 씁니다. 검출이 0개여도 프로그램 오류가 아닐 수 있어서, 놓친 물체와 잘못 찾은 물체를 활동지에 적게 했어요.

규칙과 학습 정책을 같은 영상으로 비교

규칙 기반은 사람이 정한 if 조건이에요(예: 가운데가 막히면 오른쪽으로). 학습 정책은 같은 9개 숫자를 받아 두 바퀴 값을 내는 신경망이에요. 두 방식에 같은 녹화 영상의 첫 100프레임을 넣고 어떤 조향을 골랐는지 비교했어요. 한 가지 숫자만 바꾸고 나머지 조건은 고정해서 결과를 비교하는 것이 이 수업의 실험 규칙입니다.

원본 장애물 회피 정책의 학습 곡선: 보상과 무충돌률

정책은 2D 시뮬레이션에서 약 2천만 스텝 목표로 학습한 모델이에요(실제로 저장된 체크포인트는 13,748,352스텝). 이 곡선은 원본 학습 때의 그림이고, 원시 기록이 없어서 이번에 같은 수치를 다시 만들어 보지는 못했어요. 수업 중 학생이 해 보는 1,024스텝 추가 학습은 학습 → 변환 → 평가 흐름을 체험하는 짧은 실행이지, 모델이 좋아졌다는 증거가 아니라고 슬라이드에 분명히 적었어요.

Isaac은 교사 DGX Spark에서 NVIDIA 공식 Jetbot 예제를 띄워 "왼쪽 바퀴가 더 빠르면 어느 쪽으로 도는지"를 눈으로 확인하도록 구성했어요. 제공한 모델 자체는 Isaac이 아니라 2D 환경에서 학습한 것이라 슬라이드에서 그 차이도 함께 설명합니다.

안전 규칙

자료를 준비하며 고친 것

이전에 쓰던 자료(71장)를 186장으로 늘리면서 코드와 설명을 처음부터 다시 맞췄어요. 기억에 남는 것만 적으면:

확인한 것과 못 한 것

자료를 만든 macOS 컴퓨터(CPU)에서는 01·02·04·05·06·09단계를 실제로 실행했고, 자동 테스트 15개가 통과했어요. PT·ONNX 변환 뒤 1,000개 관측값의 최대 차이는 0.0000013이었습니다.

반대로 Jetson의 CUDA·실제 USB 카메라·물리 배선과 모터·배터리·실차 주행·DGX Spark의 Isaac 실행·Windows 설치는 그 컴퓨터에서 검증하지 못했어요. 그래서 05_교사용안내/교사_리허설체크리스트.txt에 실물로 확인할 순서를 따로 적어 두었습니다. 이 자료로 수업하실 분은 꼭 수업 전에 리허설해 주세요.

학생 활동지에서 고른 질문

마지막 문장 틀을 일부러 넣었어요. 확인하지 못한 것을 스스로 말하게 하는 연습이 실험보다 더 중요하다고 생각해서요.

자료 받기

Google Drive 폴더: 10월 17일 매원고 강의자료 열기

폴더 들어 있는 것
01_강의자료 186장 슬라이드(PPTX), 따라하기 HTML, 10단계 실행기, 한 장 요약 그림
02_실습코드 제봇 코드(카메라·판단·모터), 학습·평가·변환, Isaac 실행 스크립트
03_모델 장애물 회피 정책(PT·ONNX·정규화), YOLO11n
04_실행이미지_영상 실행 화면·결과 사진·녹화 영상
05_교사용안내 6시간 운영안, 강의 대본, 배선 확인표, 리허설 체크리스트, 활동지
06_검증기록 이번에 실제로 돌려 본 기록(무엇을 확인했고 무엇을 못 했는지)

Jetson(JetPack 6 / Ubuntu 22.04) 터미널에서 폴더를 통째로 받으려면 아래를 순서대로 붙여 넣으세요. 홈 폴더의 maewon-1017에 저장되고, 중간에 끊기면 2번 명령만 다시 실행하면 이어서 받습니다.

# 1. 다운로드 도구 설치
sudo apt update
sudo apt install -y python3-venv
python3 -m venv ~/.venvs/lecture-download
~/.venvs/lecture-download/bin/pip install "gdown==6.4.2"

# 2. 강의자료 폴더 전체 다운로드
~/.venvs/lecture-download/bin/gdown \
  --folder --continue --retries 3 --timeout 30 \
  'https://drive.google.com/drive/folders/1imDy7aCbz5ks4iAQqaI_AKNwcX37g-mp?usp=sharing' \
  -O "$HOME/maewon-1017/"