TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

用 MuJoCo 测量乒乓球物理特性:回弹、阻力和旋转取决于模拟器的一行设置

状态:草稿 (2026-10-18),实测。球物理第一阶段 (A–E) 完成。 基于此模型运行的经典控制基准线在 第 5 篇中介绍,强化学习将在后续篇章中撰写。 测量于 2026-10-18 在家庭实验室 Kubernetes 的一个临时 Pod 中进行。节点为一台迷你 PC (Intel Core Ultra 9 185H),Pod 上限为 3 个 CPU 核心、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)。 Pod 内存峰值为 725 MB。由于 MuJoCo 对相同的输入产生相同的结果,表中的数值均为运行一次的结果,离散度则通过接触相位(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 Notebook。 我们直接使用了 Notebook 中的数值。

项目 数值
时间步长,积分器 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,如果差异超过几厘米,策略就会挥空。

계수를 바꾸면 타격면에서 공이 얼마나 비켜 가나 공개 초기 상태 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. 计算开销低

仅包含球和球台的模型在单核上每秒可运行 23 万至 36 万步。由于节点负载不同,我们进行了两次相同的测量,得到了不同的结果(后一次测量:在 dt 0.25–1 ms 下为 229,806–239,229 步/秒)。 当 dt 为 0.5 ms 时,相当于实时速度的 120–180 倍。如果使用 3 个线程同时模拟 512 个球,则为每秒 58 万至 122 万步。 包含 2 轴龙门架和 2 轴手腕机器人的模型在 dt 为 0.5 ms、单线程下为每秒 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 篇中介绍。

TT 的小贴士。 明明是同一个球,仅仅改了一行模拟器设置,原本偏离 26 cm 的球就飞高了将近 2 m。可不能因为乒乓球轻就轻视它。请将系数与数据作为一个整体来处理!

参考资料

所有链接均已于 2026-10-18 验证可访问。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论