SuperMimic部署从世界模型原理到动作训练实践
0.简介
SuperMimic 面向人形机器人的全身动作跟踪:同一具身体要根据参考动作完成行走、跳跃和起身,还要在接触地面的过程中保持平衡。动作数据描述了身体应该怎样运动,控制器却必须自己学会怎样驱动关节。SuperMimic 把这些技能共享的动力学学成一个可微世界模型,让策略通过短程预测的回报梯度改进动作,并交替回到物理仿真中采集数据。论文在 LAFAN1 对照实验中达到 0.82 归一化回报,理解这项结果,需要看清动力学预测怎样参与控制学习,以及改善如何在实际动作中体现。下文以 SuperMimic 论文 v1 为方法依据,结合 zita-ch/supermimic_vibed 的实现讨论训练与使用。目前相关内容已经在官网中可以直接安装使用了supermimic自动生成项目中了。

1. 原理
1.1 从参考动作到闭环控制
想象机器人准备从下蹲转入起跳。参考动作给出了膝盖弯曲多少、躯干朝向哪里,却没有直接给出电机应该施加多大力矩。动画可以逐帧摆出姿态,机器人则要通过支撑脚获得地面反力,再协调髋、膝、踝和上肢完成动作。人体与机器人之间还存在比例、电机能力和碰撞几何的差异,重定向后的目标未必处处容易实现。因此,动作跟踪是一项持续修正偏差的闭环控制任务:落脚位置稍有变化,下一步控制就必须跟着调整。
行走、舞蹈和起身看起来差别很大,却使用同一套关节、质量分布和电机驱动。SuperMimic 抓住的正是这层共同结构:如果能够从已经发生的状态转移中学到“这个动作会让身体怎样变化”,后续策略更新就可以借助这份动力学知识。核心问题在于,这个模型既要预测得足够准确,也要提供有用的梯度;否则策略只会学会利用预测误差。于是,方法自然分成了两个相互依赖的过程:持续学习身体的运动规律,同时利用这些规律改进控制。
直觉理解:学骑车时,转弯、刹车和绕障碍依赖的是同一辆车。掌握车把、速度与车身倾斜之间的关系,可以帮助多种动作练习;这份经验仍要不断接受真实骑行的检验,侧滑和刹车距离一旦估错,练习方向也会跟着出错。
1.2 采集、预测与策略更新
论文 Figure 2 把训练组织成三个交替发生的阶段。当前策略先在刚体仿真器里执行带噪动作,将状态、动作、下一状态和环境参数写入经验回放池(Replay Buffer);世界模型从中抽取连续窗口,拟合身体的多步变化;策略随后从真实采集的状态出发,在模型中展开短程预测,通过预测回报更新自身。这里的关键是,策略变好以后会采集到新的状态,模型也要继续学习这些状态,整个过程因此是一个持续更新的循环。下图用短标签连接这些环节,虚线表示更新后的策略重新参与采集。

1.3 训练信息与执行信息各有分工
世界模型可以读取完整仿真状态,以及摩擦、关节标定偏移和躯干质心偏移。这些信息帮助它解释相同动作在不同条件下的后果。执行策略的输入则更接近机器人真正能够获得的内容:带噪本体观测历史和接下来要跟踪的参考动作,输出为 29 维关节控制量。世界模型主要参与训练中的梯度计算,执行策略时只需根据观测与目标做一次前向推理。这一区别决定了哪些信息可以进入训练模型,哪些信息必须由执行端实际提供。
阅读代码时,最容易混淆的是状态与观测。完整状态用来描述仿真中的身体,策略观测用来描述控制器能看到什么,参考目标则说明希望身体接下来怎样运动。仓库存储状态与世界模型特征恰好都是 71 维,但后者去掉了平面绝对位置,并重新表达旋转,两者的物理含义并不相同。单帧策略观测是 99 维,10 帧历史组成 990 维输入;未来 10 个参考帧各有 73 维,共 730 维目标。先分清这些量,才能理解后面代码里的坐标变换与信息拼接。
| 接口 | 维度 | 在训练或执行中的作用 |
|---|---|---|
| 存储状态 | 71 | 根位置、姿态、速度与 29 个关节的状态 |
| 不变状态特征 | 71 | 去除平移、航向冗余后的模型输入 |
| 环境上下文 | 33 | 摩擦、关节偏移与躯干质心偏移 |
| 单帧策略观测 | 99 | 本体反馈与参考相对根姿态 |
| 参考目标 | 730 | 未来 10 帧的动作要求 |
| 策略动作 | 29 | 缩放前的关节目标偏移 |
1.4 用局部增量表达身体运动
机器人在场地左侧和右侧做同一个动作,身体动力学通常相同;面向东和面向西,也不需要重新学习整套关节关系。仓库因此先构造不变特征:保留根高度,去掉平面绝对位置和全局航向,把速度转到合适的局部坐标系,再结合关节状态、动作与环境上下文预测增量。换句话说,网络要把容量用在身体如何响应控制上。这个表示依赖当前平地跟踪任务的结构,遇到地形和物体交互时,还需要重新考虑哪些环境信息应该进入模型。
下面把一步预测写成两个操作。 s t s_t st 表示身体状态, a t a_t at 表示控制动作, ξ \xi ξ 表示环境参数, ϕ \phi ϕ 负责提取不变特征;参数为 ω \omega ω 的网络输出局部增量,再由 I \mathcal I I 按位置、旋转和关节各自的规则积分。这样的拆分把一部分几何关系交给了显式计算,网络主要学习剩余的动力学变化。这里的“可微”描述的是计算能够传递导数,预测是否可靠仍要通过真实状态转移检验。
Δ s ^ t = F ω ( ϕ ( s t ) , a t , ξ ) , s ^ t + 1 = I ( s t , Δ s ^ t ) . \Delta\hat s_t=F_\omega\!\left(\phi(s_t),a_t,\xi\right),\qquad \hat s_{t+1}=\mathcal I\!\left(s_t,\Delta\hat s_t\right). Δs^t=Fω(ϕ(st),at,ξ),s^t+1=I(st,Δs^t).
WorldModel.step 展示了这个设计最具体的一面。网络由三层宽度为 2048 的隐藏层构成,输入经过运行统计归一化,输出恢复成物理尺度后拆为位置、旋转、速度与关节增量。位置变化沿航向转回世界系,旋转通过指数映射更新,根速度的增量则按照根坐标系转换。代码中的几次矩阵乘法看起来相似,实际分别对应不同坐标约定;它们共同保证预测结果能够接回下一步动力学计算。
# supermimic/networks.py · WorldModel.step
def step(self, S, a, xi_n):
p, R, v, w, q, qd = S
y = run_mlp(self.net, self.in_norm(self.inputs(S, a, xi_n)))
d = y * self.out_norm.std() + self.out_norm.mean
H = yaw_mat(R)
dp, dth, dv, dw, dq, dqd = d.split((3, 3, 3, 3, NUM_J, NUM_J), -1)
p1 = p + (H @ dp.unsqueeze(-1)).squeeze(-1)
R1 = R @ so3_exp(dth)
v1 = v + (R @ dv.unsqueeze(-1)).squeeze(-1)
w1 = w + (R @ dw.unsqueeze(-1)).squeeze(-1)
return (p1, R1, v1, w1, q + dq, qd + dqd)
这里的关键是,旋转被当作有几何结构的量处理,而关节角和速度使用各自的增量更新。数值精度也沿着这一分工安排:仓库允许 MLP 矩阵运算使用 BF16,输出随后转回 FP32,状态积分、前向运动学与奖励计算继续保持 FP32。论文采用的是 TF32,因此复现记录应保留这项差异。若预测开始失真,先核对坐标、归一化尺度和仿真转移,再考虑调整学习率,排查顺序会更清楚。
1.5 连续窗口怎样训练世界模型
策略会把模型上一步的预测继续作为下一步输入,因此单步误差很小仍可能在连续展开后偏离。仓库从回放池抽取 8 步连续窗口,只用真实状态作为起点,后续沿模型自己的预测前进,并与真实轨迹比较。损失按各状态分量的运行标准差缩放,防止高速量压过其他分量。下式中, B B B 是批量, k = 8 k=8 k=8 是窗口长度, D D D 是误差维度, m b , j m_{b,j} mb,j 用来屏蔽回合结束后的无效位置, σ ˉ i \bar\sigma_i σˉi 包含标准差下限。
L W M = 1 B ∑ b = 1 B ∑ j = 1 k m b , j 1 D ∑ i = 1 D ( e i ( s ^ b , j , s b , j ) σ ˉ i ) 2 . \mathcal L_{\mathrm{WM}} =\frac1B\sum_{b=1}^{B}\sum_{j=1}^{k}m_{b,j} \frac1D\sum_{i=1}^{D} \left(\frac{e_i(\hat s_{b,j},s_{b,j})}{\bar\sigma_i}\right)^2. LWM=B1b=1∑Bj=1∑kmb,jD1i=1∑D(σˉiei(s^b,j,sb,j))2.
# supermimic/train.py · _wm_err
def _wm_err(S_hat, s1, mask):
std = torch.maximum(wm.out_norm.std(), ERR_FLOOR)
e = (wm.state_error(S_hat, unflatten_state(s1)) / std) ** 2
e = e.mean(-1)
return (e * mask).sum() / s1.shape[0], e[:, -1]
掩码处理关系到模型到底在学习什么。一次跌倒以后,环境会重置到另一段动作的某个状态;若把重置前后的数据拼成自然运动,模型就被要求解释身体瞬间“跳转”的过程。终止那一步的转移仍可用于学习,之后的窗口位置则应屏蔽。进一步看,本仓库使用解析奖励、解析观测和软终止函数,世界模型主要拟合动力学;论文中允许学习的其他预测头,并没有全部变成这里的监督损失。
难点提示:连续预测像往后算几步棋,每一步都要接着自己刚算出的局面往下推。回合掩码则像给录像分段:一位演员退场后,下一位演员突然出场,不能被解释成同一个人的自然位移。
1.6 参考目标与观测历史怎样生成动作
仅看当前的下蹲姿态,控制器很难判断接下来是起跳、落地缓冲,还是继续蹲下。仓库把未来 10 个参考帧交给动作编码器,在 50 Hz 控制频率下覆盖约 0.2 秒,并压缩成 32 维潜变量。解码器再结合过去 10 帧本体观测,生成下一步控制。目标序列告诉它希望怎样运动,观测历史反映身体实际上怎样运动;两类信息在策略中汇合,控制才有机会同时满足动作意图和实时平衡要求。
# supermimic/networks.py · Policy.forward
def forward(self, obs_hist: torch.Tensor, goal: torch.Tensor) -> torch.Tensor:
"""obs_hist: (B, hist, obs_dim) noisy observations, newest last."""
z = torch.tanh(run_mlp(self.enc, self.goal_norm(goal)))
o = self.obs_norm(obs_hist).flatten(-2)
return run_mlp(self.dec, torch.cat((z, o), -1))
这几行代码也划定了当前接口的范围:编码器接收完整参考动作,解码器依赖本体反馈。论文还研究了速度命令编码器,但当前仓库没有实现对应实验。进一步看,想扩展速度或其他控制接口,除了改变输入维度,还要准备相应任务、奖励和训练数据。共享解码器提供了连接不同意图的结构,新的意图能否产生正确行为,仍取决于它是否在训练中获得了足够明确的控制信号。
1.7 从网络输出到关节控制
策略产生的 29 维动作先被解释为关节目标偏移,再与默认姿态、随机标定偏移相加,交给低增益 PD 驱动。下式中, q 0 q^0 q0 是默认关节姿态, Δ q 0 \Delta q^0 Δq0 是标定偏移, α \alpha α 是逐关节动作尺度, K p K_p Kp 与 K d K_d Kd 是驱动增益。这意味着网络输出与电机力矩之间还隔着一个明确的控制接口:同样的数值变化,对不同关节会产生不同尺度的目标调整,身体的响应还受到力矩上限和关节约束影响。
q t s p = q 0 + Δ q 0 + α ⊙ a t , τ t ≈ K p ( q t s p − q t ) − K d q ˙ t . q_t^{\mathrm{sp}}=q^0+\Delta q^0+\alpha\odot a_t,\qquad \tau_t\approx K_p(q_t^{\mathrm{sp}}-q_t)-K_d\dot q_t. qtsp=q0+Δq0+α⊙at,τt≈Kp(qtsp−qt)−Kdq˙t.
从这层接口回看世界模型,它要预测的是动作经过驱动、接触和惯性共同作用后的状态变化。参考姿态、策略输出与实际关节运动因此是三个不同的量。调试时若看到机器人没有跟上目标,需要沿着这条链检查动作尺度、默认姿态、驱动能力和模型预测,而不能只观察网络输出是否平滑。这里的公式用于说明 PD 控制关系,实际仿真中的执行器限制仍以机器人配置为准。
1.8 把预测回报传回策略
有了能够预测下一状态的模型,就可以考察一串控制动作会把身体带到哪里。策略更新从真实采集的状态出发,在固定世界模型中展开 32 步预测,对应约 0.64 秒;预测奖励按折扣因子累加,接近终止时用连续的软生存权重降低后续收益,窗口末端再接上价值估计。这里要分清“固定模型参数”和“停止梯度”:前者只是在这一步不更新世界模型,动作对状态变化的导数仍要穿过模型传给策略。
J ^ ( θ ) = E [ ∑ t = 0 H − 1 γ t c ^ t r ^ t + 1 + γ H c ^ H V ψ ( s ^ H , g H , ξ ) ] , c ^ 0 = 1 , c ^ t + 1 = c ^ t ( 1 − d ^ t + 1 ) . \hat J(\theta)=\mathbb E\!\left[ \sum_{t=0}^{H-1}\gamma^t\hat c_t\hat r_{t+1} +\gamma^H\hat c_H V_\psi(\hat s_H,g_H,\xi)\right], \qquad \hat c_0=1,\quad \hat c_{t+1}=\hat c_t(1-\hat d_{t+1}). J^(θ)=E[t=0∑H−1γtc^tr^t+1+γHc^HVψ(s^H,gH,ξ)],c^0=1,c^t+1=c^t(1−d^t+1).
式中,
θ
\theta
θ 是策略参数,
ψ
\psi
ψ 是价值网络参数,
H
=
32
H=32
H=32 是预测时域,
d
^
\hat d
d^ 表示软终止风险。下面的代码将这些量装配成优化目标:alive 是逐步累乘的生存权重,c_t 与奖励发生前的状态对齐,末端 Critic 负责补上窗口以后的价值。最后取负号,把回报最大化变成优化器所需的损失最小化。理解这段计算,比单看训练日志中策略损失的大小更有帮助。
# supermimic/train.py · policy_update,目标装配摘录
alive = torch.cumprod(1 - d, 0)
c_t = torch.cat((torch.ones(1, B, device=dev), alive[:-1]), 0)
disc = args.gamma ** torch.arange(HZ, device=dev, dtype=torch.float32).unsqueeze(-1)
J = (disc * c_t * r).sum(0)
c = alive[-1]
r_sum = (c_t * r).detach().sum(0)
rews, dones = r.detach(), d.detach()
if not args.no_critic:
J = J + (args.gamma**HZ) * c * critic(_critic_input(S, f, xi_n, g))
loss = -J.mean()
这条更新路径使用时间反向传播(BPTT),直接计算当前动作对后续状态和回报的影响。不过,梯度来自学习到的动力学,模型误差也会进入更新方向。若想象回报快速提高,真实仿真表现却没有改善,就要怀疑策略是否找到了模型漏洞。世界模型误差、想象收益和完整动作评分因此需要一起观察;其中任何一项单独上升,都不足以说明控制能力已经稳定提高。
难点提示:世界模型像训练用的飞行模拟器。模拟器若把危险姿态算成稳定,练习者就可能在里面得高分,实际飞行却失败。反复回到物理仿真采集数据,相当于检查训练设备是否把控制策略教偏。
1.9 用 Critic 补充远期价值
32 步预测看不到完整动作,一次起跳后的落地和恢复平衡也可能发生在窗口之外。**价值网络(Critic)**负责估计这些更远的后果,用末端价值补充短期回报,并根据想象轨迹上的递归回报训练。下式中, λ \lambda λ 调节一步价值估计与更长回报的混合,末端以 R ^ H = V H \hat R_H=V_H R^H=VH 初始化。仓库默认 λ = 0.95 \lambda=0.95 λ=0.95,价值目标生成后固定,再做多轮拟合,使短程策略优化能够使用较长时间尺度的信息。
R ^ t = r ^ t + 1 + γ ( 1 − d ^ t + 1 ) [ ( 1 − λ ) V t + 1 + λ R ^ t + 1 ] , L V = E ∑ t = 0 H − 1 ( V ψ ( s ^ t , g t , ξ ) − R ^ t ) 2 . \hat R_t=\hat r_{t+1}+\gamma(1-\hat d_{t+1}) \left[(1-\lambda)V_{t+1}+\lambda\hat R_{t+1}\right], \qquad \mathcal L_V=\mathbb E\sum_{t=0}^{H-1}(V_\psi(\hat s_t,g_t,\xi)-\hat R_t)^2. R^t=r^t+1+γ(1−d^t+1)[(1−λ)Vt+1+λR^t+1],LV=Et=0∑H−1(Vψ(s^t,gt,ξ)−R^t)2.
论文的时域消融说明了这种折中:在所测设置中,带 Critic 的 16 步时域可以接近无 Critic 的 32 步表现,而 8 步设置均未达到目标回报。把预测拉到 128 步也没有继续受益,耗时更高,最终回报反而更低。这里值得关注的是,预测窗口越长,计算成本和误差累积都会增加;Critic 的作用是补充远期判断,让策略不必在每次更新时把整个动作都详细预测一遍。

直觉理解:下坡转弯前松油门,收益可能在几个弯之后才显现。Critic 像对后续路况的经验判断,虽然没有把整条路都重新模拟,却能提醒当前动作会给接下来的控制留下什么处境。
1.10 奖励与采样如何安排练习
仓库的奖励衡量 14 个跟踪刚体的位置、姿态、线速度与角速度,以及根位置和根姿态,并惩罚动作变化与关节越界。物理仿真中的失败条件包括根高度误差超过 0.25 米,或倾斜误差超过 0.8;后一个数值来自重力方向竖直分量的差,单位不能读成弧度。想象训练用平滑函数表达接近失败的风险,让策略在真正越过阈值之前就能获得调整方向,而非一直等到动作彻底失稳才接受反馈。
练习起点也经过安排:动作时间线被切成 1 秒分箱,低回报区域得到更多采样机会,同时保留均匀采样与历史困难权重。下式中, G b G_b Gb 是分箱回报, G max G_{\max} Gmax 是折扣回报上限, B b i n B_{\mathrm{bin}} Bbin 是分箱总数, w ˉ b \bar w_b wˉb 保存历史权重。直观理解是,控制器会更多练习落地、起身等容易失败的部分,但仍然接触整个动作库。这种课程也为后面训练指标与完整评估之间的差异埋下了原因。
w b = softmax b ( − 25 G b G max ) , p b = 0.5 B b i n + 0.4 w b + 0.1 w ˉ b ∑ j w ˉ j . w_b=\operatorname{softmax}_b\!\left(-25\frac{G_b}{G_{\max}}\right),\qquad p_b=\frac{0.5}{B_{\mathrm{bin}}}+0.4w_b+ 0.1\frac{\bar w_b}{\sum_j\bar w_j}. wb=softmaxb(−25GmaxGb),pb=Bbin0.5+0.4wb+0.1∑jwˉjwˉb.
1.11 与相关工作的联系
把 SuperMimic 放回相关工作,更容易看清它改变了哪一部分。DeepMimic 用参考动作和物理强化学习训练复杂技能;BeyondMimic 将高质量机器人跟踪与引导扩散结合,服务航点、遥操作等下游任务;SONIC 通过扩展数据、模型与计算建立通用控制接口。SuperMimic 集中研究共享动力学如何帮助策略学习,动作数据、驱动约束与任务接口仍然决定控制器能做什么。
| 工作 | 主要机制 | 与本文的连接 | 阅读时应保留的任务条件 |
|---|---|---|---|
| DeepMimic | 参考动作与物理强化学习 | 动作模仿控制范式 | 动画角色与实体机器人条件不同 |
| BeyondMimic | 高质量跟踪与引导扩散 | 跟踪设定、奖励及执行器参考 | 本仓库未实现完整扩散接口 |
| SONIC | 规模化跟踪与共享控制表示 | 论文大规模实验的已发布基线 | 数据、硬件和训练预算不同 |
| DreamerV3 | 世界模型与想象中的策略学习 | 通过预测改进行为的共同思路 | 潜在模型与显式身体状态不同 |
| SuperMimic | 在线动力学拟合与模型内 BPTT | 直接利用身体动力学梯度 | 本次运行覆盖 LAFAN1 仿真跟踪 |
DreamerV3 提供了另一个理解角度:两者都通过模型中的预测改进行为,但 SuperMimic 拥有结构清楚的仿真状态、已知随机化参数、解析奖励和运动学。这减轻了从图像识别世界的负担,也使状态增量和几何积分能够直接进入可微计算。换句话说,本文的世界模型是一份面向身体控制的动力学代理;理解它的价值,应从预测怎样影响控制更新出发,而非从视频生成或语言能力推断其用途。
2. 安装
2.1 启用已有 Conda 与项目环境
本次安装位于 /workspace/supermimic-deploy,实际使用服务器已有的 Conda 环境 py312,其路径为 /usr/local/miniconda3/envs/py312。在这套 Python 3.12.11 的基础上,项目通过 .venv 加载仿真与训练依赖,并继承基础环境中的 PyTorch 2.13.0+cu132。两层环境已安装完成,下面直接加载统一入口并进入源码目录;重新登录后也执行相同命令,整个过程只切换当前终端的运行环境。
source /workspace/supermimic-deploy/activate.sh
cd /workspace/supermimic-deploy/supermimic
python -c 'import sys, torch; print(sys.executable); print(torch.__version__)'

检查命令应输出 /workspace/supermimic-deploy/.venv/bin/python 和 2.13.0+cu132。激活脚本内部先初始化 Conda 并激活 py312,再加载项目 .venv,同时设置 ISAACLAB_PATH、PYTHONPATH 和 EGL 渲染配置。实际环境中的 Warp 为 1.17.0,MuJoCo 与 MuJoCo-Warp 均为 3.15.0;训练、评估和渲染都使用这一入口,以保证解释器与依赖来源一致。只激活 py312 时,项目层的仿真依赖尚未加入当前终端。
/usr/local/miniconda3/envs/py312 Python 与基础 PyTorch
/workspace/supermimic-deploy/.venv 项目仿真与训练依赖
/workspace/supermimic-deploy/activate.sh 统一激活入口
/workspace/supermimic-deploy/supermimic 项目源码与训练记录
动作使用 G1 重定向的 LAFAN1 数据,共 40 个 CSV,重采样为 50 Hz 后约有 44.1 万帧、2.45 小时。机器人资产按 URDF → MJCF → USD 转换,分别供运动学、MuJoCo 和 Isaac Lab 使用。安装脚本还会检查动作边界、状态往返和前向运动学,本次所测 FK 位置误差约为 6.50 × 10 − 7 6.50\times10^{-7} 6.50×10−7 米。这些检查先把关节顺序、坐标和资产接口对齐,后续网络才有明确且一致的学习对象。
2.2 设置训练预算并启动长训
这次复现最初用 120 次迭代打通训练、评估和渲染,模型在 40 段动作中全部失败。那次运行同时缩小了并行环境、世界模型批量和更新强度,还把预测时域改成 8 步;训练器计时仅约 47.7 秒。它能帮助检查程序是否连通,却给不了模型足够的数据和优化机会。结合前面的时域消融来看,后续应先恢复正式配置,再延长训练,单纯让这组小配置多跑几百轮,很难判断究竟验证了哪一项方法设计。
| 参数 | 原短训 | 正式配置 | 对学习过程的影响 |
|---|---|---|---|
| 并行环境 | 256 | 4096 | 增加真实转移的覆盖 |
| 世界模型批量 / 每轮批次 | 128 / 2 | 2048 / 10 | 增强动力学拟合 |
| 策略批量 | 128 | 4096 | 增加想象轨迹数量 |
| 预测时域 | 8 | 32 | 为动作后果保留计算窗口 |
| 世界模型预热迭代 | 10 | 500 | 策略更新前先建立模型 |
| Critic 训练轮数 | 2 | 5 | 加强价值拟合 |
| 总迭代预算 | 120 | 32000 | 留出持续改进和模型选择的空间 |
世界模型刚开始训练时,预测和梯度都缺少依据,因此正式配置先用 500 次迭代拟合动力学,再开始策略更新。这是仓库采用的额外预热安排。与此同时,采集数据必须有效:本次扩大到 4096 个环境后,曾出现非有限状态进入课程统计的问题,后来在 Torch 与 Warp 之间共享执行流,并在重置、动作写入和物理步进边界加入同步与有限值检查。详细排查留在配套记录中,正文需要保留的经验是:模型质量首先取决于它学到的转移是否真实、完整。
本次正式训练的运行名为 lafan1_long_sync_20261029,总预算设为 32000 次迭代,每 2000 次保存检查点,启动脚本位于安装目录的 run_native_training.sh。训练已在 supermimic_quality 会话中运行,下面的命令用于读取日志和接入现有会话。终端断开后可重新接入;在会话内按 Ctrl+B 再按 D 可以退出查看并保留训练。模型质量仍以各检查点的完整动作评估为准,预算本身不代表训练已完成。
source /workspace/supermimic-deploy/activate.sh
tail -n 10 /workspace/supermimic-deploy/logs/long-sync-20261029.log
tmux attach -t supermimic_quality

2.3 从检查点继续训练
检查点保存了模型,并不代表下一次启动时所有训练条件都已经齐备。仓库的 last.pt 包含网络、Critic 和优化器,适合继续训练;轻量 ckpt_*.pt 主要用于评估。回放池则没有写进检查点,重启后为空,直接抽取 8 步窗口会失败。本次恢复补丁因此先重新采集至少一个窗口长度的数据,正式配置下预采集 64 步,再进入模型和策略更新。恢复权重与补充经验是两件连续的事,这也解释了为什么加载成功以后仍不能立即开始优化。

只有原训练已经退出且尚未达到目标时,才需要使用下面的恢复入口。检查点路径对应本次运行目录中的 last.pt,恢复运行另存为 lafan1_resume_next,以保留原实验。总迭代目标仍是 32000;例如已保存到 10000 次,就继续执行剩余部分。经验池和课程统计会重新建立,随机数与仿真状态也没有完整保存,因此这种恢复适合继续学习,不能当作与原进程逐步完全一致的重放。
# 原训练已退出且尚未完成时执行
source /workspace/supermimic-deploy/activate.sh
export SUPERMIMIC_RESUME="$SUPERMIMIC_DEPLOY_ROOT/supermimic/logs/lafan1_long_sync_20261029/last.pt"
export SUPERMIMIC_ITERATIONS=32000
bash "$SUPERMIMIC_DEPLOY_ROOT/run_native_training.sh" lafan1_resume_next
2.4 评估模型并生成视频
训练脚本正常结束后会评估本次保存的模型,也可以用下面的入口单独评分。选好检查点后,再把策略的完整执行记录成 NPZ,交给 MuJoCo EGL 渲染;这样得到的画面才对应仿真中的控制行为。示例使用已经生成的第 2000 次模型,运行目录和模型名应按自己的结果修改。评分与录制分别保存原始记录,便于检查片段是否提前终止,以及同一权重重复执行时是否出现波动。
source /workspace/supermimic-deploy/activate.sh
cd "$SUPERMIMIC_DEPLOY_ROOT/supermimic"
RUN_DIR=logs/lafan1_long_sync_20261029
python supermimic/evaluate.py --run_dir "$RUN_DIR"
mkdir -p results/quality
python supermimic/evaluate.py --run_dir "$RUN_DIR" \
--ckpt "$RUN_DIR/ckpt_002000.pt" --record results/quality/traj.npz
MUJOCO_GL=egl python tools/render.py \
results/quality/traj.npz results/quality/quality.mp4 \
--clips walk1_subject1 dance1_subject1 jumps1_subject1 --seconds 10
3. 效果
3.1 完整动作怎样评分
训练日志里的回报反映当前采样分布,课程会反复练习困难时间段,回合也可能从动作中间开始。完整评估则为每段动作创建一个环境,从首帧连续执行,关闭观测与动作噪声、关闭域随机化,并把摩擦固定为 1;触发训练终止条件记为失败,正常到达片段末尾记为完成。两者观察的是不同过程。因此,看到训练回报升高以后,还要检查控制器能否把整段动作连起来,尤其是起跳、接触转换和起身这些会积累误差的位置。
评分把实际获得的奖励除以完整参考长度对应的理论最高奖励。下式中, T i T_i Ti 是第 i i i 段参考的帧数, r max = 0.1 r_{\max}=0.1 rmax=0.1 是每步奖励上限,存活指示量在提前终止后归零。分母保持完整动作长度,可以避免“只走了几步就跌倒”的策略因为短期姿态尚可而拿到高分。逐片段回报随后等权平均,形成正文使用的总分;奖励含负惩罚项,所以低分也可能小于零。
R ˉ i = ∑ t = 0 T i − 2 1 a l i v e ( t ) r i , t + 1 ( T i − 1 ) r max , r max = 0.1 , R ˉ c l i p = 1 40 ∑ i = 1 40 R ˉ i . \bar R_i=\frac{\sum_{t=0}^{T_i-2}\mathbf 1_{\mathrm{alive}}(t)\,r_{i,t+1}} {(T_i-1)\,r_{\max}},\qquad r_{\max}=0.1,\qquad \bar R_{\mathrm{clip}}=\frac1{40}\sum_{i=1}^{40}\bar R_i. Rˉi=(Ti−1)rmax∑t=0Ti−21alive(t)ri,t+1,rmax=0.1,Rˉclip=401i=1∑40Rˉi.
仓库还记录按参考帧数加权的回报,让长片段获得更大权重;本文表格使用的是逐片段等权平均。失败数则补充另一面信息:一个不跌倒却动作僵硬的控制器,可能完成全部片段但跟踪精度一般;另一个控制器也可能大多数动作很准,却一直无法完成起身。这里要厘清的是,回报、失败数和逐片段表现需要一起阅读,选模型时才知道自己改善的是姿态精度、动作覆盖,还是仅仅某一类容易片段。
3.2 论文对照实验给出的依据
论文的 LAFAN1 对照实验中,SuperMimic 的完整动作回报达到 0.82,PPO-Sim 的不同设置末端回报约在 0.60—0.72 之间。两者共享动作、观测、奖励、终止、随机化、网络规模与评估协议,因此结果支持了利用动力学梯度改进动作学习的思路。前面的时域消融进一步说明,短程预测和价值估计需要配合使用,单纯拉长想象窗口没有持续提高最终质量。这里的关键是,预测模型提供的更新方向能否在实际执行中保留下来。
回到本次复现,论文结果用于参照方法,实际质量仍由自己的评分和视频说明。当前实现采用额外观测、BF16 矩阵运算等安排,自碰撞配置也存在差异;它们都会影响控制过程。因此,更实用的比较是保存完整设置、检查点迭代数和逐片段分数,先确认任务与评估一致,再分析动作覆盖和姿态误差的变化。复现中的某次顺利执行,可以证明这组条件下的行为,却还不能代替重复实验。
3.3 训练曲线反映的学习过程
下面两张曲线来自已保存的第 550—2900 次训练日志,横轴统一使用迭代数。左图比较想象中的单步奖励与仿真采集的单步奖励,右图显示连续预测到第 8 步时的误差;曲线直接连接日志点,没有补出未记录的训练阶段。预测奖励与仿真奖励总体接近,有助于检查优化方向是否偏离实际采集。但这两项仍受训练采样分布影响,训练奖励上升以后,还要回到完整动作评分确认效果。

进一步看,奖励和模型误差也不必在每一轮同步变化。策略进入新状态后,动力学拟合会遇到新的转移,短期波动需要结合采样和失败位置解释。若想象收益快速增加、仿真表现却停滞,应优先检查预测误差;若两者都改善而完整片段仍失败,则要看动作衔接与长时序偏差。这里用曲线帮助定位学习环节,后面的分类评分和视频再回答控制器已经能完成哪些动作。
3.4 本次复现的动作覆盖
第 2000 次检查点已经能完成一部分行走和跑动,距离稳定覆盖动作库还有差距。首次完整评分的平均归一化回报为 0.329291,失败 18/40;录制轨迹时,同一权重再次执行得到 0.539334,失败 12/40。两次分别完成 22 段和 28 段动作,均比旧短训有进展,但差异也足以影响模型比较。视频对应后一次执行,因此这里同时保留两份结果,避免只靠观感较好的片段判断训练质量。
| 本次测量 | 逐片段平均回报 | 按参考帧数加权回报 | 失败动作 |
|---|---|---|---|
| 120 次旧短训 | 0.00113966 | — | 40/40 |
| 2000 次首次评分 | 0.329291 | 0.339721 | 18/40 |
| 同一模型录制复评 | 0.539334 | 0.567168 | 12/40 |
两次执行中,6 段跌倒起身都失败,说明最薄弱的技能仍集中在身体与地面接触复杂的阶段。评分波动的具体原因尚未通过控制变量实验确认,初始化、接触数值和同步路径需要继续核查。下图按动作类别汇总首次完整评分,将分类平均回报与完成片段数并列,灰色底条表示该类别总片段数。32000 次是仍在执行的总预算,终期会比较已保存检查点,并用独立录制复评检验选中模型。
3.5 从实际视频观察动作
实心机器人是第 2000 次检查点的执行状态,蓝色半透明机器人是参考轨迹。下图取第 8、25、38 秒,最后一帧保留了起身失败的终止标记。录制时完整复评的回报为 0.539334、失败 12/40,与首次评分存在差异,前面的结果保留了两份测量;观看视频时也应同时观察脚部接触、躯干偏差和失败位置。

工程价值:视频像一段车辆路测,平稳直行与困难路段都值得保留。同样的参考动作、展示时长和失败标记,才能帮助判断控制质量变化;完整评分则补充了短视频看不到的长时序表现。
3.6 动作泛化与实机应用的边界
论文附录 F 说明,大规模评估动作属于两种方法各自的训练动作集,零失败衡量的是已训练动作的覆盖能力。本次 40 段 LAFAN1 评估也采用这一理解。若要研究未见动作,应按动作家族、主体或运动特征划分独立测试集,防止相近片段随机分散后形成过于容易的测试。起身、跳跃和走路之间的差距也提醒我们:总分提高可能来自容易技能的改善,逐类结果才能说明控制器对不同运动规律掌握得怎样。
任务范围同样限制了结论。论文以平地为主,没有覆盖地形与物体交互,动力学模型也只使用仿真数据学习;多种控制接口共同训练的收益仍有待研究。本次则只有单个种子的运行,尚不足以估计训练方差。更有价值的后续实验,是固定设置重复训练,再分别加入未见动作、摩擦变化和适当扰动,观察模型误差与控制失败是否同步增加。这样才能把“这套配置能够学会”推进到“它在什么条件下依然可靠”。
论文 Figure 6 展示了实体 G1 的跳跃、侧滚、90 度与 360 度翻转,这是作者验证训练路线能够迁移的证据。实际迁移还要处理状态估计、控制延迟、执行器约束与模型差异,策略输入也必须由真实传感链提供。本次文章中的运行和视频均来自仿真,尚未连接实体机器人。把这两层证据放在一起看,既能理解方法的潜力,也能明确复现读者下一步要补齐哪些接口和验证。

3.7 怎样继续改善动作质量
SuperMimic 最值得带走的思路,是把不同技能共享的身体动力学变成可以参与优化的知识。实现时先对齐动作、关节与仿真状态,再持续收集有效转移,让世界模型学会连续预测;策略借助短程回报梯度和 Critic 更新,最终仍回到完整动作执行检验。沿着这条路径,坐标变换、回放窗口、同步边界和评估分母都直接影响学习结论。理解这些连接,比只记住一个总分更有助于把方法迁移到自己的机器人或动作库。
动手复现可以先用短程运行检查接口,再恢复正式环境规模与预测时域,留出持续训练和检查点比较的预算。出现质量问题时,先确认真实转移和模型预测,再观察想象收益,最后看整段动作与失败位置;每次调参都应对应一个具体假设。训练时间提供改进的机会,完整评估说明机会有没有变成能力。 配套 Markdown、代码、图片和视频保留了这条实现路径,读者可以从同一组命令起步,也能沿着原始评分继续检查文章中的判断。
4. 参考资料
- [1] SuperMimic 论文 v1:第 3 节方法、第 4 节实验及附录 A、C、D、F;PDF 位于
evidence/SuperMimic.pdf。 - [2] SuperMimic 作者项目页:训练闭环、实验条件与实机展示。
- [3] 非官方复现仓库固定提交:源码、README 与 MILESTONES。
- [4] DeepMimic 作者页:参考动作与物理强化学习;DOI:10.1145/3197517.3201311。
- [5] BeyondMimic 作者页及 arXiv:2508.08241:动作跟踪与引导扩散控制。
- [6] SONIC 作者页:规模化动作跟踪与共享控制接口;DOI:10.1126/scirobotics.aed4592。
- [7] DreamerV3 作者页:世界模型与想象学习;DOI:10.1038/s41586-025-08744-2。
- [8] LAFAN1 G1 重定向数据:动作、URDF 与网格,具体使用条件见数据源说明。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)