状态:草稿 (2026-10-18),实测。 数字是通过笔记本(Apple M1 Max, macOS 26.5)中的 Python 3.9.6 和 numpy 2.0.2 直接计算的模拟值。 原始数据与代码:工作目录
measure/robot-arm-basics/的m07_hit.py,out/m07_hit.json. 球拍反弹是一个简单模型,并非使用真实球拍和胶皮测得的值(硬件未实测)。球的初始状态采用 DeepMind 数据集 (CC-BY 4.0)。参考资料查阅于 2026-10-18。 编写规则:实测数据为基础,无法测量的标注为「未实测」,未确认的标注为「未确认」。
目录
1. 直觉:逆向思考
想象一下投篮。为了让球进篮筐,首先要确定球离开手时的速度,然后手腕和手臂移动以产生该速度。 乒乓球也是如此。不同之处在于球已经飞过来,球拍不是在「投掷」球,而是在「弹回」球。
因此,击球决策是一个包含两个阶段的逆向问题。
- 落点 → 出球速度 v_out。 要在规定时间内落到对方球台的目标点,球离开球拍时的速度应该是多少。这是一个逆向求解飞行模型(第 6 篇)的问题。
- 出球速度 → 球拍。 要将入球速度 v_in 变为 v_out,球拍面的法线 n 和球拍速度 v_r 应该是多少。这是一个逆向求解碰撞模型的问题。
在第 1 篇的时间预算中,这两个阶段分配到的份额是几十毫秒。而这一阶段的输出(球拍位置、方向、速度、时间)将传递给第 4 篇的逆运动学和第 8 篇的轨迹生成。
2. 图解:球拍反弹的几何
3. 计算
3.1 出球速度:射击法与牛顿法
未知数是 v_out 的三个分量。由于必须以球台高度(z = 球半径)到达目标点 (x_t, y_t),为了使方程数量达到三个,必须再确定一个变量。 本文中 飞行时间 T 被固定。这样就得到了三个方程:「T 秒后的位置 = 目标」。
F(v_out) = 공을 v_out 으로 T 초 날린 위치 − (x_t, y_t, r) = 0
由于 F 是一个必须对第 6 篇的飞行模型进行积分才能计算的函数,因此无法用公式直接求解。所以,我们使用「尝试并修正」的射击法(shooting method)。雅可比矩阵通过微调 v_out 的各个分量进行试射的有限差分来求得,并用牛顿法进行修正。初始值是无空气阻力抛物线的解。
def solve_vout(p, T, goal):
v = (goal - p) / T
v[2] += 0.5 * 9.81 * T # 진공 포물선에서 출발
for it in range(20):
r = flight_to(p, v, T) - goal # 6편의 RK4 적분
if norm(r) < 1e-4: # 0.1 mm
return v
J = np.column_stack([(flight_to(p, v + h*e_i, T) - flight_to(p, v, T)) / h for e_i in I3])
v = v - np.linalg.solve(J, r)
出球旋转被设为 0(3.3 节的局限性)。
3.2 球拍:反弹模型的闭式解
将球与球拍碰撞的瞬间分为垂直于球拍面的两个方向。
법선 방향: (v_out − v_r)·n = −e_r · (v_in − v_r)·n 반발 계수 e_r
접선 방향: v_out,t = v_in,t 마찰 무시(접선 성분 보존)
如果切向分量守恒,v_out − v_in 中将只剩下法线分量。因此, 球拍法线是 v_out − v_in 的方向,求解关于 v_r·n 的法线方向方程即可得出球拍速度。
def racket_for(v_in, v_out, e_r=0.8):
n = (v_out - v_in) / norm(v_out - v_in)
vrn = (v_out @ n + e_r * (v_in @ n)) / (1 + e_r) # 라켓 속도의 법선 성분
return n, vrn # 접선 성분은 자유(0 으로 둠)
由于球拍速度的切向分量在该模型中不对球产生影响,因此可以是任意值。实际上,这种自由度可用于选择手臂容易发力的方向,或者在带摩擦的模型中用于制造旋转。计算时间为 4.3 µs。
文献证实球拍恢复系数 e_r 的范围在 0.78~0.88 之间。Koç 等人 (2018) 根据人类示范数据估算出 0.788,Nakashima 等人 (2010) 测得胶皮恢复系数为 0.81,Google (2023) 记录的实测值为 0.78。Sony AI (2026) 使用了一个常数 0.878 加上速度相关项和神经网络残差的模型。本文使用 0.8。
3.3 为什么可以忽略摩擦,以及何时不能忽略
实际的胶皮具有黏性和弹性,会改变球的切向速度并施加旋转。Nakashima 等人 (2010) 建模认为胶皮将切向动能储存为弹性能,导致接触点的切向速度反向翻转。本文的模型抛弃了该效果,只处理 回击。带有强烈上旋的攻击无法用此模型进行规划。第 10 篇将测量利用数据能以多快速度修正该模型的错误之处。
4. 实测
4.1 回击实际 200 个球
从第 1 篇的数据集中,挑选出朝向机器人飞来的 200 个球,通过第 6 篇模型将其飞至底线后 23 cm 的击球平面(y = −1.6 m),且这些球均以高于球台 5 cm 以上的高度穿过该平面。在击球平面上,球速中位数为 2.8 m/s(5% 分位 2.2,95% 分位 3.9)。目标点位于对方半场的 (0.3, 0.9) m。
| 飞行时间 T | 牛顿迭代 | 求解时间 | 出球速率 | 球拍法向速度 5% / 中位数 / 95% | 球拍法线与 +y 之间的夹角 | 网上的余量 5% |
|---|---|---|---|---|---|---|
| 0.35 s | 2 | 39 ms | 8.7 m/s | 3.1 / 3.6 / 4.0 m/s | 12° | 3.2 cm |
| 0.45 s | 2 | 50 ms | 6.9 m/s | 2.1 / 2.6 / 2.9 m/s | 17° | 12.6 cm |
| 0.60 s | 2 | 67 ms | 5.7 m/s | 1.5 / 2.0 / 2.2 m/s | 24° | 31 cm |
| 0.80 s | 2 | 90 ms | 5.5 m/s | 1.4 / 1.9 / 2.1 m/s | 35° | 64 cm |
- 在所有四种 T 值下,牛顿法的迭代次数的 5%、50%、95% 分位数均为 2 次,且落点误差的 95% 分位数也在 0.01 mm 以下。这是因为真空抛物线的初始值已经非常接近。
- 求解时间的大部分消耗在 RK4 积分上。第 6 篇中 5 ms 步长的 RK4 位置误差在 10⁻⁷ mm 量级,因此我们将步长增加到 5 ms 重新测量,在 T = 0.6 s 时缩短至 13.7 ms ,用 1 ms 积分核对的落点误差为 0.005 mm。
- 飞行时间越短(回击越快),球就必须飞得越低越快,从而减小了过网余量。在 T = 0.35 s 时,5% 的球以高于网面 3.2 cm 的高度通过。选择 T 是在「快」与「安全」之间进行权衡,实际上这会变成一个将网高余量、球拍速度极限(第 5 篇)、关节加速度(第 8 篇)作为约束条件的最优化问题。本文仅对四个 T 值进行了网格比较,未进行最优化(未实测)。
4.2 球拍稍有偏差时
在 T = 0.6 s 的 100 次回击中,逐一向计算出的球拍加入误差,并用第 6 篇模型重新计算实际落点。
| 误差 | 落点误差 中位数 / 90% |
|---|---|
| 球拍法线倾斜 0.5°(随机方向) | 3.0 / 3.8 cm |
| 球拍法线 1° | 6.1 / 7.5 cm |
| 球拍法线 2° | 11.4 / 15.1 cm |
| 球拍法线 5° | 30.7 / 37.2 cm |
| 球拍速度 +0.05 m/s | 5.4 / 6.1 cm |
| 球拍速度 +0.1 m/s | 10.6 / 11.8 cm |
| 球拍速度 +0.3 m/s | 31.6 / 35.1 cm |
| 实际 e_r 0.75(模型为 0.8) | 13.4 / 15.5 cm |
| 实际 e_r 0.85 | 13.9 / 16.1 cm |
| 实际 e_r 0.70 | 26.9 / 31.0 cm |
| 球拍迟到 10 ms(仅限球速变化) | 2.3 / 4.0 cm |
- 球拍角度 1° 对应 6 cm,球拍速度 0.1 m/s 对应 10 cm。 正如第 3 篇中所述,关节零点 ±0.1° 会使球拍法线倾斜 0.1~0.2°,仅零点误差就会导致约 1 cm 的偏差。在第 9 篇中,如果仅使用 PD 控制,击球瞬间的关节速度误差为 0.2 rad/s,乘以 0.5 m 的手臂长度即为 0.1 m/s 的球拍速度,相当于 10 cm 的落点偏差。
- 恢复系数 e_r 偏差 0.05 会导致 13 cm 的偏差。 由于每块胶皮以及球击中的每个位置都有所不同,该常数必须针对每台机器人重新测量(第 10 篇)。
- 时机比想象中更宽容。 如果球拍延迟 10 ms,球在此期间会稍微下落且减速,该效果导致的落点偏差为 2.3 cm。不过,由于球在 10 ms 内会多飞 2.9 cm(中位数), 球拍面上的击球点也会随之移动。由于球拍半径为 7~8 cm,10 ms 是可以承受的,但如果不补偿第 1 篇中的延迟(几十到 100 ms),就会漏球。
5. 局限性
- 忽略了球拍摩擦力和旋转传递。来球的旋转实际上会改变反弹方向,但在该模型中没有任何效果。
- 将球拍面视为无限大的平面。没有处理击中边缘的球、球拍的弯曲和振动(未实测)。
- 将接触视为瞬时发生。在实际接触时间内,球拍一直在运动和旋转。这就是第 8 篇将击球瞬间加速度设为 0 的原因。
- 预先设定了飞行时间 T。未实现同时优化 T 与击球时间/位置的方法(Koç 等人 2018)。
6. 总结
- 击球决策包含两个逆向问题:从落点求出球速度的射击法(牛顿迭代 2 次),以及从出球速度求出球拍的闭式解(4 µs)。
- 在忽略摩擦力的反弹模型中,球拍法线方向为 v_out − v_in,球拍速度由该方向的一个分量决定。
- 回击所需的球拍速度很小,为 2~4 m/s。困难的不是速度的大小,而是 精度。球拍角度 1°、速度 0.1 m/s、恢复系数 0.05 分别对应 6、10、13 cm 的落点偏差。
乒乓小贴士。 为了回击球,球拍的移动速度其实可以比想象中慢。相反,只要球拍面偏离 1°,球就会偏出一巴掌左右的距离,所以准确比速度更重要!
参考
所有资料查阅于 2026-10-18。
- Nakashima 等人, Modeling of Rebound Phenomenon of a Rigid Ball with Friction and Elastic Effects, ACC 2010, 机构知识库.
- Koç, Maeda, Peters, Online optimal trajectory generation for robot table tennis, RAS 105 (2018), 作者公开版, 表 A.3.
- D'Ambrosio 等, arXiv:2309.03315, 附录 D(球拍反弹设定值与实测值)。
- Conti 等(Sony AI), arXiv:2606.28805, 表 IV(球拍模型)。
- Google DeepMind, competitive_robot_table_tennis, CC-BY 4.0。