TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

乒乓球机器人的经典控制基线:看见、预测、挥拍,能回击几个?

状态:草稿(2026-10-18),实测。相机周期、噪声、延迟以及机器人的速度和力限均采用假设值。 测量于 2026-10-18 在与第二篇相同的临时 Pod(迷你 PC 节点 Intel Core Ultra 9 185H,上限 CPU 3 核、内存 3 GiB,无 GPU,mujoco 3.16.0)中进行。 物理时间步长 0.5 ms,球拍接触 solref 为 (−4e6, −34)(第二篇第 7 节设定的值)。球使用了 DeepMind 公开的初始状态中与第二篇相同的 500 个样本(seed 0)的前 100 个, 由于时间关系,延迟 100 ms 和 30 Hz 的条件仅运行了前 50 个。每个条件运行了一次。前三个条件共 300 次运行耗时 1,573 s(3 个进程)。 原始数据位于工作目录 tt-robot/out/(三个 F1 表格及各轮次原始数据 JSON)与 tt-robot/logs/ 中。

目录

1. 直觉:强化学习必须超越的底线

当我们要用强化学习来训练乒乓球机器人时,首先必须确立「打得好」的标准。本文的基线是由人工编写的经典控制。 通过观察球,利用物理公式预测其飞行轨迹,计算击球位置和球拍角度,并将机械臂移动到该位置。其中不包含任何学习过程。 只有搞清楚这个基线能回击几个球,以及它在 哪里 失败了,我们才能说明强化学习究竟带来了哪些改进。

2. 机器人:2 轴龙门架 + 2 轴手腕

部件 数值(均为假设值)
龙门架 位于机器人侧端线后方 38 cm(y = −1.75 m)的平面内,横向 x ±0.9 m,高度 z −0.15–0.7 m
手腕 yaw 和 pitch 两个轴,±1.4 rad。球拍面中心距离 pitch 轴 0.15 m
极限 龙门架 4 m/s、40 m/s²,力 400 N(横向)· 300 N(高度)。手腕 20·30 rad/s、400·600 rad/s²、20 N·m

第 3 篇的硬件规划中,这对应于「2 轴导轨 + 2 轴手腕」(第 2、3 阶段)的形态。由于龙门架没有深度(y)轴,球拍能触及的 y 与球的纵向位置相交的瞬间即为击球时刻。

3. 管道:每个阶段一个函数

  1. 球状态估计。 假设相机仅观察球的位置(120 Hz,噪声 σ 3 mm,延迟 30 ms),通过最小二乘法拟合位置、速度和旋转。由于旋转仅通过轨迹的弯曲来体现,因此设置了一个向先验值拉扯的项。
  2. 飞行预测。 使用 RK4 求解重力、阻力和马格纳斯力,球台反弹则通过冲量模型处理。系数采用了第二篇中测得的仿真器数值。
  3. 击球决策。 通过击球法计算将球送回目标落点(对方球场中央)所需的回弹速度,并利用镜面法则与冲量模型确定球拍法线和挥拍速度。
  4. 逆运动学。 手腕的两个角度可直接从法线得出,龙门架只需做一次减法(见下方代码)。
  5. 关节轨迹。 从当前状态到击球瞬间的(位置、速度、加速度为 0)通过五次多项式进行连接。pitch 的击球速度即为挥拍速度。
  6. 关节控制。 通过计算力矩(PD + 前馈)进行跟踪,并在力极限处进行截断。
  7. 重新规划。 在反弹前 0.2 s 进行一次规划,反弹后每隔 50 ms 根据新的观测结果重新拟合,并将轨迹拼接起来。
def ik(c, n, rb):
    """원하는 라켓 면 중심 c 와 법선 n → 관절 [x, z, yaw, pitch]."""
    n = np.asarray(n, float) / np.linalg.norm(n)
    th = math.asin(max(-1.0, min(1.0, n[2])))      # pitch
    psi = math.atan2(-n[0], n[1])                   # yaw
    x = c[0] - rb.L * math.sin(th) * math.sin(psi)  # 갠트리는 손목 오프셋을 빼면 끝
    z = c[2] - rb.L * math.cos(th)
    y_res = c[1] - (rb.y_g - rb.L * math.sin(th) * math.cos(psi))   # 0 이어야 닿는다
    q = np.array([x, z, psi, th])
    ok = bool(np.all(q >= np.array(rb.lo)) and np.all(q <= np.array(rb.hi)))
    return q, y_res, ok

(摘自 TT Lab 实验代码 ttsim.py ,已删去文档字符串和注释。)

正交龙门架的两个轴直接叠加在球拍位置上,因此不存在奇异点、多解或数值逆运动学问题。如果是 6 轴机械臂,则必须通过数值优化和避奇来解决同样的工作。旋转 pitch 可以使球拍面中心的精确速度正好沿着球拍面的法线方向,从而将「朝向哪里」(角度)和「打得多猛」(pitch 速度)清晰地区分开来。

4. 结果

条件 相机(周期·噪声·延迟,假设值) 规划器的物理系数 球 回击成功 击中但失败 未击中 规划失败
真实状态 直接已知真实状态 仿真器实测值 100 62% 16 2 20
120 Hz·延迟 30 ms 120 Hz, 3 mm, 30 ms 仿真器实测值 100 60% 8 9 23
仅规划器用文献系数 120 Hz, 3 mm, 30 ms 文献(TT3D 阻力·马格纳斯力,球台 e 0.85·μ 0.3) 100 48% 11 11 30
120 Hz·延迟 100 ms 120 Hz, 3 mm, 100 ms 仿真器实测值 50 26% 4 17 16
30 Hz·延迟 100 ms 30 Hz, 10 mm, 100 ms 仿真器实测值 50 2% 0 17 32

「击中但失败」是球出界和落入自己球场数量的总和。延迟 100 ms 条件下的 50 个球与 30 ms 条件下 100 个球的前 50 个是相同的球,在这 50 个球中,30 ms 条件下的成功率也是 60%。

고전 제어 기준선: 공이 어디서 실패하나 공개 초기 상태 표본(앞의 셋 100개, 뒤의 둘 50개). 카메라 수치는 가정값. 참 상태를 안다 62% 120 Hz·지연 30 ms 60% 플래너만 문헌 계수 48% 120 Hz·지연 100 ms 26% 30 Hz·지연 100 ms 2% 반환 성공 맞혔으나 탁자 밖 맞혔으나 자기 코트 못 맞힘 계획 실패 라켓 추종 오차 중앙값 0.05–0.08 cm. 제어보다 작업 공간·지연이 실패를 가릅니다.
图:各条件下的回击成功与失败类型
条件 击球时刻误差中位数 击球时刻球预测误差中位数 球拍跟踪误差中位数 成功回击球的落点误差中位数
真实状态 1.6 ms 1.9 cm 0.08 cm 21.3 cm
120 Hz·延迟 30 ms 2.3 ms 3.8 cm 0.07 cm 18.5 cm
仅规划器用文献系数 2.0 ms 3.3 cm 0.06 cm 12.4 cm
120 Hz·延迟 100 ms 2.2 ms 9.7 cm 0.07 cm 21.0 cm
30 Hz·延迟 100 ms 2.2 ms 34.6 cm 0.05 cm 12.4 cm(1个)

5. 是什么导致了失败

6. 局限性

7. 下一篇预告

接下来,我们将把两种强化学习方法(仅学习击球参数的混合方法、直接输出关节目标的方法)与该基线进行并排对比,条件采用相同的球样本、相同的相机假设以及相同的机器人极限(第 7 篇)。在此之前,我们将在 第 6 篇中通过阅读原文来探讨 DeepMind 机器人的局限性,并借助仿真器分析旋转问题。 我们还会一并列出各项失败原因的具体数量,以便展示强化学习究竟减少了哪些失败。

小蒂碎碎念。 机械臂明明以 0.7 mm 的误差精准移动了,十个球却还是漏掉了四个。问题不在手臂,而在位置(工作空间)和眼睛(延迟)。请先给我一双能快点看清的眼睛吧!

参考

所有链接均已于 2026-10-18 确认可正常访问。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论