TT Lab
博客

한국어 English 中文

开始
博客

博客

乒乓球机器人回球全过程:分步仿真视频中的计算解析

状态:草稿(2026-10-18),实测。画面和文中的数值均为仿真器内部的值,摄像头周期、延迟和噪声均为假设值。 录制与渲染于 2026-10-18 在家庭实验室(Home Lab)Kubernetes 的一个 Mini PC 节点上以临时 Pod 形式完成。Pod 资源上限为 CPU 6 核、内存 3 GiB(峰值使用 1.5 GiB),未使用 GPU。 环境版本为 MuJoCo 3.16.0、Python 3.11、numpy 2.3.4、Mesa 23.2.1(llvmpipe, OSMesa)、ffmpeg 4.4.2(libx264)。物理与控制部分与第 7 篇相同(时间步长 0.5 ms,控制频率 1 kHz,学习型混合策略种子 0)。 对评估用的第 201 号球进行了四种情况的测试(学习型混合策略延迟 30 ms·100 ms、传统基准线 30 ms、无学习的标称规划器 30 ms)。由于是确定性执行,各运行了一次,四个结果均与第 7 篇评估文件中同一球、同一条件的结果(结果类型及着陆点)一致。 原始数据(录制 out/rec/ball201.json、文中数值 out/facts.json、录制·渲染·绘图脚本)位于工作目录 measure/sim-tt-video/ 中。

目录

1. 直观理解:1.3 秒内发生的七项计算

第 5 篇和第 7 篇是通过 500 个球的成功率来讨论的。虽然数字很准确,但机器人接一个球的过程中, 计算了什么以及何时计算并不直观。这一次,我们从头到尾追踪一个球,将每一瞬间机器人脑海中的数值展示在屏幕上。

从公开数据的初始状态(对方底线上方、向我方飞来的球)到经过我方机器人并落在对方球场上,共计 1.307 s。这期间包含七个步骤:

  1. 观测。 摄像头拍摄球的位置,该数据点会有所延迟地到达。
  2. 预测。 根据到达的数据点拟合球的状态,并外推未来的轨迹。
  3. 击球决策。 从目标着陆点逆向推算,决定何时、何地、以何种拍面角度和多大力量击球。
  4. 逆运动学。 将该球拍姿态转换为四个关节的目标值。
  5. 轨迹与挥拍。 在当前姿态与目标姿态之间为每个关节连接五次多项式并进行跟踪。
  6. 接触。 球接触球拍,速度和旋转发生改变。
  7. 着陆。 球落在对方球场上。

机器人的配置与第 5 篇相同,为实际尺寸的龙门 2 轴(x 轴横向、z 轴纵向)+ 手腕 2 轴(偏航 yaw、俯仰 pitch),控制采用第 7 篇的学习型混合策略。该策略仅修正 6 个击球参数,其余均由下文所述的传统计算完成。

2. 视频与图表的制作方法

2.1 整体流程

공 하나를 넘기기까지: 옆에서 본 전체 과정 평가 공 201번, 120 Hz·지연 30 ms(가정), 학습한 하이브리드. 녹화 궤적(1 ms)을 5배 느리게. 가로축은 탁자 길이 방향(오른쪽이 상대), 세로축은 높이. ▶ 누르면 재생 타격면 목표 0.75 m 1 관측 2–4 예측·결정·역기구학 5 스윙(1차 계획) 5 다시 계획 6 접촉 7 착지 0.200 s 첫 결정 · 0.497 s 다시 계획 · 0.543 s 접촉 · 1.307 s 착지(오차 3.7 cm) 하늘색 점 0.2 s 에 도착한 관측, 올리브 점선 1차 예측, 보라 원 칠 위치(1차·2차), 빨간 선분 라켓 면.
图表:从击球过网到回球的全过程侧视图。点击以 5 倍慢速播放
步骤 仿真器视角 视频中的呈现内容 播放速度
1 观测 0–0.200 s 拍摄的点(灰色)与到达的点(天蓝色) 1/20
2 预测 在 0.200 s 暂停 二次式拟合、预测轨迹、估计旋转与真实旋转对比 静止
3 击球决策 在 0.200 s 暂停 击球位置、球拍目标、拍面法线、目标轨迹与落点 静止
4 逆运动学 在 0.200 s 暂停 当前姿态与目标姿态、四个关节值 静止
5 轨迹与挥拍 0.200–0.539 s 计划球拍轨迹与实际轨迹对比、关节基准与实际图表、0.497 s 时的重新规划 1/10
6 接触 0.513–0.583 s 入射速度与出射速度箭头、速率与旋转 1/10
7 着陆 0.543–1.307 s 实际轨迹与计划轨迹对比、落点误差 1/4
对比 0–0.700 s 同一球的基准线与混合策略对比、延迟 30 ms 与 100 ms 对比 1/4

视频分辨率为 1280×720,30 fps,时长 65.6 s(1,967 帧),H.264 编码,大小 2.6 MB。由于单篇文章视频时长限制在 30 s 以内,因此在各节中放置了分步骤剪辑片段(4.7–8.1 s),并在其下方附上了对应瞬间的静态图表。

2.2 录制:在不改变计算逻辑的前提下导出数据

第 7 篇的录制轨迹(rec_*.json)中仅包含 5 ms 间隔的球与球拍位置。为了展示分步计算过程,我们需要观测点、拟合的二次曲线、预测轨迹、各决策阶段的规划以及关节基准值,因此使用相同的环境和种子(每个球为 777000 + 球编号)重新运行了仿真。 环境代码保持未修改,仅在子类中进行读取。在每个 1 kHz 的控制周期复制状态,并在每个决策点复制估计值与规划结果。

class RecEnv(ttenv.TTEnv):
    def _tick(self, qr, vr, ar):
        done = super()._tick(qr, vr, ar)          # 물리·제어는 원래 코드 그대로
        d = self.d
        v, w = ball_world(self)                   # 세계 좌표 속도·각속도
        self.ticks.append([round(self.t, 6), *d.qpos[:11].tolist(), *d.qvel[6:10].tolist(),
                           *np.asarray(qr).tolist(), *v.tolist(), *w.tolist(), ...])
        return done

来源:TT Lab 实验代码 sim-tt-video/src/vid_record.py(略去接触显示列)。

录制结果(结果类型、落点)与第 7 篇评估文件中相同球、相同条件的值进行了核对,四种情况下均完全一致。这证实了相同的计算流程被再次执行。

2.3 渲染:数值来自录制,图表使用专用展示模型

物理模型的机器人除了球拍外没有其他几何形状,若直接渲染则只有球拍悬浮在空中。因此,我们单独制作了一个关节配置(qpos 顺序、位置、轴、球拍大小)相同的 专用展示模型,为其添加了导轨、滑块、手腕和手柄,并将录制的 qpos 直接输入其中,通过 MuJoCo 的离屏渲染器进行渲染。该模型不计算接触。 观测点、预测轨迹、击球点等标记作为几何体放入 MuJoCo 场景中,字幕和数字则使用 NanumGothic 字体绘制在渲染帧之上。画面中的所有数字均读取自录制文件,仅进行速率(向量大小)、角度、cm 换算等直观展示所需的计算。 1 ms 记录间隔之间的帧(在 1/20 倍速下为 1.67 ms 间隔)通过对球和关节位置进行线性插值来渲染。

3. 第 1 步:观测——捕获的点延迟到达

视频:第 1 步观测视频(1/20 倍速)
1단계 관측: 찍은 점과 로봇에 도착한 점 0.2 s 까지 찍은 24개 중 지연 30 ms 를 지나 도착한 것은 21개. 높이를 5배 늘려 그림. t = 0 t = 0.2 s 0.00 s 0.05 s 0.10 s 0.15 s 0.20 s 지연 30 ms: 아직 도착 전 도착한 관측 찍었지만 도착 전 공의 실제 경로 찍는 간격은 약 8.3 ms(1 ms 제어 주기에 맞춰 찍음), 위치 잡음 σ 3 mm. 공의 처음 속력 7.78 m/s.
图表:第 1 步观测:截至 0.2 s 拍摄的点与到达的点,延迟 30 ms

通过观测估计球状态的一般理论(如卡尔曼滤波等)可参见《乒乓球机器人手臂基础》第 6 篇“球飞行方程”。

4. 第 2 步:预测——二次曲线拟合与 RK4·弹跳模型

视频:第 2 步飞行预测视频
2단계 예측: 2차식 맞춤과 RK4·바운드 모델 0.2 s 의 예측(올리브 점선)과 실제 경로(주황). 0.497 s 에 바운드 뒤 관측으로 다시 맞춘다. 맞춘 2차식 1차 예측 2차 예측 실제 로봇의 추정참값(시뮬레이터) 0.2 s 속도 (m/s)(-1.23, -6.29, -0.39)(-1.14, -6.20, -0.74) 0.2 s 회전 ω (rad/s)(82, -16, 4)(55, 3, 15) 0.497 s 회전 ω (rad/s)(131, -25, 4)(98, -7, 15) 바운드 시각0.415 s0.429 s 바운드 (x, y) m(-0.47, -1.16)(-0.47, -1.26) 예측 바운드와 실제 바운드의 거리 10.3 cm. 회전은 가속도의 작은 차이로만 보여 크게 어긋난다.
图表:第 2 步预测:拟合的二次曲线、0.2 s 与 0.497 s 的预测轨迹、实际轨迹

计算。 对到达的点(最多最近 36 个)进行关于时间的空间位置二次曲线最小二乘拟合,从而获取最后观测时刻的位置、速度和加速度。0.2 s 时的拟合使用了 21 个观测点,加速度为 (1.56, 6.90, −13.49) m/s²。 从加速度中减去重力和空气阻力,将剩余部分视为马格努斯力 (k_M/m) ω×v 并求解 ω。由于旋转仅表现为加速度的微小差异,因此设置了一个向 0 拉扯的先验项(标准差 300 rad/s)。 以此状态,用 4 ms 步长的 RK4 推进规划器的物理模型(阻力系数 0.471、马格努斯系数、球台反弹 0.975·摩擦 0.10),若触台则通过冲量模型进行反弹。

0.2 s 时的数值 机器人估计值 真值(仿真器)
速度 (m/s) (−1.23, −6.29, −0.39) (−1.14, −6.20, −0.74)
旋转 ω (rad/s) (82, −16, 4) (55, 3, 15)
弹跳时刻 0.415 s 0.429 s
弹跳位置 (x, y) m (−0.47, −1.16) (−0.47, −1.26)

预测的弹跳比实际早 14 ms,位置超前 10.3 cm。旋转估计的偏差最大(正如第 6 篇中所见,仅凭位置很难精准观测旋转)。

弹跳后的重新拟合。 当到达点的高度达到最低点并再次回升超过 1 cm 时,机器人将其判定为弹跳。该球在 0.425 s 被判定为弹跳,随后在收到 4 个观测点后的 0.497 s 做出了第二次决策。 若观测点少于 6 个,则将加速度设为重力并仅拟合直线,旋转则直接采用将初次估计通过弹跳模型计算后的值 (131, −25, 4) rad/s(真值为 (98, −7, 15))。该计算公式位于《乒乓球机器人手臂基础》第 6 篇的“重力·阻力·马格努斯与弹跳模型”一节中。

5. 第 3 步:击球决策——从着陆点逆向推算

视频:第 3 步击球决策视频
3단계 타격 결정: 위에서 본 칠 위치·면 방향·노린 경로 0.2 s 의 1차 결정. 착지점에서 거꾸로 나가는 속도를 풀고, 면 법선과 면 속도를 정한다. 갠트리 x ±0.9 m 노리는 착지점 (0, 0.75) 칠 위치 실제 공 예측 법선(정책 보정 후) 명목 법선 노린 경로 칠 시각0.556 s (결정에서 356 ms 뒤) 칠 위치 b (m)(-0.59, -1.75, 0.32) 면 yaw / pitch-7.7° / 0.4° (명목 -12.3° / 4.7°) 면 속도(법선 방향)1.10 m/s (명목 0.48 m/s) 원하는 나가는 속도(1.02, 4.38, 2.27) m/s, 5.04 m/s 정책 출력(보정)yaw +4.7°, pitch -4.0°, 면 속도 +0.63 m/s, 시각 +7.0 ms, 중심 x -0.6 cm, z -2.7 cm
图表:第 3 步击球决策:俯视视角下的击球位置、拍面方向、目标轨迹

计算。 依次求解三个要素:

  1. 出射速度。 目标着陆点为对方球场中心 (0, 0.75) m。设定水平速率为 4.5 m/s 并确定飞行时间 T = 距离 / 4.5,随后挑选使纯重力抛物线恰好到达球台高度的 v_z。
  2. 拍面法线与拍面速度。 将出射速度与入射速度之差的方向抓取为法线 n,并结合反弹系数 e 确定法线方向的拍面速度 v_pn = v_in·n + (Δv·n)/(1+e)。通过包含摩擦力的冲量模型重新计算预期结果并进行三次修正。
  3. 击球时刻。 龙门架没有深度 (y) 轴,因此球拍能够触及的 y 坐标仅由手腕角度决定。预测轨迹穿过该 y 坐标的时刻即为击球时刻。
def _v_des(self, b):
    dx, dy = TARGET[0] - b[0], TARGET[1] - b[1]
    dist = math.hypot(dx, dy)
    vh = 4.5
    Tf = dist / vh
    vz = (T.BALL_R - b[2] + 0.5 * G * Tf * Tf) / Tf
    return np.array([dx / dist * vh, dy / dist * vh, vz])

来源:TT Lab 实验代码 rl/src/ttenv.py(与第 7 篇相同的文件)。

学习到的策略会在此标称值上加上 6 个修正(范围为:面 yaw 和 pitch 各 ±20°,面速度 ±1.5 m/s,击球时刻 ±20 ms,球拍中心 x 和 z 各 ±6 cm)。

0.2 秒时的首次决策 标称(无学习) 策略修正后
击球时刻 0.552 秒 0.556 秒(决策后 356 毫秒)
击球位置 b (m) (−0.58, −1.74, 0.32) (−0.59, −1.75, 0.32)
面 yaw / pitch −12.3° / 4.7° −7.7° / 0.4°
面速度(法线方向) 0.48 m/s 1.10 m/s
期望的出球速度 (1.03, 4.38, 2.26) m/s (1.02, 4.38, 2.27) m/s, 5.04 m/s

将策略输出转换为单位后为:yaw +4.7°、pitch −4.0°、面速度 +0.63 m/s、击球时刻 +7.0 ms、中心 x −0.6 cm、z −2.7 cm。从期望落点反推球拍速度和法线的方程位于《乒乓球机器人手臂基础》第 7 篇打击方程中。

6. 四步逆运动学:四行闭式解

视频:视频 4 步逆运动学
4단계 역기구학: 상대 쪽에서 본 갠트리와 손목 닫힌 해: 손목 두 각은 법선에서, 갠트리 두 축은 라켓 중심에서 손목 오프셋을 빼서. x 레일(±0.9 m, 오른쪽이 -x) 탁자 윗면 높이 지금(0.2 s) 목표 공(칠 위치) 관절값식 (L = 0.15 m) 갠트리 x-0.595 mc_x − L·sin(pitch)·sin(yaw) 갠트리 z+0.144 mc_z − L·cos(pitch) 손목 yaw-7.7°atan2(−n_x, n_y) 손목 pitch+0.4°asin(n_z) c = b − n·(공 반지름 + 라켓 두께/2) + 정책의 중심 보정. 네 값 모두 한계 안(잘라 낸 값 없음).
图:四步逆运动学:从对手侧看龙门架的当前姿态与目标姿态

由于龙门架采用直角坐标,逆运动学无需迭代计算即可完成。手腕的两个角度可直接从所需的法线求出,龙门架的两个轴只需用球拍中心减去手腕偏移量即可。

def ik(c, n, rb: Robot):
    n = np.asarray(n, float) / np.linalg.norm(n)
    th = math.asin(max(-1.0, min(1.0, n[2])))
    psi = math.atan2(-n[0], n[1])
    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))
    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 实验代码 sim/ttsim.py(已省略说明注释)。

关节 当前 (0.2 s) 第一目标 极限
龙门架 x 0.000 m −0.595 m ±0.9 m
龙门架 z 0.150 m 0.144 m −0.15–0.7 m
手腕 yaw 0.0° −7.7° ±80°
手腕 pitch 0.0° 0.4° ±80°

球拍中心为 c = b − n·(球半径 + 球拍厚度/2) 加上策略的中心修正值。四个值均在极限范围内,因此没有被截断的值。 y_res 是龙门架无法对齐的深度方向差值,在标称规划中为 0,而在引入策略修正的第一目标中为 −2.9 cm。关于多解、奇点以及无解等常规手臂问题,请参考《乒乓球机器人手臂基础》第 4 篇逆运动学。

7. 第五步轨迹与挥拍:在 39 ms 内重新规划路径

视频:视频 5 步轨迹生成与挥拍(1/10 倍速)
5단계 궤적과 추종: 5차 다항식 기준과 실제 관절 점선은 제어기가 받은 기준(1차 계획, 0.497 s 부터 2차 계획), 실선은 실제 관절. 갠트리 x (m) -0.58 0.00 다시 계획 손목 pitch (°) 0 30 접촉 0.2 s 0.3 s 0.4 s 0.5 s 2차 계획은 접촉까지 39 ms: x 가속도 323 m/s², z 98 m/s² 를 요구(한계 40·30). 한계에서 잘려 접촉 순간 x 가 기준과 6.6 cm 어긋났다(1차 계획 동안 x 오차 최대 0.3 cm).
图:第五步轨迹与跟踪:龙门架 x 与手腕 pitch 的五次多项式基准与实际值

计算。 每次做出决策时,都会根据当前的关节位置、速度和加速度,为每个关节连接一条五次多项式,一直延伸到打击瞬间的目标(位置 q、速度 (0, 0, 0, −v_pn/L)、加速度 0)。挥拍结束后,pitch 会在 0.12 秒内停下。1 kHz 的计算力矩控制(PD + 前馈,固有频率 50 rad/s)遵循此基准,加速度和速度会在轴极限处被截断。

五次多项式满足两端位置、速度和加速度的原理以及极限内的最短时间轨迹,可在《乒乓球机器人手臂基础》第 8 篇轨迹生成中找到,计算力矩控制可在第 9 篇控制中找到。

8. 第六步接触:1 ms 内发生的事

视频:视频 6 步接触(1/10 倍速)
6단계 접촉: 옆에서 본 라켓 면과 공 점은 공(4 ms 간격), 화살표는 속도(1 m/s 당 3 cm, 겹치지 않게 위아래로 비켜 그림). 라켓 면 상대 쪽 → 속력 회전 진행 방향 기준 들어온 공 4.51 m/s 98.9 rad/s 탑스핀 97.6 rad/s 나간 공 4.89 m/s 98.7 rad/s 백스핀 95.8 rad/s 회전 벡터는 거의 그대로(1.5 rad/s 변화)인데 공의 방향이 뒤집혀 탑스핀이 백스핀이 된다. 계획이 원한 나가는 속력 5.06 m/s, 접촉 0.543 s(계획 0.536 s), 라켓 면 중심 0.69 m/s.
图:第六步接触:侧面视角下的球拍面与球、入射速度和出射速度

视频以 1/10 倍速播放此场景。记录显示球触及球拍的时长为 1 ms 的记录格(两次物理步进)。

速率 旋转大小 基于行进方向
来球 (0.542 s) 4.51 m/s 98.9 rad/s 上旋 97.6 rad/s
出球 (0.544 s) 4.89 m/s 98.7 rad/s 下旋 95.8 rad/s

9. 第七步落点:距目标 3.7 cm

视频:视频 7 步落点(1/4 倍速)
7단계 착지: 계획한 경로와 실제 경로, 착지 오차 위: 옆에서 본 나가는 공. 아래: 위에서 본 상대 코트(목표 주변 확대). 꼭대기 0.68 m 실제(학습한 정책) 계획이 노린 경로(중력만) 명목(학습 없음) 목표 학습한 정책 3.7 cm 명목 22.1 cm y 0.35 m1.05 m 착지점 (-0.004, 0.713) m, 네트 위 여유 36.7 cm, 타격에서 착지까지 0.764 s. 실제 경로는 백스핀의 마그누스 힘과 항력 때문에 중력만 둔 계획보다 높이 떴다.
图:第七步落点:计划路径与实际路径、落点误差
值 学习型混合 标称(无学习)
落点 (x, y) m (−0.004, 0.713) (−0.007, 0.529)
距离目标 (0, 0.75) 3.7 cm 22.1 cm
最高点高度 0.68 m 0.47 m
结果 回击成功 回击成功

10. 比较:相同的球,不同的方法与不同的延迟

视频:视频比较 1:将相同的球分别交由经典基线与学习型混合策略处理(1/4 倍速)
视频:视频比较 2:相同的策略,30 ms 与 100 ms 的相机延迟(1/4 倍速)
같은 공, 세 조건: 위에서 본 로봇 쪽 평가 공 201번. 가로는 탁자 길이(오른쪽이 네트), 세로는 옆(x). 0.7 s 까지 6배 느리게. ▶ 누르면 재생 고전 기준선, 지연 30 ms 못 맞힘(가장 가까울 때 28.2 cm) 학습한 하이브리드, 지연 30 ms 반환 성공(착지 오차 3.7 cm) 학습한 하이브리드, 지연 100 ms 못 맞힘(가장 가까울 때 32.4 cm) 공 쓰인 계획의 예측 쓰인 계획의 칠 위치 라켓 면
图:相同的球,自上而下观察的三种条件对比。点击即可 6 倍慢速播放

经典基线(延迟 30 ms):未击中,最近距离时相差 28.2 cm。 基线在 0.2 s 时利用 21 个观测值通过最小二乘法一次性拟合出位置、速度和旋转,读出的旋转为 (111, 279, −27) rad/s(真实值为 (55, 3, 15))。基于该预测,击球位置被设为 x −0.83 m,而当时实际球位于 x −0.54 m。 基线仅从预测弹地后 80 ms 到击球时刻前 80 ms 之间重新规划。由于预测弹地时间为 0.440 s,击球时刻为 0.545 s,该时间窗为空,因此规划仅有 0.2 s 时的一个。而混合策略则从观测中寻找弹地,并在收集到 4 个观测值后立即重新规划进行修正。

学习型混合(延迟 100 ms):未击中,最近距离时相差 32.4 cm。 这是相同的策略、相同的球。由于在 0.2 s 时仅到达了 13 个观测值(30 ms 延迟时为 21 个),读出的旋转为 (67, −5, 87) rad/s,且绕纵轴 (z) 的侧旋成分较大,因此击球位置被设为 x −0.19 m(当时实际球位置 x −0.55 m)。 弹地后的 4 个观测值直到 0.567 s 才到达,此时该规划算出的击球时刻 0.545 s 已经过去,因而无法使用。在 100 ms 延迟下,基于 500 个样本,本策略的回击成功率为 58.2%,基线为 26.6%(第 7 篇)。

11. 制作过程中遇到的问题

12. 局限性与未测量项

13. 转到下一篇

接下来是将低球和扩展工作空间的深度轴加入机器人模型中,并再次运行相同的评估(第 7 篇中预告)。我们将直接使用当前的录制与渲染工具,通过相同的七个步骤来展示当出现深度轴时,“击球时刻”的定义会发生怎样的变化。

TT 的一言。 过去只能通过成功率表格看到的机器人,跟着一个球看下来,发现在最后 39 ms 重新规划路径、即使被要求达到极限 8 倍的性能也能把球打进球拍的场景。一个数字背后竟然隐藏着如此惊心动魄的瞬间!

参考

外部链接与第 7 篇的地址相同(已确认在第 7 篇中于 2026-10-18 开放)。

登录后即可点赞

评论

还没有评论。

登录后即可发表评论