TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

将击球转化为方程:从期望的落点反推球拍速度和法线

状态:草稿 (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. 直觉:逆向思考

想象一下投篮。为了让球进篮筐,首先要确定球离开手时的速度,然后手腕和手臂移动以产生该速度。 乒乓球也是如此。不同之处在于球已经飞过来,球拍不是在「投掷」球,而是在「弹回」球。

因此,击球决策是一个包含两个阶段的逆向问题。

  1. 落点 → 出球速度 v_out。 要在规定时间内落到对方球台的目标点,球离开球拍时的速度应该是多少。这是一个逆向求解飞行模型(第 6 篇)的问题。
  2. 出球速度 → 球拍。 要将入球速度 v_in 变为 v_out,球拍面的法线 n 和球拍速度 v_r 应该是多少。这是一个逆向求解碰撞模型的问题。

在第 1 篇的时间预算中,这两个阶段分配到的份额是几十毫秒。而这一阶段的输出(球拍位置、方向、速度、时间)将传递给第 4 篇的逆运动学和第 8 篇的轨迹生成。

2. 图解:球拍反弹的几何

라켓 법선은 나갈 속도와 들어온 속도의 차이 방향 들어온 공 v_in 나갈 공 v_out 법선 n 라켓 면 n = (v_out − v_in) / |v_out − v_in| (마찰 무시: 접선 성분 보존) v_r·n = (v_out·n + e_r · v_in·n) / (1 + e_r) e_r: 라켓 반발 계수(문헌 0.79–0.88). 라켓은 n 방향으로만 움직인다고 둔다.
图解:入球速度与出球速度,以及差值方向的球拍法线

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

4.2 球拍稍有偏差时

在 T = 0.6 s 的 100 次回击中,逐一向计算出的球拍加入误差,并用第 6 篇模型重新计算实际落点。

라켓이 조금 틀리면 공은 얼마나 빗나가나 법선 0.5° 기울어짐 3.0 법선 1° 6.1 법선 2° 11.4 법선 5° 30.7 속도 +0.05 m/s 5.4 속도 +0.1 m/s 10.6 속도 +0.3 m/s 31.6 실제 e_r 0.75(모델 0.8) 13.4 실제 e_r 0.7 26.9 5 ms 늦음(공 속도만) 1.0 10 ms 늦음(공 속도만) 2.3 0 10 20 30 착지점 오차 중앙값(cm). 공 100개, 비행 시간 0.6 s 반환.
图解:球拍法线角度、速度、恢复系数、时机误差转化为落点误差的幅度
误差 落点误差 中位数 / 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

5. 局限性

6. 总结

乒乓小贴士。 为了回击球,球拍的移动速度其实可以比想象中慢。相反,只要球拍面偏离 1°,球就会偏出一巴掌左右的距离,所以准确比速度更重要!

参考

所有资料查阅于 2026-10-18。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论