안내 · 기본 내용과 사용법
꽥꽥이 필드랩 안내
카메라 두 대로 필드를 보고, 고전 컴퓨터비전으로 로봇과 공을 찾고, 규칙 → 모방 → 강화 순서로 판단을 만들어 봅니다. 이번 주는 브라우저 시뮬레이터에서, 다음 주는 실물 로봇과 실물 카메라로 같은 코드를 돌립니다.
01수업 개요
네 조가 각자 주제를 정해 같은 필드(900×600mm 매트) 위에서 작업합니다. 로봇은 모두 같은 기종의 두 발 보행 로봇이며, 머리 위 모자 ArUco 번호로만 구분합니다: A(10) · B(20) · C(30) · D(40). 시뮬레이터에서는 2대2까지, 실물은 조마다 2대(1대1)를 씁니다.
| 층 | 무엇을 | 도구 |
|---|---|---|
| 인식 | 렌즈 보정, 바닥 호모그래피, 로봇·공 위치와 방향 | 체커보드 보정, ArUco, 호모그래피, HSV, Canny |
| 판단 1 · 규칙 | 사람이 짠 규칙(FSM, 기하 계산)으로 움직이기 | Python 함수 |
| 판단 2 · 모방 | 사람(또는 규칙 교사)의 조종 기록을 따라 하는 신경망 | 시연 기록 → MLP |
| 판단 3 · 강화 | 보상을 정하고 스스로 나아지는 정책 | Gymnasium 환경, PPO |
| 실물 | 카메라와 로봇만 실물로 바꿔 같은 코드 실행 | USB 웹캠 2대, Wi-Fi 로봇 명령 |
조별 주제
| 조 | 주제 | 핵심 |
|---|---|---|
| 1조 | 라인아웃 VAR | 공이 골라인 안/밖인지 판정. 카메라 B 를 골라인 수직면에 둠. YOLO-Seg 비교용 자동 라벨 |
| 2조 | 1대1 공격 | 규칙 교사 → 모방 MLP → PPO. 연속 명령 (v, ω) |
| 3조 | 포켓몬 축구 | 공유 자율: 정책이 움직이고 키보드·가상 컨트롤러 입력이 들어오면 사람이 덮어씀 |
| 4조 | 점령전 | FSM + Point-in-Polygon 점령 판정, ArUco 위치 |
일정
| 날짜 | 내용 |
|---|---|
| 11/10–11/11 | 필드랩 v0.1: 가상 카메라 2대, 체커보드·호모그래피 보정 실습, 조별 필드 4종, 규칙 API |
| 11/12–11/13 | 학습 도구: Gymnasium 환경, 키보드 시연 기록기, 모방학습·PPO 예제(조별 1개씩), 채점 스크립트 |
| 11/14 | 실물 준비: 카메라 2대 연결·보정 절차, 로봇 명령 연결, 1대 실측으로 걸음 거리·회전각 교체 |
| 다음 주 | 실물 적용: 카메라만 바꿔 인식 검증 → 감독 아래 한 동작씩 → 규칙 정책 → 학습 정책 비교 |
02필드 규격
아래 값은 시뮬레이터와 PC 패키지가 함께 쓰는 기준 파일 fieldspec.json(판 )에서 그대로 그렸습니다. 단위는 m(표에는 mm로 환산), 원점은 매트 중심, +x 는 2팀 골대 쪽, +y 는 카메라 A 화면 위쪽, z 는 위입니다.
로봇 크기·걸음 거리·속도는 실측 전 가정값입니다. 11/14 실측 뒤 fieldspec.json 을 고치고 업데이트 내역에 올립니다.
03마커
모자 마커는 마커의 0행(위쪽 변)이 로봇 앞쪽을 향하도록 붙입니다. 모자 높이가 바닥에서 약 150mm 이므로, 바닥 호모그래피로 구한 위치는 카메라에서 먼 쪽으로 밀려 보입니다. 높이를 고려해 보정하세요.
보정 격자판 번호 규칙:
04카메라 추천과 설치
조당 2대, 1080p UVC 웹캠(드라이버 없이 꽂으면 되는 제품), 노출·초점을 수동으로 고정할 수 있는 것, 수평 화각 약 70~78°. 예: Logitech C920/C922급.
실제 설치 위치
방향 정하기: 매트의 긴 변 앞에 서서 1팀 골대가 왼쪽, 2팀 골대가 오른쪽이 되게 섭니다. 내가 선 쪽이 "앞 긴 변"이고, 카메라 A 화면의 아래쪽입니다. 높이는 모두 매트 면 기준입니다(책상 75cm 위라면 바닥 기준으로 75cm 를 더하세요).
| 카메라 | 놓는 곳 (위에서 볼 때) | 높이 (매트 면 기준) | 향하는 곳 |
|---|---|---|---|
| A (모든 조) | 매트 중앙 바로 위 (앞쪽으로 2cm) | 90cm | 바로 아래. 네 귀 마커가 모두 보여야 함 |
| B (2·3·4조) | 1팀 골대 쪽 앞 귀퉁이의 대각선 바깥: 매트 왼쪽 끝에서 25cm, 앞 긴 변에서 30cm 바깥 (귀퉁이에서 약 40cm) | 80cm | 매트 중앙, 약 41° 내려다봄 |
| B (1조) | 2팀 골라인 바깥 가장자리를 앞으로 늘린 선 위, 앞 긴 변에서 32cm 바깥 | 20cm | 골라인을 따라 뒤 긴 변 쪽 정면, 약 15° 내려다봄 |
- 카메라 B 는 책상 밖으로 나갈 수 있습니다. 매트 둘레 책상 여유가 30cm 보다 좁으면 책상 모서리 집게 스탠드나 바닥 삼각대를 씁니다.
- 위치가 몇 cm 어긋나도 보정이 실제 위치를 다시 구하므로 괜찮습니다. 단, 1조 카메라 B 는 렌즈 중심이 골라인과 같은 수직면에 있어야 합니다. 화면에서 골라인이 세로 직선 한 줄로 보이면 맞습니다.
- 보정한 뒤에는 거치대를 테이프로 고정하고 건드리지 않습니다. 움직였다면 다시 보정합니다.
- 교실 사정으로 위치를 바꿔야 하면 요청 게시판에 실제 위치(cm)를 올려 주세요. 시뮬레이터 카메라도 같이 맞춰 드립니다.
설치 순서
- 카메라 A 를 매트 중심 위 약 0.9m 높이에 아래를 보게 고정합니다. 화면에 네 귀 마커가 모두 들어와야 합니다.
- 카메라 B 를 위 표의 위치에 고정합니다(2·3·4조: 1팀 쪽 앞 귀퉁이 대각선 바깥 80cm 높이, 1조: 2팀 골라인 연장선 위 20cm 높이). 흔들리지 않는 거치대를 쓰세요.
- 두 카메라를 서로 다른 USB 포트(가능하면 앞·뒤 포트처럼 다른 컨트롤러)에 꽂습니다. 1080p MJPEG 두 개는 대역폭을 많이 씁니다.
- 자동 노출·자동 초점·자동 화이트밸런스를 끕니다. 끄지 않으면 HSV 임계값이 시간에 따라 흔들립니다.
- 카메라마다 따로 체커보드 15~20장 이상으로 K·D 를 구합니다. 같은 모델이어도 개체마다 값이 다릅니다.
- 바닥 호모그래피는 네 귀 마커 4점만 쓰지 말고 격자판 24점을 함께 써서 오차를 확인합니다(4점만 쓰면 오차가 항상 0으로 보입니다).
계산 예: 화각 74° 카메라를 0.9m 높이에 두면 바닥 폭 약 1.36m 가 보이고, 1080p(1920px)에서 1mm 당 약 1.4px. 70mm 모자 마커는 약 100px, 탁구공(지름 40mm)은 약 56px 로 찍힙니다.
05시뮬레이터 사용법
- 조 선택: 조마다 필드와 카메라 배치가 다릅니다. 자기 조를 고릅니다.
- 방 만들기: 조 대표 PC 한 대가 방 만들기를 누릅니다. 방을 만든 PC가 경기 물리를 계산합니다.
- 참가: 조원은 로봇마다 다른 PC에서 참가 코드를 넣거나, 방장이 참가 링크 복사로 보내 준 로봇별 링크를 엽니다. 한 PC = 로봇 하나.
- 경기 탭: 방장이 경기 시작·일시정지·위치 초기화, 경기 시간(3분/5분), 속도(1·2·4배)를 정합니다. 시연 기록 저장은 모방학습 데이터가 됩니다.
- 혼자 해 보기는 방 없이 보정 실습만 하는 모드입니다.
조종
| 동작 | 키보드 | 화면 가상 컨트롤러 |
|---|---|---|
| 전진 | ↑ 또는 W | ↑ 전진 |
| 후진 | ↓ 또는 S | ↓ 후진 |
| 왼쪽 회전 | ← 또는 A | ← 좌회전 |
| 오른쪽 회전 | → 또는 D | → 우회전 |
| 대기 | 스페이스 | 대기 |
누르고 있으면 계속 걷습니다. 게임패드(USB·블루투스)를 연결하면 방향 입력으로 쓸 수 있습니다. 휴대폰·태블릿에서는 화면 가상 컨트롤러를 씁니다.
카메라 탭
가상 카메라의 해상도(960×540 · 1280×720 · 640×360), fps(5·10·15), 렌즈 왜곡 켜기/끄기, 잡음·밝기를 바꿉니다. 정답 탑뷰는 실제 위치를 보여 주므로 인식 결과를 검증할 때만 켜세요.
06보정 실습 탭
- 카메라 A 또는 B 를 고르고 보드 옮기기로 체커보드(내부 코너 9×6, 칸 25mm)를 여러 자세로 놓으며 이 장면 저장을 15장 이상 누릅니다. 기울기·위치를 고르게 섞으세요.
- 보드 치우기 → 격자판 깔기로 바닥에 ArUco 격자판(24개, 40mm)을 깔고 바닥 장면 저장 (호모그래피용)을 누릅니다. 비스듬한 카메라 B 는 네 귀 마커가 작게 보여 놓치기 쉬우니 격자판을 꼭 쓰세요.
- ZIP 내려받기: PNG 영상, 체커보드 3D 점, 정답(K, D, 카메라 자세)이 따로 들어 있습니다. 정답 파일은 보정을 끝낸 뒤 열어 비교하세요.
- PC에서
cv2.findChessboardCorners→cv2.calibrateCamera로 K·D 를 구하고, 왜곡을 편 뒤 격자판 점으로cv2.findHomography를 구합니다.
import cv2, glob, numpy as np
pattern = (9, 6); square = 0.025
objp = np.zeros((9*6, 3), np.float32)
objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2) * square
objs, imgs = [], []
for f in glob.glob("calib/A_*.png"): # ZIP 안의 실제 파일 이름에 맞추세요
g = cv2.imread(f, cv2.IMREAD_GRAYSCALE)
ok, c = cv2.findChessboardCorners(g, pattern)
if ok:
c = cv2.cornerSubPix(g, c, (11, 11), (-1, -1), (3, 30, 1e-3))
objs.append(objp); imgs.append(c)
rms, K, D, _, _ = cv2.calibrateCamera(objs, imgs, g.shape[::-1], None, None)
print("재투영 오차", rms)
07PC Python 패키지 (fieldlab-py) 배포 중 · 11/9
Windows PC에서 같은 필드를 MuJoCo 물리 + OpenCV 창으로 돌리는 패키지입니다. 브라우저 시뮬레이터와 같은 fieldspec.json·같은 규칙을 쓰므로, 여기서 만든 decide(obs) 코드를 브라우저 코드 탭에서도, 실물 로봇에서도 그대로 씁니다.
- Windows 에 Python 3.11~3.13 이 있어야 합니다(python.org 설치 시 "Add to PATH" 체크).
- ZIP 을 한글·공백 없는 폴더(예:
C:\fieldlab-py)에 풀고install.bat을 두 번 클릭합니다. 강화학습까지 쓰려면 명령 창에서install.bat rl. - 설치 확인:
run.bat check - 시뮬레이터:
run.bat sim --group 3→ 카메라 A·B·탑뷰 창이 뜹니다. 화살표/WASD 이동, 스페이스 대기, 1~4 로봇 선택, R 시연 기록 시작·끝, K 킥오프.
| 하고 싶은 것 | 명령 |
|---|---|
| 내 정책 실행(시뮬) | run.bat run my_policy.py --group 2 --robot A |
| 정답 대신 카메라 인식으로 관측 | run.bat run my_policy.py --group 2 --robot A --vision |
| 공유 자율(3조) | run.bat sim --group 3 --policy examples\group3\rule_shared.py --robot A |
| 가상 카메라 보정 | run.bat calib --cam sim://A |
| 실물 카메라 보정 | run.bat calib --cam 0 |
| 가짜 로봇(실물 없이 통신 시험) | run.bat mock-robot --name A |
| 실물 로봇 실행 | run.bat run my_policy.py --group 2 --robot A --real http://로봇IP --cam 0 |
예제: examples\group1~4 규칙 정책, examples\imitation 시연 기록 → MLP 모방학습, examples\rl PPO 강화학습(2조 1대1 공격). 자세한 내용은 ZIP 안 README.md.
# 학생 코드 모양: 시뮬레이터와 실물이 같다
def decide(obs): # obs: 로봇·공 위치(또는 카메라 인식 결과)
return 'forward' # 'back' 'left' 'right' 'wait' 또는 {'v': 0.1, 'w': 0.3}(2조)
막히면 요청 게시판에 질문으로 올리고, 오류 메시지 전체를 붙여 주세요.
08실물 전환
학생 코드는 "카메라에서 영상을 받는다 → 로봇에 명령을 보낸다" 두 가지만 합니다. 실물 주간에는 이 두 출구만 실물로 바꿉니다.
- 로봇은 Wi-Fi 로 명령을 받습니다(HTTP · WebSocket · UDP 중 조별로 선택). 명령 내용은 같습니다: 걷기 · 회전 · 정지. 규격은 Quacky Field Protocol v1.
- 명령 예:
{"proto":1,"robot":"A","seq":1,"cmd":"forward","steps":1}을POST http://quacky-a.local/api/cmd로. 연속 주행(drive)은 0.3초 안에 다음 명령이 없으면 로봇이 스스로 멈춥니다. - 로봇 찾기: 교실 공유기에서는
quacky-a.local~quacky-d.local(안 되면 IP 직접 입력), 공유기가 없으면 로봇 Wi-FiQUACKY-A에 접속해192.168.4.1. - 두 발로 걷기 때문에 바퀴처럼 연속 속도를 바로 따르지 못합니다. 2조의 (v, ω) 명령은 걸음 단위 명령으로 바꾸는 층을 거칩니다.
- 첫 동작은 반드시 감독 아래 한 걸음씩 확인합니다. 로봇이 매트 끝에 가면 바로 정지 명령을 보내세요.
- 로봇은 모두 같은 기종이며 모자 ID(A 10 · B 20 · C 30 · D 40)로만 구분합니다.