TT Lab
요금제

한국어

시작하기
블로그

블로그

디지털 트윈과 AI 탁구 심판: 실제 바운드로 물리를 맞추고, 정답을 아는 시험장에서 심판을 시험하기

상태: 초안 (2026-10-18), 실측. 시험장의 정확도는 시뮬레이터 안의 상대 비교값입니다. 계산은 모두 맥 한 대(Apple M1 Max 10코어, Python 3.9.6, numpy 2.0.2)의 CPU 로 했고, GPU 와 클러스터는 쓰지 않았습니다. 새 패키지·이미지·데이터는 내려받지 않았습니다. 맞추기와 시험장은 시드를 고정한 결정적 실행이라 한 번씩 돌렸고(같은 명령이면 같은 결과), 처리 시간만 5회 반복의 중앙값입니다. 처리 시간은 맥에 다른 일이 돌아 부하 평균이 47–76 일 때 잰 값입니다. 실제 영상은 공개 데이터셋 OpenTTGames(120 fps, 사람이 찍은 공 좌표와 바운드 표식)와 그 확장 라벨을 썼고, 둘 다 CC BY-NC-SA 4.0 입니다. 이 자료로 맞춘 물리값과 그 값으로 그린 그림(반발 계수 그림)도 같은 조건을 따릅니다. 원자료(맞춤 결과, 시험장 판정 24,300행씩, 실제 기준표 결과)는 작업 디렉터리 measure/tt-twin/ 에 있습니다.

목차

1. 직관: 정답을 아는 연습 경기장

카메라 점수판의 심판 기능을 좋게 만들려면 「틀린 판정」을 많이 모아야 합니다. 실제 경기 영상에는 정답 라벨이 적고, 엣지볼이나 오브스트럭션 같은 드문 장면은 거의 없습니다. 시뮬레이터 안이라면 공이 어디에 닿았는지를 물리가 알고 있으므로, 원하는 장면을 원하는 만큼 만들어 심판에게 보여 줄 수 있습니다. 이것이 정답을 아는 시험장입니다.

다만 시험장의 공이 실제 공과 다르게 날면 시험이 엉뚱한 약점을 찾습니다. 그래서 순서를 셋으로 나눴습니다.

  1. 실물 맞추기(real2sim): 실제 바운드로 시뮬레이터의 물리값을 맞춥니다.
  2. 시험장: 맞춘 물리로 장면을 만들어 운영 판정 코드에 넣고 약점을 찾습니다.
  3. 개선 고리: 가장 큰 약점 하나를 고치고, 시뮬레이터와 실제 영상 둘 다에서 좋아졌을 때만 채택합니다.

2. 실물 맞추기: 실제 바운드 1,777조각

2.1 방법

처음에는 「바운드 뒤 50 ms 만 보고 다음 바운드를 예측」하는 오차를 줄이는 방식으로 맞췄는데, 측정 잡음이 커서 반발 계수가 실측과 동떨어진 곳(e0 1.09)으로 갔습니다. 그래서 버리고, 항력·마그누스 배율을 격자로 고른 뒤 바운드마다 잰 반발 계수를 직접 회귀하는 순서로 바꿨습니다. 실패한 방법도 기록으로 남깁니다.

2.2 결과

항목 운영 기본값 맞춘 값
반발 e0, e1 0.98, 0.02 0.982, 0.045
마찰 μ 0.25 0.160
항력 배율 ×1 ×0.8(0.8–1.2 사이 차이 0.02 px 안이라 약하게만 정해짐)
마그누스 배율 ×1 ×1.5(끄면 맞춤 잔차가 두 배. 1 이상이면 회전 크기와 맞바뀌어 구별되지 않음)
30 cm 낙하 꼭대기(공기저항 없이 계산) 26.0 cm(e 0.931) 22.9 cm(e 0.873)
실제 바운드에서 잰 반발 계수는 운영 값보다 낮았다 공개 경기 영상 120 fps 표식 바운드. 칸마다 중앙값과 사분위 범위. 0.7 0.8 0.9 1.0 1 2 3 4 5 내려오는 속도 |v_z| (m/s) 기본값 0.98 + 0.02·v_z 맞춘 값 0.982 + 0.045·v_z 실측 학습 5경기 실측 시험 7경기 30 cm 낙하 꼭대기(공기저항 없이 계산) 기본값 26.0 cm, 맞춘 값 22.9 cm ITTF 규정은 약 23 cm
그림: 실제 바운드에서 잰 반발 계수와 기본값·맞춘 값
내려오는 속도 실측 e 중앙값, 학습 5경기(사분위) 실측 e, 시험 7경기 기본값 맞춘 값
1.5–2.5 m/s 0.894(0.781–0.991), n 692 0.911, n 93 0.939 0.889
2.5–3.5 m/s 0.831(0.746–0.892), n 507 0.854, n 93 0.921 0.849
3.5–5.0 m/s 0.838(0.753–0.880), n 176 0.830, n 30 0.902 0.807

실측 반발 계수는 운영 합성 장치의 값보다 0.04–0.07 낮았습니다. ITTF 규정(2.1.3)은 30 cm 에서 떨어뜨린 공이 약 23 cm 튀어야 한다고 정하는데, 영상으로 맞춘 값이 그 기준(22.9 cm) 쪽으로 옮겨 갔습니다. 2편에서 본 MuJoCo 의 DeepMind 탁자 값(26.4 cm)과 운영 기본값(26.0 cm)이 모두 규정보다 탄력적이었던 것과 같은 방향입니다.

2.3 그런데 예측은 거의 좋아지지 않았다

서브의 첫 바운드 앞 조각과 바운드 뒤 150 ms 를 보고 나머지 비행을 예측해, 상대 쪽 바운드(B2)와 견줬습니다.

경기 물리 서브 수 B2 위치 오차 중앙값(p90) 깊이 방향 B2 시각 오차 중앙값(p90) 시각 치우침
학습 5경기 기본값 207 22.7(47.4) cm 18.8 cm 24.6(68.3) ms +9.7 ms
학습 5경기 맞춘 값 207 22.9(45.5) cm 16.2 cm 24.1(68.6) ms +3.1 ms
시험 7경기 기본값 23 21.3(37.4) cm 20.3 cm 22.5(52.8) ms +5.7 ms
시험 7경기 맞춘 값 23 17.4(31.4) cm 9.9 cm 13.1(45.7) ms −0.6 ms

(예측이 네트에 걸려 B2 를 내지 못한 서브는 오차 계산에서 빠집니다. 학습 55–59개, 시험 7–8개입니다.)

2.4 오차 대부분은 카메라 한 대의 깊이에서 온다

정답을 아는 재표본으로 단안 카메라의 한계를 쟀습니다. 실제 바운드 맞춤 600개를 정답으로 두고, 맞춘 물리로 다시 그려 카메라에 투영하고 잡음을 입힌 뒤 같은 방법으로 되찾았습니다(물리 모형이 정확하다고 둔 하한).

카메라 앞·뒤 프레임 들어오는 속도 오차 중앙값, 길이 / 깊이 방향 접촉점 오차 중앙값, 길이 / 깊이 탑스핀 오차 중앙값
실제 경기 카메라 120 fps, 사람 표식 8 / 12 0.06 / 0.33 m/s 0.3 / 0.5 cm 51 rad/s
점수판 기준 카메라 512×288, 60 fps 6 / 6 0.09 / 0.67 m/s 1.1 / 1.7 cm 60 rad/s
점수판 기준 카메라 512×288, 30 fps 3 / 3 0.12 / 1.11 m/s 3.1 / 3.8 cm 116 rad/s

지금은 깊이 오차가 물리값 차이를 덮습니다. 마그누스 배율과 깊이를 함께 정하려면 두 번째 카메라나 공 무늬가 보이는 고속 영상이 필요합니다.

3. 정답을 아는 심판 시험장: 24,300판정

3.1 무엇을 만들었나

왜 렌더링하지 않고 투영 좌표를 썼나. 판정 엔진의 입력은 공의 화면 좌표이고, 목적은 엔진의 약점을 찾는 것입니다. 좌표 수준에서는 같은 장면을 조건만 바꿔 수만 번 돌릴 수 있습니다. 대가는 겉모습의 차이가 빠진다는 것입니다. 공이 배경·옷·조명에 묻히는 일, 라켓이나 손을 공으로 읽는 일, 실제 번짐 자국의 모양은 검출기 오류의 확률 모형으로만 흉내 냈습니다. 실제로 시험장의 기준 랠리(실제 조건) 정확도 82% 는 같은 운영 경로로 잰 실제 시험 7경기 깨끗한 영상의 93%(54/58)보다 낮습니다. 그래서 아래 표는 장면과 조건 사이의 상대 비교로만 읽어야 합니다. 절대값을 실제 정확도로 읽으면 안 됩니다.

정답을 아는 심판 시험장: 랠리 승자를 맞힌 비율(%) 시뮬레이터 안 상대 비교. 칸은 장면 × 열화 조건, 진할수록 낮음. 이상 실제 30 120 잡음 번짐 가림 놓침 폰 전체 엣지 59 54 46 54 59 51 59 63 34 53 바로 안(3 cm) 96 88 81 83 75 81 59 68 53 76 바로 밖(10 cm) 99 89 91 85 76 88 69 79 58 81 네트 맞고 넘어감 100 94 97 90 83 94 78 81 71 87 서브 렛 78 71 80 54 50 67 41 53 44 60 투 바운드 99 91 89 88 80 90 70 82 60 83 스매시 100 92 80 85 79 93 69 79 56 81 로브(들어감) 69 62 58 64 57 63 55 59 52 60 오브스트럭션 12 13 13 14 17 13 20 22 24 16 발리(넘어간 공) 99 92 97 92 81 95 69 75 69 86 기준 랠리 100 82 85 86 77 86 63 79 62 80 전체 89 80 80 77 70 80 62 70 56 74 이상 = 잡음 없음. 실제 = 실측 검출 잡음. 30·120 = fps. 폰 = 30 fps + 잡음 2배 + 번짐 + 가림. 120 fps(77%)가 60 fps 실제(80%)보다 낮았습니다. 장면마다 조건당 n 이 다릅니다.
그림: 장면과 열화 조건별 랠리 승자 맞힘 비율

3.2 약점 셋

  1. 오브스트럭션 16%(모든 조건에서 12–24%). 엔진에는 「상대 공을 내 쪽에 튀기 전에 경기면 위에서 쳤다」는 개념이 없어, 대부분을 투 바운드로 읽고 반대 선수에게 점수를 줍니다. 같은 엔진이 엔드라인을 넘은 공을 친 발리는 86% 맞히는데, 규칙을 알아서가 아니라 우연입니다.
  2. 엣지볼 53%, 확인 없이 틀림 21%. 엣지에 닿은 공은 화면에서 V 자 바운드를 그리지 않습니다. 엔진은 바운드를 못 보고 아웃으로 처리합니다. 틀리면서도 사람 확인으로 보내지 않는 비율이 가장 높아, 가장 위험한 칸입니다.
  3. 서브 렛 60%(가림 41%, 폰 44%). 네트에 스친 서브의 속도 감소를 못 보거나, 네트에서 꺾인 공을 바운드로 읽거나, 리시버 쪽 바운드를 놓칩니다.

그다음은 높은 로브(들어감) 60% 였습니다. 공이 화면 위로 나가거나 1.5초 넘게 날아 「랠리 끝」이 먼저 납니다. 장면을 가리지 않는 실패 원인 1위는 공 검출이 빈 자리에서 바운드를 놓치는 것이었습니다.

120 fps 가 60 fps 보다 나빴습니다(77% 대 80%). 프레임이 많으면 좋아질 것 같지만, 엔진의 화소 문턱과 바운드 거부 규칙이 60·30 fps 에 맞춰져 있기 때문으로 봅니다. 원인을 따로 분리해 재지는 않았습니다(미실측). 실제 120 fps 영상의 추론으로 확인하는 것이 다음 일입니다.

4. 개선 고리 한 바퀴: 탄도 메우기

4.1 무엇을 바꿨나

시험장의 실패 원인 1위인 「공 검출이 4표본(60 fps 에서 약 0.07초) 넘게 빈 자리의 바운드 놓침」을 골랐습니다. 실제 경기에서도 놓친 바운드 다수가 이 길이었다는 앞선 기록이 있습니다.

빈 자리 앞뒤의 궤적 조각에 곡률을 중력으로 고정한 포물선을 맞춥니다(곡률 = 그 자리의 화면 축척 × 9.81, 기울기와 절편만 맞춤). 아래를 모두 만족할 때만 앞 곡선과 뒤 곡선으로 빈 자리를 메웁니다.

메운 점은 신뢰도를 양쪽의 절반으로 두어, 그 바운드는 사람 확인 쪽으로 갑니다. 문턱은 물리로 미리 정했고, 시험 결과를 보고 고르지 않았습니다.

탄도 메우기: 공이 사라진 구간을 중력 포물선으로 원리를 보이려고 만든 합성 궤적(60 fps, 중력만, 반발은 맞춘 값). 6배 느리게. ▶ 누르면 재생 탁구대 윗면 검출이 빈 8표본 되찾은 바운드 검출된 공 직선 메우기: 바운드가 사라짐 곡률을 중력으로 고정한 앞뒤 포물선이 탁구대 위에서 만남
그림: 공이 사라진 구간을 중력 포물선으로 메우는 원리

(그림은 원리를 보이려고 만든 합성 궤적입니다. 실제 판정 결과가 아닙니다.)

4.2 시뮬레이터에서

조건 맞음 기준 → 변경(/2,700) 좋아짐 / 나빠짐 McNemar p
이상 2,392 → 2,391 +0 / −1 1
실제 2,159 → 2,209 +57 / −7 7.6e−11
120 fps 2,075 → 2,163 +98 / −10 2.7e−19
가림 1,671 → 1,826 +223 / −68 2e−20
폰 1,512 → 1,548 +63 / −27 0.00019
전체(24,300) 17,900 → 18,483(73.7 → 76.1%) +778 / −195 5.3e−83

확인 없이 틀린 판정은 1,215 에서 996 으로 줄었습니다. 다만 엣지(53.1 → 49.9%)와 오브스트럭션(16.3 → 14.6%)은 내려갔습니다. 이 변경의 목표가 아니었고, 다음 바퀴의 과제입니다.

4.3 실제 영상에서(채택 여부를 정한 표)

시뮬레이터에서만 좋아진 것은 채택하지 않습니다. 시험장은 겉모습이 빠진 근사이므로, 거기서 좋아진 변경이 실제 영상에서 나빠질 수 있기 때문입니다. 그래서 운영 실시간 경로 그대로 실제 영상의 고정 기준표를 다시 돌렸습니다.

기준표 랠리 맞음 기준 → 변경 좋아짐 / 나빠짐
시험 7경기 × 12조건(깨끗함, 어두움, 30 fps, 저해상, 번짐, 방해물, 손떨림, 가림, 폰 화질 셋) 638 536 → 543 +8 / −1, McNemar p 0.039
개발용(학습 경기 깨끗함·30 fps·좌표 가림 15%, 검증 경기 8조건) 1,394 1,217 → 1,238 +36 / −15, p 0.005

판정: 채택. 다만 운영에는 스위치를 꺼 둔 채 들어갑니다. 꺼져 있으면 예전과 같은 계산이라 판정이 바뀌지 않습니다. 켜기 전에 카메라 점수판의 E2E 기록(시험 7경기를 가짜 카메라 30 fps 로 기록하고 재현)으로 「운영보다 나쁘지 않음」을 실시간 경로에서 한 번 더 확인하고, 위의 「카메라 앞으로 떨어진 공」 무리를 함께 봅니다.

5. AI 심판 넓히기: 중력 자와 규칙별 판단표

5.1 중력 자

서브 토스는 손을 떠난 뒤 16 cm 이상 올라가야 합니다(ITTF 2.6.2). 그런데 카메라 한 대로는 공까지의 거리를 모르니, 화면의 화소를 센티미터로 바꿀 축척이 없습니다. 여기서 중력이 자가 됩니다. 손을 떠난 공의 화면 높이를 시간에 대한 포물선 y = a·t² + b·t + c 로 맞추면 a = g·s/2 이고, s 는 그 공의 깊이에서 1 m 가 몇 화소인지입니다. 그러면 높이 = 화소 차 ÷ s 로 잴 수 있고, 깊이(초점거리 ÷ s)로 공의 3차원 자리도 나옵니다.

중력 자: 공의 낙하 곡률로 화면의 축척을 잰다 합성 토스 30 cm, 60 fps. 축척은 실제 토스 80개의 중앙값 330 px/m 로 그렸습니다. ▶ 누르면 재생 0 20 40 60 80 100 화소 시간(0–0.49 s) 올라간 화소 y = a·t² + b·t + c 를 맞추면 a = g·s/2 = 1619 px/s² → 축척 s = 2a/g = 330 px/m → 높이 = 99 px ÷ s = 30 cm 실제 영상: 토스 80개에서 잰 축척 중앙값 330 px/m, 카메라 기하로 구한 네트 자리 축척은 네 경기에서 303–335 px/m.
그림: 공의 낙하 곡률로 화면 축척을 재는 중력 자

5.2 규칙별 판단표

신호마다 신뢰도를 두고, 신호가 엇갈리거나 확신이 낮으면 사람 확인으로 보낸다는 원칙입니다. 「잰 것」은 이번 실측, 「못 잰 것」은 미실측입니다.

규칙(ITTF) 필요한 신호 잰 것 못 잰 것 1차 판정 / 사람 확인
토스 16 cm 이상(2.6.2) 공(중력 자), 손이 떠나는 순간 손 들어 올리기를 넣은 합성에서 0.70–0.86, 경계 ±4 cm 안 0.59–0.66. 실제 영상에서 잴 수 있는 서브 29% 손 관절로 떠난 순간 찾기, 실제 정답 높이 사람 확인. 명백히 낮은 토스만 알림 후보
토스 위치: 엔드라인 뒤, 경기면 높이 위(2.6.4) 공(중력 자로 깊이까지) 합성 0.89–0.97, 선에서 10 cm 넘게 떨어지면 0.97–1.00 실제 영상 정답 10 cm 밖은 1차, 안은 사람 확인
손바닥을 펴서 공을 올림(2.6.1) 손 관절 없음 손 관절 모델 사람 확인
서브를 가리지 않기(2.6.4–2.6.5) 리시버 시점의 공 보임 없음 옆에서 찍는 폰 한 대로는 원리상 알 수 없음 사람 확인
서브 렛(2.9.1.1) 공(네트에서 속도 감소), 네트 소리 시험장 60% 실제 폰 소리 사람 확인(다시 서브라 확인 비용이 작음)
엣지(2.1.2) 공(V 없는 급한 꺾임), 엣지 소리 시험장 53%, 확인 없이 틀림 21% 실제 엣지 영상, 옆면(사이드)은 생성 0건 사람 확인 필수
투 바운드 공 시험장 83%, 탄도 메우기 뒤 87.5% 실제 표본이 적음 1차
오브스트럭션(2.5.8) 공(튀기 전 방향이 뒤집힌 자리가 탁구대 위인가), 몸·라켓 시험장 16% 실제 라벨 사람 확인. 「바운드 없이 방향 뒤집힘 + 그 자리가 탁구대 위」 규칙을 시험장에서 먼저 잴 차례

6. 한계

7. 다음 바퀴

  1. 탄도 메우기 스위치를 켜기 전 E2E 확인.
  2. 엣지 후보 → 사람 확인. 끝선 띠 안에서 「V 없이 방향이 급히 꺾임」을 엣지 후보로 표시합니다. 시험장에서 확인 없이 틀림이 줄고 일반 아웃이 나빠지지 않는지 먼저 잽니다.
  3. 오브스트럭션 규칙. 옆에서 보면 길이 방향은 잘 보이므로(2.4절), 방향이 뒤집힌 자리의 길이 좌표로 판정합니다.
  4. 시험장 충실도. 실제 검출기의 오류를 속도·자리별로 다시 재서 잡음 모형을 맞추고, 120 fps 가 60 fps 보다 나빴던 결과를 실제 120 fps 추론으로 확인합니다.

티티 한마디. 정답을 아는 연습장에서 심판을 2만 4천 번 시험해 봤어요. 거기서 찾은 약점을 고친 다음, 진짜 경기 영상에서도 좋아졌을 때만 받아들였어요. 연습장에서만 잘하는 심판은 쓸모없으니까요!

참고

모든 링크는 2026-10-18 에 열람해 열리는 것을 확인했습니다.

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다