TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

卓球ボールの物理をMuJoCoで再現する:反発、抗力、回転はシミュレータ設定の1行にかかっている

状態:ドラフト(2026-10-18)、実測。ボール物理の第1段階(A~E)完了。 このモデル上で動かした古典制御のベースラインは 第5篇に、強化学習については以降の篇に記載します。 測定は2026-10-18にホームラボのKubernetesの一時ポッド内で行いました。ノードはミニPC1台(Intel Core Ultra 9 185H)で、ポッドの上限はCPU 3コア・メモリ3 GiB、 GPUなし、オフスクリーンレンダリングオフ(MUJOCO_GL=disable)です。イメージは python:3.12 にpipでmujoco 3.16.0、numpy 2.5.4、scipy 1.18.1を追加しました(インストール11.6 s)。 ポッドメモリのピークは725 MBでした。MuJoCoは同じ入力に対して同じ結果を返すため、表の値は1回実行した値であり、ばらつきは接触位相(A4、50種類)と ボールのサンプル(D、500個)で個別に算出しました。元データは作業ディレクトリの tt-robot/out/(表と図)および tt-robot/logs/(実行ログ)にあります。

目次

1. 直感:2.7 gのボールは設定に敏感である

卓球ボールは直径40 mm、重量2.7 gです。7 m/sで飛ぶボールに受ける空気力は重量と同程度の大きさであり、回転が大きい場合は重量を超えます。 卓台に接触する時間は1 ms強です。そのため、シミュレータの時間ステップ、接触の硬さ、流体係数などのいくつかの設定がボールの軌道を大きく変えます。

ロボットに卓球を教えるには、まず「シミュレータ内のボールが本物のボールのように飛ぶか」を知る必要があります。この記事では、本物のボールの軌道がまだない状態で できること、すなわち 公開された設定をそのまま入力し、文献の値と並べ、どの設定が結果を最も大きく揺さぶるかを測定することを行います。

2. モデル:DeepMind公開MJCFの値をそのまま使用

DeepMindはICRA 2025の卓球論文と共に、ボールの初期状態15,792個(ラリー13,088個、サーブ2,704個)とMuJoCoノートブックを公開しました。 ノートブックの値をそのまま移行しました。

項目 値
時間ステップ、積分器 1 ms, implicitfast
ボール 質量2.7 g、半径0.02 m、薄い殻の球
流体係数(fluidcoef) 0.235 0.25 0.0 1.0 1.0
ボールと卓台の接触 solref -1000000 -17(剛性1e6、減衰17)、摩擦0.1
座標 原点は卓台上面の中央、x幅1.525 m、y長さ2.74 m、z上向き。ロボット側はy < 0

流体力はMuJoCoが qfrc_fluid に別で格納してくれます。重力をオフにし、速度と回転のみを与えた後にこの値を読み取ることで、抗力とマグナス力を直接測定できます。

s = Sim(base.with_(gravity=False))
for v in [2, 5, 10, 15, 20, 25, 30]:
    s.reset([0, 0, 1], [0, v, 0], [0, 0, 0])
    fd = -s.d.qfrc_fluid[1]                    # 진행 방향 반대 힘 = 항력
    cd = fd / (Q * v * v)                      # Q = ½ρA
    for S in [0.0, 0.1, 0.2, 0.4, 0.6, 1.0]:   # 회전비 S = rω / v
        w = S * v / BALL_R
        s.reset([0, 0, 1], [0, v, 0], [-w, 0, 0])   # 탑스핀
        fm = -s.d.qfrc_fluid[2]                # 아래로 누르는 힘 = 마그누스
        km = fm / (w * v) if w > 0 else float("nan")

(TT Lab実験コード exp_b_magnus.py から抜粋。 Sim はMJCFを作成し、 mj_forward まで呼び出す小さなラッパーです。)

3. 30 cm落下:ボールが跳ねすぎる

ITTFの規定では、30 cmから落としたボールは約23 cm跳ねなければならないと定められています。空気抵抗を無視すると、反発係数e ≈ √(23/30) = 0.876となります。

30 cm 에서 떨어뜨린 공, 같은 탁자 값 시뮬레이션 시간 간격(dt)만 1 ms 와 2 ms 로 다릅니다. 5배 느리게. ▶ 누르면 재생 탁자면 놓은 높이 30 cm ITTF 규정 약 23 cm dt 1 ms, e 0.978 꼭대기 26.4 cm dt 2 ms, e 3.004 ↑ 꼭대기 1.96 m (화면 밖) 높이는 A1 실측(반발 속도·꼭대기)과 같은 공기저항으로 다시 그린 움직임입니다. dt 2 ms 는 접촉 강성에 비해 간격이 커서 에너지가 생겨 3배로 튕깁니다.
図:30 cmから落としたボールの反発、時間ステップ1 msと2 ms
モデル 入射速度 反発速度 e 頂点 規定23 cmとの比較
MuJoCo, dt 0.25 ms −2.375 m/s 2.299 m/s 0.968 26.0 cm +3.0 cm
MuJoCo, dt 0.5 ms −2.373 m/s 2.308 m/s 0.973 26.2 cm +3.2 cm
MuJoCo, dt 1 ms −2.368 m/s 2.317 m/s 0.978 26.4 cm +3.4 cm
MuJoCo, dt 2 ms −2.368 m/s 7.114 m/s 3.004 196.4 cm 発散
TT3Dのe 0.85(同等の入射速度・同等の抵抗で計算) 0.850 20.2 cm −2.8 cm
Sony AI 2026のe式(同等の方法で計算) 0.932 24.2 cm +1.2 cm

(図の動きは表の反発速度を基に、実測と同じ空気抵抗C_D 0.471を適用して再描画しました。再描画された頂点は26.4 cmと195.9 cmであり、表と一致しています。)

衝突速度を1–8 m/sに変更すると、違いがより明確になります。MuJoCoのeは0.96–0.99とほぼ平坦ですが、Sony AI 2026の式(e = 0.98 − 0.02·入射速度)は速度が速いほどeが低下します。

충돌 속도별 탁자 반발 계수 e 0.80 0.85 0.90 0.95 1.00 0 2 4 6 8 입사 속도 |v_z| (m/s) MuJoCo dt 1 ms MuJoCo dt 0.5 ms Sony 2026 식 ITTF 30 cm→23 cm 는 e ≈ 0.876 입니다. ITTF 0.876
図:衝突速度別の卓台反発係数、MuJoCo対Sony 2026式

4. 空気:マグナス力が文献の4.2倍強い

出典 C_D マグナス係数 k_M (N·s²/rad/m) MuJoCo比
MuJoCo、DeepMindの値(実測) 0.471 2.053e-5 1.00
TT3D 2025 0.494 4.860e-6 0.237
Tebbe他 2020(C_D 0.4, C_M 0.6, 力の形は推定) 0.400 9.236e-6 0.450
Sony AI 2026 低速0.55、17.5 m/sで0.37–0.51 回転比の関数(この記事では数値を使用しない)

同一の打球(ロボット側のエンドラインの背後 y = −1.6 m、高さ 0.2 m で速度 (0, 7, 1.6) m/s)において回転のみを変更すると、その差が着地点として現れます。

같은 타구, 회전만 바꿨을 때 첫 착지 위치 로봇 쪽 끝선 뒤에서 7 m/s 로 친 공. 가로축은 탁자 길이 방향 y(m). 네트 상대 코트 친 쪽 -1 0 1 2 3 4 5 탑스핀 300 탑스핀 150 무회전 백스핀 150 백스핀 300 속이 빈 표시는 네트에 걸린 공입니다(문헌 식은 네트 높이 아래로 지나가면 걸림으로 판정). MuJoCo(DeepMind 값) TT3D 식 Tebbe 식(힘의 꼴 추정)
図:同一の打球で回転のみを変更した場合のモデル別最初の着地位置
回転 MuJoCo着地y TT3D式着地y 備考
トップスピン 300 rad/s −0.315 m(打った側のコート) 0.355 m TT3Dはネットの高さより1.2 cm低く通過しネットと判定
無回転 0.812 m 0.789 m 両モデルが2.3 cm以内で一致
バックスピン 150 rad/s 3.684 m(場外)、頂点51.3 cm 1.093 m
バックスピン 300 rad/s 5.378 m(場外)、頂点139.6 cm 1.482 m(場外)

無回転ボールでは両モデルがほぼ一致しますが、回転が加わるとMuJoCo側が大きく曲がります。問題は、公開データの回転値がまさにこのMJCFと一緒に使用されることを想定して作成された可能性がある点です(推定)。 その場合、回転値とマグナス係数はペアで使用すべきであり、一方だけを文献の値に変更してはなりません。第6節の感度がその根拠となります。

5. 斜めのバウンド:卓台が滑りやすい

卓台の直上で水平速度3、6、9 m/s、垂直速度2、4 m/s、回転−300、0、+300 rad/sを組み合わせ、バウンド直前と直後の状態を比較しました。

6. 公開初期状態500個:何が最も大きく揺さぶるか

ラリー13,088個のうちロボット側に向かって飛んでくるボール11,999個から500個をランダムに(seed 0)抽出し、DeepMind値のMuJoCo(dt 1 ms)で飛ばしました。 公開データには軌跡がなく、初期状態のみがあります。 そのため、以下は実際のボールとの比較ではなく、「同じ初期状態からシミュレータが出力する値」とその感度です。

指標 5% / 50% / 95%
初期速度 3.80 / 5.49 / 7.89 m/s
初期回転 12.21 / 57.55 / 101.60 rad/s
ロボット側テーブル着地 100.0%(ネット接触 0.6%)
最初のバウンドまで 0.30 / 0.42 / 0.60 s
バウンド直後の速度 3.82 / 4.50 / 5.61 m/s
打撃面(y = −1.6 m)到達 0.51 / 0.71 / 1.06 s
打撃面の高さ 0.01 / 0.31 / 0.47 m

同じ500個の設定だけを変えて再び飛ばし、ペアにして打撃面での位置の差を確認しました。ラケット面の半幅は約7.5 cmなので、差が数cmを超えるとポリシーが空振りします。

계수를 바꾸면 타격면에서 공이 얼마나 비켜 가나 공개 초기 상태 500개를 짝지어 비교. 막대 진한 부분 중앙값, 옅은 부분 95%. 라켓 반폭 7.5 cm dt 0.5 ms 1 / 3.8 C_D 0.40 2.5 / 12.5 C_D 0.55 2.7 / 13.2 탁자 μ 0.3 0.7 / 6 e ITTF ×1.08 4.7 / 10.1 탁자 e = ITTF 6.9 / 15.2 마그누스 ×0.5 12.4 / 37.6 마그누스 ×0.24 17.7 / 57.3 마그누스 0 23.2 / 78.9 문헌 값 조합 17.4 / 57.3 0 20 40 60 80 타격면(y = −1.6 m) 위치 차이 (cm) 기준: DeepMind 공개 MJCF 값, dt 1 ms. 「e ITTF ×1.08」 만 ITTF e 를 기준으로 비교.
図:係数を変更したときの打撃面位置の差の中央値と95%
変更点 打撃面の位置の差の中央値 / 95% ロボット側着地率の変化
dt 0.5 ms / 0.25 ms 1.0 / 3.8 cm, 0.7 / 3.2 cm 0
C_D 0.40 / 0.55 2.5 / 12.5 cm, 2.7 / 13.2 cm −1.4 / 0 %p
テーブル μ 0.25 / 0.3 0.6 / 5.1 cm, 0.7 / 6.0 cm 0
テーブルのeを規定値の0.876に 6.9 / 15.2 cm 0
規定のeから±8% 4.7 / 10.1 cm, 4.6 / 9.8 cm 0
マグヌス ×0.5 12.4 / 37.6 cm −11.0 %p
マグヌス ×0.24(TT3Dの強さ) 17.7 / 57.3 cm −23.0 %p
マグヌス 0 23.2 / 78.9 cm −32.2 %p
文献値の組み合わせ(C_D 0.49、マグヌス ×0.24、規定e、μ 0.3) 17.4 / 57.3 cm −21.2 %p

7. ラケット:ボールが板を突き抜ける

ラケットの板(15×16 cm、厚さ6 mm・14 mm)を固定し、ボールを正面から発射しました。接触が時間間隔のどこで始まるか(位相)を30〜50通りに変化させ、跳ね返るか突き抜けるかをカウントしました。

라켓 접촉 강성과 시간 간격: 뚫리거나 튀거나 판 두께 14 mm, 공 속도 20·30·40 m/s 각 30회(접촉 위상을 흔듦). 칸마다 관통·불안정 횟수/90. 0.1 ms 0.25 ms 0.5 ms 1 ms 2 ms 1e6(DeepMind) 관통 60 관통 60 관통 60 관통 60 59/8 4e6(채택) 안정 안정 안정 11/51 56/26 1.6e+07 안정 안정 튐 60 13/74 43/47 6.4e+07 안정 튐 60 튐 81 11/74 39/51 2.56e+08 튐 41 튐 86 튐 89 13/77 41/49 √k·dt = 1 경계(왼쪽이 √k·dt ≤ 1) 「관통 a」 a 회 판을 뚫음, 「튐 b」 e > 1.05 로 튄 횟수, 「a/b」 둘 다. 굵은 테두리가 채택한 조합. 강성 k 의 단위는 1/s². 위의 dt 는 MuJoCo 의 timestep.
図:ラケット接触の剛性と時間間隔のグリッド:貫通と不安定性の回数

決定。 物理の時間間隔は0.5 ms、ラケットの接触はsolref(−4e6、−34)(減衰比はDeepMindの値と同じ)です。14 mmの板、40 m/sにおいて貫通0/30、不安定0/30でした。 この設定で測定したラケットの反発係数は、4 m/sで0.931、8 m/sで0.893であり、Sony AI 2026の式(0.80、0.72)よりも大きいです。実際のラバーが食い込む深さや接触時間に合わせた値ではありません(未確認)。 テーブルはDeepMindの剛性のままにしました。テーブルに当たる垂直速度は8 m/sを超えないと見なしており(推定)、8 m/sまではセクション3で安定していました。

8. 計算コストは低い

ボールとテーブルのみのモデルは、1コアあたり毎秒23万〜36万ステップで動作しました。同じ測定を2回行いましたが、ノードの異なる負荷によってこれだけの差が出ました(後の測定:dt 0.25〜1 msで229,806〜239,229ステップ/s)。 dt 0.5 msの場合、実時間の120〜180倍です。3つのスレッドで512個のボールを同時にシミュレーションした場合、毎秒58万〜122万ステップでした。 ガントリー2軸と手首2軸のロボットを入れたモデルは、dt 0.5 msにおいて1スレッドで毎秒152,611ステップ(実時間の76倍)でした。この段階ではGPUは必要ありません。 実験時間も短かったです。落下バンドル(A)は11.3 s、空気力学バンドル(B)は3.6 s、バウンド(C)は0.5 s、500個の感度(D)は28.7 sでした。

9. 制限事項

10. 次回予告

このボールモデルの上にロボットを配置し、「見て、予測して、打ち返す」という古典制御のベースラインを実行した結果は、 第5回にあります。強化学習がそのベースラインを超えるかどうかで評価します。 ロボットの身体をどのように構築するかについては、直後の 第3回で見ます。

ティティの一言: 同じボールなのにシミュレータの設定を1行変えただけで、26 cm跳ねていたボールが2 m近くまで跳ね上がりました。卓球ボールが軽いからといって侮ってはいけません。係数はデータとセットで扱ってください!

参考

すべてのリンクは2026-10-18時点でのアクセスを確認しています。

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

コメント

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

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