TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

空飛ぶ方程式:重力・抗力・マグナス効果、オイラー法とRK4、バウンスモデル、カルマンフィルタ

ステータス:ドラフト(2026-10-18)、実測。 数値はノートPC(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の場合は重量を超えます。さらに、選手の打つボールは毎秒数十回転もしています。回転するボールは片側の空気をより多く引き込み、横方向に曲げる力を受けます。これがマグナス効果であり、トップスピンのボールが急降下し、バックスピンのボールが浮き上がる理由です。

そのため、卓球ロボットの予測器において、真空中の放物線では不十分です。しかし、モデルを複雑にするほど、把握すべき定数(抗力係数、マグナス係数、反発係数、摩擦係数)と観測すべき状態(回転)が増加します。この記事では、そのトレードオフを数値で検証します。

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(本計算値)
マグナス係数(質量あたり) 3.4×10⁻³ Koç他 2018 表A.3の揚力定数 1.0×10⁻³ 1/rad。同プロジェクトのMuJoCoシミュレータ(DeepMind係数)で測定された実効値 7.6×10⁻³。3つの値の間で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

文献によってマグナス係数に大きな違いがある理由は、定義(何をまとめて定数と呼ぶか)や測定条件(速度、回転比)が異なるためです。Sony AI 2026では、回転比に応じて線形・2次で変化する C_M を適合させています。この記事では、第5節でこの不確実性が予測にどの程度影響を与えるかを直接測定します。

3. オイラー法とRK4

微分方程式をコンピュータで解くためには、時間を細かく分割して一歩ずつ進めます。最も単純なオイラー法では、現在の傾きに沿って dt だけ直進します。RK4(4次ルンゲ=クッタ法)では、1ステップ内で傾きを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秒後の誤差 1軌跡あたりの計算時間
オイラー法 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個をデフォルトの定数で飛ばした結果と、定数を1つだけ変更して飛ばした結果における、打撃面(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回のタイムバジェットにおけるカメラの4フレーム分に相当します。マグナス係数は位置を大きく変化させます。文献値の間を行き来するだけで、打撃面での位置が 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 の通過位置を予測しました。フィルターモデルは3つです。

타격면 예측 오차: 관측 시간보다 모델이 중요하다 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. まとめ

Tittyの一言。 カメラを4倍速いものに変えても、回転が分からなければボールは 5 cm ほど違うところに来ますよ。ボールがどのように回転しているかを突き止めるのが先決です!

参考

すべての資料は 2026-10-18 に閲覧しました。

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます