안내 · 기본 내용과 사용법

꽥꽥이 필드랩 안내

카메라 두 대로 필드를 보고, 고전 컴퓨터비전으로 로봇과 공을 찾고, 규칙 → 모방 → 강화 순서로 판단을 만들어 봅니다. 이번 주는 브라우저 시뮬레이터에서, 다음 주는 실물 로봇과 실물 카메라로 같은 코드를 돌립니다.

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 는 위입니다.

매트선 네 귀 마커 ID 0~3카메라 위치(위에서 본 투영)보정 격자판 ID 50~73 (깔았을 때)
필드 치수
로봇과 공

로봇 크기·걸음 거리·속도는 실측 전 가정값입니다. 11/14 실측 뒤 fieldspec.json 을 고치고 업데이트 내역에 올립니다.

03마커

ArUco 마커

모자 마커는 마커의 0행(위쪽 변)이 로봇 앞쪽을 향하도록 붙입니다. 모자 높이가 바닥에서 약 150mm 이므로, 바닥 호모그래피로 구한 위치는 카메라에서 먼 쪽으로 밀려 보입니다. 높이를 고려해 보정하세요.

보정 격자판 번호 규칙:

04카메라 추천과 설치

조당 2대, 1080p UVC 웹캠(드라이버 없이 꽂으면 되는 제품), 노출·초점을 수동으로 고정할 수 있는 것, 수평 화각 약 70~78°. 예: Logitech C920/C922급.

카메라 배치

실제 설치 위치

방향 정하기: 매트의 긴 변 앞에 서서 1팀 골대가 왼쪽, 2팀 골대가 오른쪽이 되게 섭니다. 내가 선 쪽이 "앞 긴 변"이고, 카메라 A 화면의 아래쪽입니다. 높이는 모두 매트 면 기준입니다(책상 75cm 위라면 바닥 기준으로 75cm 를 더하세요).

1팀 골대 2팀 골대 뒤 긴 변 앞 긴 변 (학생 쪽) 25cm 30cm 32cm A 천장 90cm B 2·3·4조 · 높이 80cm B 1조 · 높이 20cm
카메라 실제 설치 위치
카메라놓는 곳 (위에서 볼 때)높이 (매트 면 기준)향하는 곳
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)를 올려 주세요. 시뮬레이터 카메라도 같이 맞춰 드립니다.

설치 순서

  1. 카메라 A 를 매트 중심 위 약 0.9m 높이에 아래를 보게 고정합니다. 화면에 네 귀 마커가 모두 들어와야 합니다.
  2. 카메라 B 를 위 표의 위치에 고정합니다(2·3·4조: 1팀 쪽 앞 귀퉁이 대각선 바깥 80cm 높이, 1조: 2팀 골라인 연장선 위 20cm 높이). 흔들리지 않는 거치대를 쓰세요.
  3. 두 카메라를 서로 다른 USB 포트(가능하면 앞·뒤 포트처럼 다른 컨트롤러)에 꽂습니다. 1080p MJPEG 두 개는 대역폭을 많이 씁니다.
  4. 자동 노출·자동 초점·자동 화이트밸런스를 끕니다. 끄지 않으면 HSV 임계값이 시간에 따라 흔들립니다.
  5. 카메라마다 따로 체커보드 15~20장 이상으로 K·D 를 구합니다. 같은 모델이어도 개체마다 값이 다릅니다.
  6. 바닥 호모그래피는 네 귀 마커 4점만 쓰지 말고 격자판 24점을 함께 써서 오차를 확인합니다(4점만 쓰면 오차가 항상 0으로 보입니다).

계산 예: 화각 74° 카메라를 0.9m 높이에 두면 바닥 폭 약 1.36m 가 보이고, 1080p(1920px)에서 1mm 당 약 1.4px. 70mm 모자 마커는 약 100px, 탁구공(지름 40mm)은 약 56px 로 찍힙니다.

05시뮬레이터 사용법

꽥꽥이 필드랩 열기

  1. 조 선택: 조마다 필드와 카메라 배치가 다릅니다. 자기 조를 고릅니다.
  2. 방 만들기: 조 대표 PC 한 대가 방 만들기를 누릅니다. 방을 만든 PC가 경기 물리를 계산합니다.
  3. 참가: 조원은 로봇마다 다른 PC에서 참가 코드를 넣거나, 방장이 참가 링크 복사로 보내 준 로봇별 링크를 엽니다. 한 PC = 로봇 하나.
  4. 경기 탭: 방장이 경기 시작·일시정지·위치 초기화, 경기 시간(3분/5분), 속도(1·2·4배)를 정합니다. 시연 기록 저장은 모방학습 데이터가 됩니다.
  5. 혼자 해 보기는 방 없이 보정 실습만 하는 모드입니다.

조종

동작키보드화면 가상 컨트롤러
전진↑ 또는 W↑ 전진
후진↓ 또는 S↓ 후진
왼쪽 회전← 또는 A← 좌회전
오른쪽 회전→ 또는 D→ 우회전
대기스페이스대기

누르고 있으면 계속 걷습니다. 게임패드(USB·블루투스)를 연결하면 방향 입력으로 쓸 수 있습니다. 휴대폰·태블릿에서는 화면 가상 컨트롤러를 씁니다.

카메라 탭

가상 카메라의 해상도(960×540 · 1280×720 · 640×360), fps(5·10·15), 렌즈 왜곡 켜기/끄기, 잡음·밝기를 바꿉니다. 정답 탑뷰는 실제 위치를 보여 주므로 인식 결과를 검증할 때만 켜세요.

06보정 실습 탭

  1. 카메라 A 또는 B 를 고르고 보드 옮기기로 체커보드(내부 코너 9×6, 칸 25mm)를 여러 자세로 놓으며 이 장면 저장을 15장 이상 누릅니다. 기울기·위치를 고르게 섞으세요.
  2. 보드 치우기 → 격자판 깔기로 바닥에 ArUco 격자판(24개, 40mm)을 깔고 바닥 장면 저장 (호모그래피용)을 누릅니다. 비스듬한 카메라 B 는 네 귀 마커가 작게 보여 놓치기 쉬우니 격자판을 꼭 쓰세요.
  3. ZIP 내려받기: PNG 영상, 체커보드 3D 점, 정답(K, D, 카메라 자세)이 따로 들어 있습니다. 정답 파일은 보정을 끝낸 뒤 열어 비교하세요.
  4. 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) 코드를 브라우저 코드 탭에서도, 실물 로봇에서도 그대로 씁니다.

  1. Windows 에 Python 3.11~3.13 이 있어야 합니다(python.org 설치 시 "Add to PATH" 체크).
  2. ZIP 을 한글·공백 없는 폴더(예: C:\fieldlab-py)에 풀고 install.bat 을 두 번 클릭합니다. 강화학습까지 쓰려면 명령 창에서 install.bat rl.
  3. 설치 확인: run.bat check
  4. 시뮬레이터: 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-Fi QUACKY-A 에 접속해 192.168.4.1.
  • 두 발로 걷기 때문에 바퀴처럼 연속 속도를 바로 따르지 못합니다. 2조의 (v, ω) 명령은 걸음 단위 명령으로 바꾸는 층을 거칩니다.
  • 첫 동작은 반드시 감독 아래 한 걸음씩 확인합니다. 로봇이 매트 끝에 가면 바로 정지 명령을 보내세요.
  • 로봇은 모두 같은 기종이며 모자 ID(A 10 · B 20 · C 30 · D 40)로만 구분합니다.

09이 허브 쓰는 법

  • 현황판: 모든 조의 활동이 실시간으로 올라옵니다. 우리 조의 "지금 하는 일"과 단계(규칙·모방·강화·실물)를 적어 두세요.
  • 요청 게시판: 로그인 없이 기능 요청·오류 신고·질문·규칙/필드 변경을 올리고, 공감(+1)과 댓글을 답니다. 상태는 접수 → 검토 중 → 진행 중 → 반영됨(또는 보류)으로 바뀝니다.
  • 업데이트 내역: 무엇이 바뀌었는지, 어떤 요청이 반영됐는지 확인합니다.
  • 로그인이 없으므로 이름은 선택입니다. 학번·전화번호 같은 개인정보는 쓰지 마세요.