TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

击球前:从感知到电机电流的七个步骤与时间预算

状态:草稿(2026-10-18),实际测量。 本文中的数字是在一台笔记本电脑(Apple M1 Max, macOS 26.5)上使用 Python 3.9.6 和 numpy 2.0.2 直接计算得出的值。时间是 7 次重复计算的中位数,第一次运行作为预热被舍弃。原始数据和代码位于工作目录 measure/robot-arm-basics/(m01_budget.py, m01b_fast.py, out/m01_budget.json)中。没有一个数值是在实际机器人硬件上测得的(硬件未实测)。球的初始状态采用了 DeepMind 的公开数据集(CC-BY 4.0),乒乓球规格通过 ITTF Statutes 2026 原文进行了确认。所有参考资料均于 2026-10-18 查阅。编写规则:实测数据为基础,无法测量的标注为「未实测」,未能确认的标注为「未确认」。

目录

1. 直觉:必须在 0.6 秒内完成的七件事

人在对方球拍击球的瞬间就已经转动了身体。眼睛追踪着球,猜测它会在哪里弹起,然后将手臂向后引并挥拍。所有这一切都在不到一秒的时间内发生,并且大多数过程都是在无意识中进行的。

机器人必须通过一项项计算来解开这个过程。本系列将该计算过程分为七个步骤。

步骤 做的事情 涉及的篇章
1 感知(perception) 从相机图像中寻找球并获取三维位置 第 2 篇(坐标转换)
2 状态估计(state estimation) 从带有噪声的位置序列中估计位置和速度 第 6 篇(卡尔曼滤波)
3 飞行预测 利用重力、阻力、马格努斯力和反弹计算球的未来轨迹 第 6 篇
4 击球决策 决定何时何地击球、球拍的速度和拍面方向 第 7 篇
5 逆运动学(inverse kinematics) 将球拍姿态转换为关节角度 第 3、4、5 篇
6 关节轨迹(trajectory) 创建从当前姿态到击球姿态及速度的时间函数 第 8 篇
7 低层控制(low-level control) 通过电机电流实际跟随该轨迹 第 9 篇

第 10 篇将结合乒乓球机器人论文,对比这些步骤中哪些应该通过方程求解,哪些应该交由学习算法处理。

本系列是将乒乓球机器人做成 开源硬件的准备过程。因此,每一个数字的编写都旨在引出「应该购买什么零件」。例如:关节速度上限为多少时球拍能达到多少 m/s(第 5 篇),球拍角度偏离 1° 会使球偏离多少厘米(第 7 篇),控制周期为 200 Hz 时会出现什么崩塌(第 9 篇)等。

2. 图示:七个步骤与我们代码的计算时间

공 하나를 치기까지: 일곱 단계와 우리 코드의 계산 시간 1 인지 카메라 → 공 픽셀 → 3차원 위치 125 fps 면 8 ms 마다 한 점 2 상태 추정 칼만 필터로 위치·속도 프레임당 125 µs 3 비행 예측 중력·항력·Magnus + 바운스 타격면까지 11 ms 4 타격 결정 나갈 속도 → 라켓 법선·속도 뉴턴법 14 ms, 닫힌 해 4 µs 5 역기구학 라켓 자세 → 관절각 해석해 58 µs 6 관절 궤적 지금 자세 → 타격 자세·속도 5차 계수 7 µs 7 저수준 제어 위치 루프 → 전류 루프 1 kHz / 30 kHz 시간: 파이썬 3.9·numpy, 노트북 CPU, 7회 반복 중앙값(첫 회 버림).
图示:七个步骤以及使用本系列 Python 代码计算每个步骤所花费的时间

3. 计算:球要多久才能飞到

时间预算的起点是球的飞行时间。为了进行直接测量,我们准备了两个东西。

球的初始状态。 Google DeepMind 公开的 competitive_robot_table_tennis 数据集包含 15,792 个由人或机器人击球 之后瞬间的球位置、速度和角速度(13,088 个拉力球,2,704 个发球)。该数据用于 D'Ambrosio 等人 2024 年的论文(arXiv:2408.03906)的训练,并以 CC-BY 4.0 授权发布。坐标系以乒乓球台顶面中心为原点,x 为宽度,y 为长度,z 为高度。本系列全篇均使用相同的坐标系。机器人站在 y < 0 的一侧。

飞行模型。 使用将在第 6 篇中详细讨论的运动方程,以 1 ms 的时间间隔进行 RK4 积分。

m · dv/dt = m·g  −  ½ ρ C_D A |v| v  +  ½ ρ A r C_M (ω × v)
            중력     항력(drag)          Magnus 힘
탁구대에 닿으면: 법선 속도에 반발 계수 e, 접선 방향은 쿨롱 마찰 μ

代码很简短。从数据集中挑选出朝向机器人飞来的球进行模拟,并记录球在机器人侧球台上弹起一次后穿过多个「击球平面」的时间。

incoming = [s for s in rallies + serves if s["vel_y"] < 0]      # 로봇(y<0) 쪽으로 오는 공 14,703개
for s in incoming:
    rec = fly(p, v, w, dt=1e-3, stop=lambda t, p, v, nb: p[1] < -2.2 or nb >= 2)
    # 첫 바운스가 로봇 쪽 탁구대 안이면 유효. 이후 y = -1.37, -1.6, -1.9 를 지나는 시각·높이·속력을 기록

结果如下。在 14,703 个球中,有 11,590 个正确落在了机器人侧的球台上(其余为网球或出界),其中飞到底线(y = −1.37 m)的球有 10,618 个。

상대가 친 뒤 공이 로봇 끝줄을 지나기까지 0.30 0.45 0.60 0.75 0.90 1.05 1.20 0.02 0.04 0.06 0.08 상대 타구 뒤 시간(초) 비율 바운스 중앙 0.45s 끝줄 통과 중앙 0.65s 공 10,618개(DeepMind 초기 상태, CC-BY 4.0)를 우리 비행 모델로 날림. 5·95백분위: 0.47–0.95초. 막대는 0.025초 칸.
图示:对手击球后球穿过机器人侧底线所花费时间的分布
事件 第 5 百分位 中位数 第 95 百分位
击球后球速 (m/s) 3.89 5.46 7.62
击球后旋转 (rad/s) 9 49 100
至机器人侧反弹(秒) 0.317 0.449 0.621
反弹后至顶点(秒) 0.511 0.678 0.904
顶点高度(台面上方,m) 0.20 0.30 0.45
通过底线 y = −1.37(秒) 0.474 0.654 0.951
通过底线后 23 cm,y = −1.6(秒) 0.538 0.745 1.082
通过底线时球速 (m/s) 2.07 2.88 4.15
通过底线时高度(台面上方,m) 0.06 0.24 0.38

计算时间为:模拟全部 14,703 个球耗时 130 秒,平均每个球约 9 ms。

如果是更快的球

本数据集中的球并不快。同一篇论文的附录将超过 7 m/s 的球归类为「快」,而上表中的第 95 百分位为 7.6 m/s。随着竞技水平的提高,球速会变快,因此我们进行了单独计算。在对方底线上方 45 cm 处沿 −y 方向以速度 v 击球,赋予 50 rad/s 的上旋,然后通过二分法调整上下速度,使其落在机器人侧的 y = −0.7 m 处(m01b_fast.py). 五种情况下均能过网。

击打速度 (m/s) 至反弹(秒) 通过底线(秒)
6 0.452 0.682
8 0.338 0.496
12 0.226 0.321
16 0.170 0.238
20 0.136 0.190

Büchler 等人(2022)的气动肌肉机器人在扣球任务中报告称其击球速度平均约为 12 m/s(arXiv:2006.05935 v1). 要接住这种速度的球,预算为 0.32 秒。仅为数据集中心值的一半。

4. 按步骤划分时间

我们将 0.65 秒按步骤进行划分。重要的一点是,这些事情并非按顺序发生,而是重叠发生的。在观察球的同时,手臂已经在向准备姿势移动,并且每当有新帧输入时,预测就会被修正。

区段 花费时间 依据
观察球的时间 0.1~0.3秒 第 6 篇实测:仅观察前 0.1 秒进行预测时,击球面位置误差中位数为 7.0 cm(阻力模型);观察 0.3 秒时为 4.8 cm
单帧相机画面 8 ms (125 fps) D'Ambrosio 等人 2023 年的相机设置(arXiv:2309.03315)
系统延迟 球观测 40 ms,手臂动作 71 ms 同一论文表 I(平均值)。2024 年论文将其总结为「系统延迟约 100 ms」
我们的计算(预测 + 击球决策 + IK + 轨迹) 约 25 ms 各篇实测值的总和:11 + 14 + 0.06 + 0.007 ms
手臂到达击球姿态的时间 0.05~0.10秒 第 8 篇实测:通过 0.6 rad 且达到 10 rad/s 的五次多项式轨迹,在加速度极限 300~600 rad/s² 下为 0.062~0.082 秒
剩余裕度 其余部分 基于数据集中心值 0.65 秒约为 0.2 秒,若是 12 m/s 的球(0.32 秒)则几乎没有

从表中可以看出两点。

  1. 计算时间并非瓶颈。 即使使用教学用的 Python,也只需 25 ms。瓶颈在于需要观察足够长的时间才能使预测准确,以及相机、通信和控制器中累积的延迟。Google 的系统仅观测延迟就达到了 40 ms。
  2. 观察时间和运动时间会互相挤占。 观察时间越长,预测越好,但手臂运动的时间就越少。因此,实际系统从预测还很粗略时就开始将手臂引导至大致的准备姿势,并随着预测的不断完善而修改目标(第 8 篇的轨迹重规划)。

5. 本系列的通用模型与常量

所有篇章均使用相同的常量。对通过查阅原文确认的值与假设进行区分记录。

量 值 出处与条件
球质量与直径 2.7 g, 40 mm ITTF Statutes 2026, 2.3.1·2.3.2
球台 2.74 × 1.525 m, 高度 76 cm 同上文档 2.1.1
网高 15.25 cm 同上文档 2.2.3
球台反弹系数 e = 0.876 将 2.1.3 中的「从 30 cm 落下约为 23 cm」在无空气阻力下换算的值。第 6 篇将再次讨论
球台摩擦系数 μ = 0.25 Nakashima 等人 2010 年的滑动摩擦测量值
阻力系数 C_D = 0.47 调整为与同一项目的 MuJoCo 仿真器中测得的有效值 0.471 相匹配。文献范围 0.37~0.55(Sony AI 2026 表 I)
马格努斯系数 C_M = 0.6(每单位质量 3.4×10⁻³) 仿真器端笔记从 Tebbe 等人 2020 处搬运的值(原文未确认)。各文献差异超过 3 倍(第 6 篇)
球拍反弹系数 e_r = 0.8 介于文献值 0.788(Koç 等人 2018)与 0.81(Nakashima 等人 2010)之间

坐标系、质量、直径和球台规格与同一项目中正在制作的 MuJoCo 乒乓球仿真器相同。由于仿真器以 DeepMind 数据集笔记本的 MJCF 作为起点,因此可以直接将本文的球状态放入其中进行结果对照。

6. 局限性

7. 总结

TT 的一句话。 在球飞来的 0.6 秒内,机器人要做七件事。计算很快就能完成,但真正让人头疼的是,观察球的时间越长,留给移动手臂的时间 就越少!

参考资料

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

登录后即可点赞

评论

还没有评论。

登录后即可发表评论