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​=B1​b=1∑B​j=1∑k​mb,j​D1​i=1∑D​(σˉi​ei​(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​)−Kd​q˙​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^t​r^t+1​+γHc^H​Vψ​(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​(−25Gmax​Gb​​),pb​=Bbin​0.5​+0.4wb​+0.1∑j​wˉj​wˉ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 秒。它能帮助检查程序是否连通,却给不了模型足够的数据和优化机会。结合前面的时域消融来看,后续应先恢复正式配置,再延长训练,单纯让这组小配置多跑几百轮,很难判断究竟验证了哪一项方法设计。

参数原短训正式配置对学习过程的影响
并行环境2564096增加真实转移的覆盖
世界模型批量 / 每轮批次128 / 22048 / 10增强动力学拟合
策略批量1284096增加想象轨迹数量
预测时域832为动作后果保留计算窗口
世界模型预热迭代10500策略更新前先建立模型
Critic 训练轮数25加强价值拟合
总迭代预算12032000留出持续改进和模型选择的空间

世界模型刚开始训练时,预测和梯度都缺少依据,因此正式配置先用 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​−2​1alive​(t)ri,t+1​​,rmax​=0.1,Rˉclip​=401​i=1∑40​Rˉ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.3292910.33972118/40
同一模型录制复评0.5393340.56716812/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. 参考资料

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐