TT Lab
요금제

한국어

시작하기
블로그

블로그

공 비행 방정식: 중력·항력·Magnus, 오일러와 RK4, 바운스 모델, 칼만 필터

상태: 초안 (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.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³

탁구대 바운스는 순간 충격량 모델로 둡니다. 법선 속도는 반발 계수 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 입니다.

적분 간격과 0.4초 뒤 위치 오차 0.5 1 2 5 10 1e-12 1e-09 1e-06 0.001 1 100 적분 간격 dt(ms, 로그) 오차(mm, 로그) 오일러 반암시적 오일러 RK4 기준: RK4 dt = 0.01 ms. 출발 7.1 m/s, 탑스핀 80 rad/s, 바운스 없음. 오일러는 dt 를 반으로 줄이면 오차도 반(1차), RK4 는 16분의 1(4차).
그림: 적분 간격에 따른 오일러, 반암시적 오일러, RK4 의 위치 오차
방법 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

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 통과 위치를 예측했습니다. 필터 모델은 셋입니다.

타격면 예측 오차: 관측 시간보다 모델이 중요하다 0 5 10 15 15.3 7.0 1.3 처음 0.1초 관측 13.3 5.6 0.5 처음 0.2초 관측 10.5 4.8 0.5 처음 0.3초 관측 A 중력만 B +항력 C +항력+참 회전 중앙 오차(cm) 120 fps, 잡음 σ 3 mm, 실제 타구 200개. 타격면은 끝줄 뒤 23 cm(y = −1.6 m).
그림: 관측 시간과 모델별 타격면 예측 오차

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

Mülling 외 2013 은 60 Hz 카메라 4대와 EKF 를 쓰고, 회전을 관측하기 어렵다는 이유로 EKF 모델에서 회전을 뺐습니다(3.1 절). Koç 외 2018 도 60 Hz 카메라 4대와 EKF 를 쓰고 비행 모델에 양력 항을 두었지만, 필터가 회전을 어떻게 다루는지는 확인하지 못했습니다(미확인). 이 실측은 그 선택의 대가가 수 cm 라는 것을 보여 줍니다. 라켓 면 반지름이 7~8 cm 안팎이므로 감당할 수 있는 크기지만, 7편에서 보듯 착지점 정확도에는 그대로 번집니다.

7. 한계

8. 정리

티티 한마디. 카메라를 네 배 빠른 걸로 바꿔도 회전을 모르면 공은 5 cm 쯤 다른 데로 와요. 공이 어떻게 도는지부터 알아내는 게 먼저예요!

참고

모든 자료는 2026-10-18 에 열람했습니다.

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

댓글

아직 댓글이 없습니다.

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