상태: 초안 (2026-10-18), 실측. 숫자는 노트북(Apple M1 Max, macOS 26.5)의 Python 3.9.6·numpy 2.0.2 로 직접 계산한 시뮬레이션 값입니다. 원자료와 코드: 작업 디렉터리
measure/robot-arm-basics/의common.py,m06_flight.py,m06b_constants.py,out/m06_flight.json,out/m06b_constants.json. 「참 궤적」도 같은 모델로 만든 것이므로, 모델과 실제 공의 차이는 이 글의 숫자에 들어 있지 않습니다(실제 공 궤적과의 대조는 미실측). 공 초기 상태는 DeepMind 데이터셋(CC-BY 4.0)입니다. 참고 자료는 2026-10-18 에 열람했습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」, 확인하지 못한 것은 「미확인」으로 표시합니다.
목차
- 1. 직관: 가볍고 잘 도는 공
- 2. 운동 방정식
- 3. 오일러와 RK4
- 4. 회전과 바운스가 바꾸는 것
- 5. 상수의 불확실성은 예측을 얼마나 흔드나
- 6. 칼만 필터: 잡음 섞인 관측에서 상태 뽑기
- 7. 한계
- 8. 정리
- 참고
1. 직관: 가볍고 잘 도는 공
탁구공은 2.7 g 이고 지름이 40 mm 입니다(ITTF Statutes 2026, 2.3.1·2.3.2). 같은 크기의 쇠공보다 훨씬 가벼워서 공기가 미는 힘이 무게에 비해 큽니다. 5 m/s 로 날 때 항력은 공 무게의 약 3분의 1 이고, 10 m/s 면 무게보다 큽니다. 게다가 선수의 공은 초당 수십 바퀴씩 돕니다. 도는 공은 한쪽의 공기를 더 끌고 가서 옆으로 휘는 힘을 받습니다. 이것이 Magnus 효과이고, 탑스핀 공이 뚝 떨어지고 백스핀 공이 떠오르는 이유입니다.
그래서 탁구 로봇의 예측기는 진공의 포물선으로는 부족합니다. 하지만 모델을 복잡하게 할수록 알아야 할 상수(항력 계수, Magnus 계수, 반발과 마찰)와 관측해야 할 상태(회전)가 늘어납니다. 이 글은 그 맞바꿈을 숫자로 봅니다.
2. 운동 방정식
m · dv/dt = m g − ½ ρ C_D A |v| v + ½ ρ A r C_M (ω × v)
dp/dt = v
m = 2.7 g, r = 0.02 m, A = π r², ρ = 1.225 kg/m³
- 둘째 항이 항력(drag)입니다. 속력의 제곱에 비례하고 속도의 반대 방향입니다.
- 셋째 항이 Magnus 힘입니다. 회전축 ω 와 속도 v 의 외적 방향이라 공을 옆으로 휩니다. 로봇 쪽(−y)으로 오는 공에서는 ω_x > 0 이 탑스핀이고, ω × v 가 아래를 향해 공을 끌어내립니다.
- 비행 중 회전은 줄지 않는다고 둡니다(1편의 공통 가정).
탁구대 바운스는 순간 충격량 모델로 둡니다. 법선 속도는 반발 계수 e 로 뒤집고, 접점의 미끄럼 속도는 쿨롱 마찰 μ 로 줄이되 굴림(접점 속도 0)에 닿으면 멈춥니다. 얇은 껍질 구(I = ⅔ m r²)는 미끄럼 속도의 5분의 2 를 없애면 굴림이 됩니다.
def bounce(v, w, e=0.876, mu=0.25):
ux, uy = v[0] - R*w[1], v[1] + R*w[0] # 접점(공 아래쪽)의 미끄럼 속도
us = hypot(ux, uy)
jn = (1 + e) * abs(v[2]) # 질량당 법선 충격량
dv = min(mu * jn, 0.4 * us) # 마찰은 굴림에 닿으면 멈춤
jx, jy = -dv*ux/us, -dv*uy/us
k = M / I_BALL # = 1.5 / R²
return (v[0]+jx, v[1]+jy, -e*v[2]), (w[0] + k*R*jy, w[1] - k*R*jx, w[2])
2.1 상수는 어디서 오나
| 상수 | 이 시리즈 | 문헌에서 확인한 값과 조건 |
|---|---|---|
| 항력 계수 C_D | 0.47 | Sony AI 2026 표 I: 2.5 m/s 에서 0.55, 17.5 m/s 에서 회전비에 따라 0.37~0.51. Google 2023 의 PyBullet 설정 0.47. Koç 외 2018 표 A.3 의 묶음 상수 0.141 1/m 를 공기 밀도 1.2 로 환산하면 약 0.50(우리 계산) |
| Magnus(질량당) | 3.4×10⁻³ | Koç 외 2018 표 A.3 의 양력 상수 1.0×10⁻³ 1/rad. 같은 프로젝트의 MuJoCo 시뮬레이터(DeepMind 계수)에서 잰 실효값 7.6×10⁻³. 세 값이 7배 넘게 벌어져 있음 |
| 탁구대 반발 e | 0.876 | ITTF 2.1.3(30 cm → 약 23 cm)을 공기 없이 환산. Nakashima 외 2010 실측 0.93, Koç 외 2018 추정 0.883 |
| 탁구대 마찰 μ | 0.25 | Nakashima 외 2010 의 동마찰 측정값 0.25(Sony AI 2026 도 같은 값). Koç 외 2018 추정 0.102 |
Magnus 계수가 문헌마다 크게 다른 것은 정의(무엇을 묶어 상수로 부르는지)와 측정 조건(속도, 회전비)이 다르기 때문입니다. Sony AI 2026 은 회전비에 따라 선형·2차로 바뀌는 C_M 을 맞추었습니다. 이 글은 5절에서 이 불확실성이 예측을 얼마나 흔드는지를 직접 잽니다.
3. 오일러와 RK4
미분 방정식을 컴퓨터로 풀려면 시간을 잘게 나눠 한 걸음씩 나아갑니다. 가장 단순한 오일러법은 지금의 기울기로 dt 만큼 직진합니다. RK4(4차 룽게-쿠타)는 한 걸음 안에서 기울기를 네 번 재어 가중 평균합니다.
오일러: v ← v + a(v)·dt, p ← p + v·dt (걸음당 기울기 1번, 오차 ∝ dt)
RK4: k1 = f(x), k2 = f(x + k1·dt/2), k3 = f(x + k2·dt/2), k4 = f(x + k3·dt)
x ← x + (k1 + 2k2 + 2k3 + k4)·dt/6 (걸음당 4번, 오차 ∝ dt⁴)
3.1 실측: 0.4초 뒤 위치 오차
출발 위치 (0, 1.2, 0.25) m, 속도 (0.3, −7.0, 1.2) m/s(속력 7.1 m/s), 탑스핀 80 rad/s 인 공을 바운스 없이 0.4초 날렸습니다. 기준은 RK4 dt = 0.01 ms 입니다.
| 방법 | dt | 0.4초 뒤 오차 | 궤적 하나 계산 시간 |
|---|---|---|---|
| 오일러 | 0.5 ms | 0.96 mm | 808 µs |
| 오일러 | 1 ms | 1.92 mm | 406 µs |
| 오일러 | 10 ms | 19.3 mm | 42 µs |
| 반암시적 오일러 | 1 ms | 2.81 mm | 430 µs |
| RK4 | 1 ms | 9.4×10⁻¹¹ mm | 3,296 µs |
| RK4 | 5 ms | 5.7×10⁻⁸ mm | 658 µs |
| RK4 | 10 ms | 9.1×10⁻⁷ mm | 339 µs |
- 오일러는 dt 를 절반으로 하면 오차도 절반입니다(1차). RK4 는 16분의 1 입니다(4차).
- RK4 10 ms 가 오일러 0.5 ms 보다 빠르고 100만 배 정확했습니다. 탁구공의 비행은 매끄러운 미분 방정식이라 고차 방법이 압도적으로 유리합니다.
- 반암시적 오일러(속도를 먼저 고치고 새 속도로 위치를 옮김)는 이 문제에서 오히려 조금 나빴습니다. 에너지를 보존하는 진동 문제에서 쓰는 방법이라 항력이 있는 공에는 이점이 없습니다.
- 다만 바운스와 라켓 충돌처럼 불연속이 있는 사건은 큰 dt 에서 시각을 놓칩니다. 이 시리즈는 충돌 판정이 있는 비행을 1 ms 로 적분하고, 충돌 없는 구간만 5 ms 로 줄였습니다(7편).
4. 회전과 바운스가 바꾸는 것
4.1 회전이 바운스 지점을 옮긴다
상대 쪽 (0, 1.2, 0.25) m 에서 속도 (0, −6, 1) m/s 로 출발한 공이 로봇 쪽 탁구대에 처음 닿는 자리를 회전만 바꿔 비교했습니다.
| 회전 | 50 rad/s | 100 rad/s | 150 rad/s |
|---|---|---|---|
| 탑스핀: 바운스가 네트 쪽으로 | +10.3 cm | +19.4 cm | +27.3 cm |
| 백스핀: 바운스가 끝줄 쪽으로 | −11.8 cm | −25.7 cm | −41.7 cm |
회전이 없으면 y = −0.62 m 에 0.344초에 떨어집니다. 1편의 데이터셋에서 친 직후 회전의 중앙값이 49 rad/s, 95백분위가 100 rad/s 였으므로, 보통의 아마추어 공에서도 회전은 바운스 지점을 10~25 cm 옮깁니다.
4.2 바운스 점검: ITTF 낙하 시험
공 바닥을 30 cm 높이에서 떨어뜨려 다시 올라온 높이를 쟀습니다. e = 0.876 이면 공기 저항 없이 23 cm 가 되어야 하지만, 항력이 있는 우리 모델에서는 21.5 cm 였습니다. 떨어지고 올라가는 동안 항력이 에너지를 빼앗기 때문입니다. 항력까지 넣고 23 cm 를 맞추려면 e = 0.907 이 필요했습니다 (이분법). 이 값은 Nakashima 외 2010 의 실측 0.93 과 Koç 외 2018 의 0.883 사이입니다. 반발 계수 하나도 「무엇을 무시하고 맞췄는가」에 따라 3% 가 달라집니다.
4.3 마찰 계수와 회전
같은 공을 끝줄 뒤 23 cm 면(y = −1.6 m)에서 받는다고 할 때, 탁구대 마찰 μ 를 바꾸면 그 면을 지나는 높이(탁구대 위)가 다음처럼 바뀌었습니다.
| 회전 | μ = 0.10 | μ = 0.25 | μ = 0.40 |
|---|---|---|---|
| 백스핀 100 rad/s | 0.19 m | 0.18 m | 0.15 m |
| 회전 없음 | 0.17 m | 0.12 m | 0.02 m |
| 탑스핀 100 rad/s | 0.10 m | 0.005 m | 0.005 m |
탑스핀 공은 μ 0.25 와 0.40 이 같습니다. 바운스 중에 접점이 굴림 상태에 닿아 마찰이 더 이상 일하지 않기 때문입니다. 회전이 없는 공은 마찰에 가장 민감했습니다. 회전과 마찰은 따로 맞출 수 없고 함께 맞춰야 합니다.
5. 상수의 불확실성은 예측을 얼마나 흔드나
데이터셋 공 1,000개를 기본 상수로 날린 결과와, 상수 하나만 바꿔 날린 결과의 타격면(y = −1.6 m) 통과 위치·시각 차이를 쟀습니다(m06b_constants.py).
| 바꾼 상수 | 위치 차이 중앙 / 90% | 시각 차이 중앙 | 타격면에 못 온 공 |
|---|---|---|---|
| C_D 0.47 → 0.40 | 3.1 / 12.4 cm | 30 ms | 21 |
| C_D 0.47 → 0.55 | 3.9 / 14.8 cm | 35 ms | 35 |
| Magnus → Koç 값(1.0×10⁻³) | 5.4 / 11.5 cm | 6.7 ms | 43 |
| Magnus → MuJoCo 실효값(7.6×10⁻³) | 10.4 / 22.3 cm | 11.3 ms | 53 |
| Magnus 없음 | 7.4 / 15.5 cm | 9.6 ms | 72 |
항력 계수는 위치보다 시각을 크게 바꿉니다. 0.07 의 차이가 30 ms 를 만들었고, 이는 1편의 시간 예산에서 카메라 네 프레임에 해당합니다. Magnus 계수는 위치를 크게 바꿉니다. 문헌값 사이를 오가는 것만으로 타격면 위치가 5~10 cm 달라졌습니다. 이 상수들은 로봇을 만든 뒤 우리 공·우리 탁구대로 다시 맞춰야 합니다. Sony AI 2026 은 카메라 9대로 모은 궤적 약 5.8만 개로 계수를 다시 맞춰 착지점 중앙 오차를 0.37 m 에서 0.15 m 로 줄였다고 보고합니다.
6. 칼만 필터: 잡음 섞인 관측에서 상태 뽑기
카메라는 위치만 주고, 그 위치에도 잡음이 있습니다. 속도는 위치를 미분해야 하는데 미분은 잡음을 키웁니다. 칼만 필터(Kalman filter)는 「모델이 예측한 상태」와 「새 관측」을 각자의 불확실성에 따라 섞어 위치와 속도를 함께 추정합니다. 모델이 비선형(항력)이면 매 걸음 모델을 선형화해 쓰는 확장 칼만 필터(EKF)가 됩니다.
sp = f_state(s, dt) # 예측: RK4 로 한 프레임 앞으로
F = finite_difference_jacobian(f_state, s, dt) # 선형화
P = F @ P @ F.T + Q # 불확실성도 함께 전파
K = P @ H.T @ inv(H @ P @ H.T + R) # 칼만 이득: 모델과 관측의 신뢰 비율
s = sp + K @ (z - H @ sp) # 갱신: 관측 z(위치 3개)로 고침
P = (I - K @ H) @ P
6.1 실측: 무엇이 예측을 좋게 하나
데이터셋에서 타격면까지 오는 실제 타구 200개를 골라 참 궤적을 만들었습니다(항력 + 실제 회전 + 바운스). 카메라 관측은 fps 60·120·240, 각 축 가우시안 잡음 σ 3·10 mm 로 흉내 냈고, 친 직후부터 0.1·0.2·0.3초 동안 관측한 뒤 필터 상태에서 타격면 y = −1.6 m 통과 위치를 예측했습니다. 필터 모델은 셋입니다.
- A 중력만: 선형 칼만 필터. 예측도 진공 포물선 + 바운스.
- B 중력 + 항력: EKF. 회전은 0 으로 가정.
- C 중력 + 항력 + 참 회전: 회전을 정확히 안다고 가정한 EKF. 회전 추정이 완벽할 때의 하한선입니다.
120 fps, σ = 3 mm 의 결과(공 200개 중앙값)입니다.
| 관측 시간 | A 위치 오차 | B 위치 오차 | C 위치 오차 | B 시각 오차 | C 시각 오차 |
|---|---|---|---|---|---|
| 0.1 s | 15.3 cm | 7.0 cm | 1.3 cm | 14 ms | 2.9 ms |
| 0.2 s | 13.3 cm | 5.6 cm | 0.5 cm | 13 ms | 1.3 ms |
| 0.3 s | 10.5 cm | 4.8 cm | 0.5 cm | 10 ms | 1.2 ms |
프레임률과 잡음을 바꾼 결과(관측 0.2초, 위치 오차 중앙값)입니다.
| 조건 | B(회전 모름) | C(회전 앎) |
|---|---|---|
| 60 fps, σ 3 mm | 5.9 cm | 0.77 cm |
| 120 fps, σ 3 mm | 5.6 cm | 0.51 cm |
| 240 fps, σ 3 mm | 5.9 cm | 0.39 cm |
| 60 fps, σ 10 mm | 6.2 cm | 2.0 cm |
| 240 fps, σ 10 mm | 6.0 cm | 1.2 cm |
- 회전을 모르는 모델(B)은 아무리 오래, 아무리 자주 봐도 5 cm 아래로 내려가지 않았습니다. 오차의 대부분이 잡음이 아니라 모델 오차이기 때문입니다.
- 회전을 알면(C) 오차가 10분의 1 로 줄고, 그때부터 프레임률과 잡음이 의미를 가집니다. 잡음이 클 때는 240 fps 가 60 fps 보다 오차를 40% 줄였습니다.
- 진공 모델(A)은 공 200개 가운데 28~62개에서 아예 타격면 통과를 예측하지 못했습니다(바운스 자리를 잘못 잡음).
- 처리 시간은 파이썬 EKF 가 프레임당 126 µs, 타격면까지 예측 한 번이 11 ms 였습니다.
Mülling 외 2013 은 60 Hz 카메라 4대와 EKF 를 쓰고, 회전을 관측하기 어렵다는 이유로 EKF 모델에서 회전을 뺐습니다(3.1 절). Koç 외 2018 도 60 Hz 카메라 4대와 EKF 를 쓰고 비행 모델에 양력 항을 두었지만, 필터가 회전을 어떻게 다루는지는 확인하지 못했습니다(미확인). 이 실측은 그 선택의 대가가 수 cm 라는 것을 보여 줍니다. 라켓 면 반지름이 7~8 cm 안팎이므로 감당할 수 있는 크기지만, 7편에서 보듯 착지점 정확도에는 그대로 번집니다.
7. 한계
- 참 궤적과 필터가 같은 방정식(상수만 다름)을 씁니다. 실제 공은 회전 감쇠, 공마다 다른 무게 중심, 바람 같은 모델 밖 효과가 있어 오차가 더 클 것입니다(미실측).
- 관측 잡음을 각 축 독립 가우시안으로 넣었습니다. 실제 삼각측량 잡음은 카메라 시선 방향으로 길쭉하고, 공 검출 실패와 지연도 있습니다(미실측).
- 회전을 「아는」 경우(C)는 하한선일 뿐입니다. 회전을 궤적의 휘어짐에서 추정하거나 공 표면 무늬로 재는 방법은 다루지 않았습니다.
- 탁구공 전용 풍동 실험 원문은 열지 못했습니다(미확인). C_D 범위는 Sony AI 2026 의 비행 궤적 맞춤 결과입니다.
8. 정리
- 탁구공 비행은 중력·항력·Magnus 세 힘과 반발·마찰 바운스로 꽤 잘 설명됩니다. 적분은 RK4 를 쓰면 5~10 ms 간격으로도 충분합니다.
- 회전 100 rad/s 는 바운스 자리를 20 cm 넘게 옮기고, 항력 계수 0.07 의 차이는 도착 시각을 30 ms 바꿉니다.
- 예측 오차를 줄이는 데는 프레임률보다 모델(특히 회전)이 먼저입니다. 회전을 모르면 5 cm, 알면 0.5 cm 였습니다.
- 그러니 하드웨어를 고를 때 「몇 fps 카메라인가」 다음 질문은 「회전을 어떻게 알아낼 것인가」입니다.
티티 한마디. 카메라를 네 배 빠른 걸로 바꿔도 회전을 모르면 공은 5 cm 쯤 다른 데로 와요. 공이 어떻게 도는지부터 알아내는 게 먼저예요!
참고
모든 자료는 2026-10-18 에 열람했습니다.
- ITTF, Statutes 2026, 2.1.3·2.3.1·2.3.2.
- Conti 외(Sony AI), Physics Models for Sim-to-Real Transfer in Professional-Level Robot Table Tennis, arXiv:2606.28805, III-B·III-C 절, 표 I.
- Koç, Maeda, Peters, Online optimal trajectory generation for robot table tennis, RAS 105 (2018), 저자 공개본, 식 9–16, 표 A.3, 부록 B.
- Nakashima 외, Modeling of Rebound Phenomenon of a Rigid Ball with Friction and Elastic Effects, ACC 2010, 기관 저장소, IV 절.
- Mülling, Kober, Kroemer, Peters, Learning to select and generalize striking movements in robot table tennis, IJRR 32(3) (2013), 저자 공개본, 3.1 절.
- D'Ambrosio 외, arXiv:2309.03315, 부록 D(시뮬레이터 설정).
- Google DeepMind, competitive_robot_table_tennis, CC-BY 4.0.