Status: Draft (2026-10-18), Measured. Ball physics stage 1 (A–E) completed. The classical control baseline run on this model is described in Part 5and reinforcement learning will be covered in a later part. Measurements were taken on 2026-10-18 in a temporary pod on a home lab Kubernetes cluster. The node is a mini PC (Intel Core Ultra 9 185H), and the pod limits are 3 CPU cores, 3 GiB of memory, no GPU, and offscreen rendering disabled (
MUJOCO_GL=disable). Mujoco 3.16.0, numpy 2.5.4, and scipy 1.18.1 were added via pip topython:3.12(installation took 11.6 s). The peak pod memory was 725 MB. Since MuJoCo produces identical results for identical inputs, the values in the table are from a single run, and dispersion was measured separately for the contact phase (A4, 50 variations) and ball samples (D, 500 units). Raw data is located in the working directorytt-robot/out/(tables and figures) andtt-robot/logs/(execution logs).
Table of Contents
- 1. Intuition: A 2.7 g Ball is Sensitive to Settings
- 2. Model: Values from DeepMind's Public MJCF As-Is
- 3. 30 cm Drop: The Ball Bounces Too Well
- 4. Air: The Magnus Force is 4.2x Stronger than Literature
- 5. Oblique Bounce: The Table is Slippery
- 6. 500 Public Initial States: What Shakes Things Up the Most
- 7. Racket: The Ball Passes Through the Paddle
- 8. Computation is Cheap
- 9. Limitations
- 10. To the Next Part
- References
1. Intuition: A 2.7 g Ball is Sensitive to Settings
A table tennis ball is 40 mm in diameter and weighs 2.7 g. The aerodynamic force on a ball flying at 7 m/s is comparable to its weight, and with high spin, it exceeds the weight. The contact time on the table is around 1 ms. Therefore, a few settings like the simulator's time step, contact stiffness, and fluid coefficients significantly alter the ball's trajectory.
To teach a robot table tennis, we must first know whether "the ball inside the simulator flies like a real ball." This post does what can be done while real ball trajectories are not yet available: namely, plugging in the public settings as-is, placing them side-by-side with literature values, and measuring which settings disturb the results the most.
2. Model: Values from DeepMind's Public MJCF As-Is
Alongside their ICRA 2025 table tennis paper, DeepMind released 15,792 initial ball states (13,088 rallies, 2,704 serves) and a MuJoCo notebook. We transferred the notebook's values as-is.
| Item | Value |
|---|---|
| Time step, integrator | 1 ms, implicitfast |
| Ball | Mass 2.7 g, radius 0.02 m, thin-shell sphere |
| Fluid coefficients (fluidcoef) | 0.235 0.25 0.0 1.0 1.0 |
| Ball-table contact | solref -1000000 -17(stiffness 1e6, damping 17), friction 0.1 |
| Coordinates | Origin at the center of the table top, x width 1.525 m, y length 2.74 m, z up. Robot side is y < 0 |
Fluid forces are provided separately by MuJoCo in qfrc_fluid . Disabling gravity and applying only velocity and spin allows reading this value to directly measure drag and Magnus forces.
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")
(Excerpted from TT Lab experiment code exp_b_magnus.py . Sim is a small wrapper that builds the MJCF and invokes mj_forward .)
3. 30 cm Drop: The Ball Bounces Too Well
ITTF regulations specify that a ball dropped from 30 cm should bounce to about 23 cm. Ignoring air resistance, the coefficient of restitution is e ≈ √(23/30) = 0.876.
| Model | Impact velocity | Rebound velocity | e | Peak height | Compared to regulation 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 | Diverged |
| TT3D e 0.85 (calculated with same impact velocity and resistance) | 0.850 | 20.2 cm | −2.8 cm | ||
| Sony AI 2026 e formula (calculated using the same method) | 0.932 | 24.2 cm | +1.2 cm |
(The motion in the figure uses the rebound velocity from the table, redrawn with the same air resistance C_D 0.471 as measured. The redrawn peaks are 26.4 cm and 195.9 cm, matching the table.)
- The DeepMind default table is more elastic than regulations dictate. Even when changing dt to 0.25–1 ms, e remains 0.968–0.978.
- At dt 2 ms, the numerical values blow up. Contact stiffness 1e6 corresponds to a natural frequency ω₀ = √k = 1,000 rad/s, and when ω₀·dt reaches 2, the contact integration generates energy. Measurements of racket contact in Section 7 also showed ω₀·dt ≤ 1 as the stability boundary.
- It can be adjusted with damping alone. Keeping stiffness at 1e6 and varying only damping b using bisection yields e = 0.876 (regulation) at b = 83.8, 0.946 (+8%) at b = 38.5, and 0.806 (−8%) at b = 128.1. The +8% of DeepMind's default 0.978 exceeds 1, so it cannot be achieved via damping alone.
- Dispersion according to contact phase. Even for the same drop, e varies depending on where the contact begins between time steps. Measured across 50 phases, the standard deviation was 0.005 at dt 0.25 ms, 0.012 at 0.5 ms, and 0.005–0.008 at 1 ms, with dt 1 ms reaching a maximum of 1.002, occasionally exceeding 1. In reinforcement learning, this dispersion acts like small observation noise.
Changing the collision velocity to 1–8 m/s makes the difference clearer. MuJoCo's e is nearly flat at 0.96–0.99, whereas Sony AI 2026's formula (e = 0.98 − 0.02·impact velocity) decreases e as velocity increases.
4. Air: The Magnus Force is 4.2x Stronger than Literature
| Source | C_D | Magnus coefficient k_M (N·s²/rad/m) | Compared to MuJoCo |
|---|---|---|---|
| MuJoCo, DeepMind value (measured) | 0.471 | 2.053e-5 | 1.00 |
| TT3D 2025 | 0.494 | 4.860e-6 | 0.237 |
| Tebbe et al. 2020 (C_D 0.4, C_M 0.6, force form estimated) | 0.400 | 9.236e-6 | 0.450 |
| Sony AI 2026 | Low speed 0.55, 0.37–0.51 at 17.5 m/s | Function of spin ratio (values not used in this post) |
- The effective C_D remained nearly constant at 0.470–0.474 across 2–30 m/s. The first value of fluidcoef, 0.235, corresponds to C_D/2.
- The Magnus force turned out to be a constant k_M = 2.053e-5 directly proportional to velocity and spin. Converted to lift coefficient, C_L = 1.33·S, whereas TT3D uses 0.316·S.
- Applying 300 rad/s backspin to a ball flying at 7 m/s results in a MuJoCo Magnus force of about 43 mN, which is greater than its weight of 26 mN. The ball floats upward. We assume this does not happen with real balls, though we have not verified it ourselves (estimated).
- Some studies report a phenomenon where lift abruptly changes near a spin ratio of 0.5 (lift crisis), but models with constant coefficients—whether MuJoCo or literature formulas—fail to capture this.
Changing only the spin for the same shot (velocity (0, 7, 1.6) m/s at y = −1.6 m behind the robot-side baseline, height 0.2 m) reveals the difference in landing points.
| Spin | MuJoCo landing y | TT3D formula landing y | Note |
|---|---|---|---|
| Topspin 300 rad/s | −0.315 m (striker's court) | 0.355 m | TT3D passes 1.2 cm below net height, judged as a net hit |
| No spin | 0.812 m | 0.789 m | Both models agree within 2.3 cm |
| Backspin 150 rad/s | 3.684 m (out), peak 51.3 cm | 1.093 m | |
| Backspin 300 rad/s | 5.378 m (out), peak 139.6 cm | 1.482 m (out) |
No-spin balls are nearly identical between the two models, but introducing spin causes MuJoCo to drift significantly. The issue is that the spin values in the public data may have been designed to be used specifically with this MJCF (estimated). If so, the spin values and Magnus coefficient must be used only as a pair, and changing only one to a literature value is not allowed. The sensitivity in Section 6 is the basis for this.
5. Oblique Bounce: The Table is Slippery
Combining horizontal velocities of 3, 6, 9 m/s, vertical velocities of 2, 4 m/s, and spins of −300, 0, +300 rad/s directly above the table, we compared the states immediately before and after the bounce.
- The effective friction coefficient of DeepMind's values is approximately 0.10. This matches the configured friction of 0.1 and is smaller than the literature's 0.25–0.3. For example, a ball entering with 6 m/s horizontal, 4 m/s vertical, and no spin exited the bounce with 5.19 m/s horizontal. The TT3D formula gives 3.78 m/s, and the Sony formula gives 4.10 m/s.
- The contact point continued to slide even after the bounce. Literature formulas often result in rolling for the same inputs.
- Even with MuJoCo adjusted to match regulation e and friction of 0.3, μ remained 0.30 during the sliding phase, but the effective μ lingered at 0.07–0.17 during the rolling phase. We suspect this is because the contact setting in the friction direction (solreffriction) has only damping and fails to fully halt the sliding (estimated).
- In a few cases with vertical 2 m/s and backspin, e exceeded 1, reaching 1.08–1.16. We suspect this is caused by the coupling between friction and vertical-direction contact (estimated). This is an item to be tuned together in the next calibration cycle.
6. 500 Public Initial States: What Shakes Things Up the Most
Out of 13,088 rallies, 500 balls heading toward the robot side were randomly sampled (seed 0) and flown using DeepMind's MuJoCo values (dt 1 ms). The public data does not contain trajectories, only initial states. Therefore, what follows is not a comparison against real balls, but rather "the values produced by the simulator from the same initial state" and their sensitivity.
| Metric | 5% / 50% / 95% |
|---|---|
| Initial velocity | 3.80 / 5.49 / 7.89 m/s |
| Initial spin | 12.21 / 57.55 / 101.60 rad/s |
| Table landing on the robot side | 100.0% (net contact 0.6%) |
| Until first bound | 0.30 / 0.42 / 0.60 s |
| Velocity immediately after bound | 3.82 / 4.50 / 5.61 m/s |
| Reached strike plane (y = −1.6 m) | 0.51 / 0.71 / 1.06 s |
| Strike plane height | 0.01 / 0.31 / 0.47 m |
We re-launched the same 500 configurations with changed settings and paired them to observe the positional difference at the strike plane. Since the half-width of the racket face is about 7.5 cm, if the difference exceeds a few cm, the policy misses.
| Changed parameter | Strike plane position difference median / 95% | Robot-side landing rate change |
|---|---|---|
| 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 |
| Table μ 0.25 / 0.3 | 0.6 / 5.1 cm, 0.7 / 6.0 cm | 0 |
| Table e to standard value 0.876 | 6.9 / 15.2 cm | 0 |
| Standard e ±8% | 4.7 / 10.1 cm, 4.6 / 9.8 cm | 0 |
| Magnus ×0.5 | 12.4 / 37.6 cm | −11.0 %p |
| Magnus ×0.24 (TT3D intensity) | 17.7 / 57.3 cm | −23.0 %p |
| Magnus 0 | 23.2 / 78.9 cm | −32.2 %p |
| Literature value combination (C_D 0.49, Magnus ×0.24, standard e, μ 0.3) | 17.4 / 57.3 cm | −21.2 %p |
- The largest factor is the Magnus effect. Lowering it to literature intensity reduces the balls landing on the table to 385 out of 500 (77%). This is a sign that the spin values and coefficients in the data are coupled.
- A ±8% table restitution causes 5% of the balls to miss by about 10 cm (9.8–10.1 cm at the 95th percentile). This is larger than the racket half-width. This is consistent with DeepMind's RSS 2023 paper observation that "rewards drop significantly when table restitution is off by 8%" (based on our survey document).
- A time step of 1 ms is sufficient (when looking only at the ball). Even when reduced to 0.5 ms and 0.25 ms, the median strike plane difference remained under 1 cm. The story changes when the racket is introduced, which we will examine in Section 7.
7. Racket: The Ball Passes Through the Face
We fixed the racket face (15×16 cm, thickness 6 mm·14 mm) and shot balls directly at it. We varied the contact start timing (phase) across 30–50 variations to count bounces versus penetrations.
- Applying DeepMind's table stiffness (1e6) directly to the racket causes fast balls to pass through the face. The 6 mm face penetrated all 50 times starting from 25 m/s, and the 14 mm face from 30 m/s, remaining the same even when dt was reduced to 0.25 ms. This happens because when the ball's penetration depth into the face (velocity/√k via linear approximation, 40 mm for 40 m/s) exceeds "ball radius + half of face thickness", the ball center passes the face middle and the normal vector flips. Our initial hypothesis that "it goes too far in a single step and misses contact" was only correct at dt 2 ms.
- MuJoCo's default contact (solref 0.02 1) is too soft for the ball. All conditions resulted in penetration even at 10 m/s.
- Increasing stiffness causes numerical bouncing at larger dt values. In the grid below, cells where √k·dt exceeded 1 occasionally caused e > 1.05 bounces, while cells with 1 or less showed neither penetration nor instability at stiffnesses of 4e6 and above.
Decision. The physics time step is 0.5 ms, and racket contact is solref (−4e6, −34) (with damping ratio matching DeepMind's value). For the 14 mm face at 40 m/s, penetration was 0/30 and instability was 0/30. The restitution coefficient of the racket measured under this setup is 0.931 at 4 m/s and 0.893 at 8 m/s, which is larger than the Sony AI 2026 formula (0.80, 0.72). It is not tailored to the actual rubber's penetration depth and contact time (unverified). The table kept DeepMind's stiffness as is. We assumed the vertical velocity hitting the table does not exceed 8 m/s (estimated), and up to 8 m/s was stable in Section 3.
8. Computation is Cheap
The model with only the ball and table ran at 230k–360k steps per second on a single core. Two identical measurements yielded these differences due to varying node loads (later measurement: 229,806–239,229 steps/s at dt 0.25–1 ms). With dt 0.5 ms, this is 120–180x real-time. Running 512 balls simultaneously across 3 threads yielded 580k–1.22M steps per second. The model including a 2-axis gantry and 2-axis wrist robot ran at 152,611 steps per second on 1 thread at dt 0.5 ms (76x real-time). This stage does not require a GPU. Experiment times were also short: drop bundle (A) took 11.3 s, aerodynamics bundle (B) 3.6 s, bounce (C) 0.5 s, and 500-sample sensitivity (D) 28.7 s.
9. Limitations
- We did not compare against real ball trajectories. The comparison targets are literature values, and we did not re-measure the literature values ourselves. The next step is fitting coefficients to trajectories captured by our cameras. Our current 30 fps scoreboard cameras barely capture bounce moments and spin, necessitating high-speed cameras.
- We could not verify which model was used to estimate the public spin values (unverified). The interpretation that "this MJCF is paired" is an assumption.
- Tebbe's force formulation and Sony's Magnus coefficient (spin ratio function) were either not used as numerical values in this post or left as estimates.
- The drop motion in the figure is redrawn using empirically measured rebound velocities. The landing figures by spin only plot the landing positions from the table, and the MuJoCo trajectories themselves are not drawn.
10. Moving to the Next Part
The results of running classical control baselines—"seeing, predicting, and swinging"—by placing the robot on top of this ball model are in Part 5. Reinforcement learning is evaluated based on whether it surpasses those baselines. How to build the robot's body will be covered right next in Part 3.
TT's Word. It's the same ball, but changing a single line of simulator settings made a ball that bounced 26 cm soar nearly 2 m. Don't underestimate table tennis balls just because they're light. Please treat coefficients as a pair with the data!
References
All links were verified to be accessible on 2026-10-18.
- DeepMind, Achieving Human Level Competitive Robot Table Tennis(ICRA 2025): https://arxiv.org/abs/2408.03906
- Public data and MuJoCo notebooks: https://github.com/google-deepmind/competitive_robot_table_tennis(Initial ball states, © 2025 Google LLC, CC BY 4.0. This post does not redistribute the data, only presenting results from sampling 500 and launching them in the simulator.)
- DeepMind, Robotic Table Tennis: A Case Study into a High Speed Learning System(RSS 2023): https://arxiv.org/abs/2309.03315
- Sony AI, Physics Models for Sim-to-Real Transfer in Professional-Level Robot Table Tennis(2026): https://arxiv.org/abs/2606.28805
- TT3D: Table Tennis 3D Reconstruction(2025): https://arxiv.org/abs/2504.10035
- MuJoCo fluid model documentation: https://mujoco.readthedocs.io/en/stable/computation/fluid.html, MuJoCo repository: https://github.com/google-deepmind/mujoco
- Coefficients by Tebbe et al. (2020) and lift crisis reports around a 0.5 spin ratio (Miyazaki, 2017) are values whose originals were verified during the research phase, though the links were not re-verified this time.
- Cited codes are TT Lab experimental codes.