X-Loco:从状态挑专家到视觉学生的人形协同蒸馏
一、X-Loco 全景与设计动机
人形机器人的三个核心技能——直立行走(upright locomotion)、摔倒恢复(fall recovery)、全身协调(whole-body coordination)——彼此冲突。直立行走要求连续步态与稳定姿态,全身协调要把躯干压低去钻横杆、爬箱子,摔倒恢复则要从仰卧或俯卧翻回来。这三个任务的奖励函数、终止条件、最优动力学区间几乎是相反的,单一策略很难同时学全。X-Loco(arXiv:2603.03733,RSS 2026)的核心解法是「分训 + 协同蒸馏」:先各自用 PPO(Proximal Policy Optimization)训出三个 oracle specialist(教师策略),再用一个 Case-Adaptive Specialist Selection(CASS)机制按状态挑专家,把它们蒸馏进一个基于视觉的学生策略。
让我们先用项目页的官方 pipeline 图建立全景认知:

图注:项目页官方 pipeline。左侧蓝色框 Case-Adaptive Specialist Selection 含映射函数 f(b_t, I_t) 与三个 specialist π_l/π_r/π_w;中部 Synergetic Policy Distillation 含三排仿真截图与三个技术标签(SAR/SFI/Depth Rendering);右侧 Velocity Command Locomotion Control 指向部署。配合论文 Figure 2(下方)的工程实现细节,可形成完整的「专家 → 协同蒸馏 → 视觉学生」认知。X-Loco Project Page
论文官方框架图把同一条链路从工程视角再展开一次:

图注:论文 Figure 2。(a) 展示三个 specialist 策略经过 Synergetic Policy Distillation 汇入一个基于视觉的通用策略 π_g;(b) 展示真实世界多技能。图注未给任何具体阈值或超参数,这些数值需要回到论文正文中读取。X-Loco
整套系统有三个支柱。第一个支柱是三个 oracle specialist π_l、π_r、π_w,它们用 PPO 在 Isaac Lab 上训出,分别负责直立行走、摔倒恢复、全身协调;它们的输入是特权状态(privileged state),包含真实线速度、外部感知与运动命令,部署时拿不到。第二个支柱是 CASS,它读头部高度 b_t 与环境上下文 I_t 这两个量,在每个时刻从三个 specialist 里硬性挑一个,作为监督信号的来源。第三个支柱是 MoE(Mixture-of-Experts,混合专家)学生网络 π_g,它只看本体的 proprioception(本体感知,含关节位置/速度、IMU 数据等)与深度图,没有特权信息,部署时就能直接跑。
PPO 是 legged locomotion 的默认 RL 算法这一点早已是工程事实。Ha 等的 2024 综述明确写道:「PPO is now the most popular algorithm for training locomotion policies for legged robots」,并把 legged_gym + Isaac Sim 列为事实标准 Ha2024。X-Loco 的 PPO 训练循环没有发明新东西——其 specialist 训练平台是 Isaac Lab(ref-001);与 legged_gym + rsl_rl 这套工程脚手架在结构上同源(同样以 PPO + 大规模并行仿真为事实标准),但具体平台不同。真正的新意是协同蒸馏与 CASS 的设计选择,以及把蒸馏结果压进一个视觉学生网络。
把同一份全景放进坐标系里:Distral(2017)走 KL 双向正则加 centroid 蒸馏 Distral,X-Loco 走 MSE(Mean Squared Error,均方误差)行为克隆加状态条件 teacher 切换——这是派别坐标的根本分野。AHC(AAAI 2026 Oral)走 DAgger(Dataset Aggregation,数据集聚合)加 PCGrad(Projecting Conflict Gradients,梯度投影消解)加 behavior-specific critic AHC,X-Loco 走 CASS 状态条件切换加 SAR(Specialist Annealing Rollout,专家退火滚动)混合执行——同一目标下完全不同的范式选择。HOVER(ICRA 2025)用 mode mask 走 DAgger 加 MSE imitation HOVER,它的教师是单一 oracle,没有按状态挑专家这一步。这些对照在后文会逐条展开。
关键洞察:CASS 不是「软标签按权重混合」——这是最容易踩错的直觉。CASS 是 indicator 硬切换(同一时刻只有一个专家激活、权重恒为 1),后文 §4 会用公式与对照把这件事彻底讲透。X-Loco 的协同性来自「按 case 切换 + SAR 混合执行」,不是来自动作分布的加权平均。
二、PPO 训练循环怎么落地到 X-Loco 的代码骨架?
你已经熟悉 PPO 的训练循环:rollout 收集经验 → GAE(Generalized Advantage Estimation,广义优势估计)算优势 → 用 clip 目标更新策略网络 → 重复。X-Loco 的三个 specialist 没有发明新的训练循环,它们落在 legged_gym + rsl_rl 这套脚手架上。你如果 fork 一份 legged_gym,把 humanoid env 注册进去,用 PPO 跑通 upright locomotion,就已经拿到了 X-Loco 的 π_l 训练入口。
先看 legged_gym 招牌的并行仿真范式:

图注:legged_gym 在 Isaac Gym 内并行仿真大量 quadruped 的俯视快照,背景为程序化生成的不规则地形。这张图展示的是「4096 并行 env」与「程序化不规则地形」的事实标准,不替代 cfg/env 继承关系的代码组织图;后者由下文 D2 流程图覆盖。legged_gym
legged_gym + rsl_rl 的工程骨架可以用 Python 类继承来理解。基类 LeggedRobot 装环境逻辑(reset、step、observation、reward),LeggedRobotCfg 装环境参数(资产路径、PD(Proportional-Derivative,比例-微分)增益、关节默认位置、reward scale、终止条件、域随机化范围),LeggedRobotCfgPPo 装训练参数(policy/critic 网络结构、PPO clip、entropy coef、learning rate、algorithm class)。新增一个 X-Loco specialist 就是新建 xloco_upright_config.py 与 xloco_upright.py,从基类继承,只覆盖 reset/reward/observation 中需要换的部分。这套继承关系可以用 D2 图把代码组织说清:
奖励总和的写法在 README 里被明文化:「Each non-zero reward scale specified in cfg will add a function with a corresponding name to the list of elements which will be summed to get the total reward」。也就是说,每个 reward 项(比如 tracking_lin_vel、ang_vel_xy、torque)都对应 env 类里的一个 _reward_xxx 方法,总奖励就是 cfg.reward.scales 表驱动求和。要新增或禁用某个奖励项,只需在 cfg 里改 scale 为 0 或新值,不用动 env 文件——这正是三个 specialist「共享 reward 容器,只换权重」这种设计能落到代码上的原因 legged_gym README。
训练入口是 legged_gym/scripts/train.py --task=<name>,回放是 play.py --task=<name>。同一份 train.py 切换 --task=xloco_upright 或 --task=xloco_fall_recovery 就训不同的 specialist,因为 task_registry 帮你做了 env/cfg 类路由。Registry 内部实现了 env vec 创建、teacher policy 加载、Runner 绑定等所有 wiring;rsl_rl 的 algorithms/ppo.py 跑标准的 PPO 更新循环,algorithms/distillation.py 跑 Student-Teacher Distillation 的 MSE imitation,正好对应 X-Loco L_distill 的天然实现面 rsl_rl README。
维护状态上有一个重要节点:legged_gym 在 2024-01-09 公告迁移到 Isaac Lab,原仓库「will receive limited updates and support」。复现 X-Loco 的路径因此需要兼顾两条入口——legged_gym(最小骨架,代码段极短、阅读最干净)与 Isaac Lab(活跃维护,跟 NVIDIA 新生态对齐)legged_gym README。X-Loco 论文引用了 Isaac Lab(mittal2025isaac),4096 并行环境、adaptive lr、地形课程(terrain curriculum,即按难度递进的地形训练调度)都借鉴 rudin2022learning,正是 legged_gym 这套骨架的特征。
X-Loco 的 PPO 超参列在论文 Training Details:specialist PPO 用 adaptive lr 1e−3、5 epochs/iter、4 mini-batches、24 steps/batch,γ=0.99、λ=0.95(GAE 的 λ 参数,用于优势估计的偏差-方差权衡)、clip 0.2、entropy coef 0.005、desired KL 0.01。Generalist 蒸馏则用 fixed lr 1e−3、8 epochs/iter、12 mini-batches、12 steps/batch——没有 γ/λ/clip,因为蒸馏走的是监督学习而不是 RL X-Loco。
三、三个专家各管一摊:π_l / π_r / π_w 的奖励与终止条件
X-Loco 的蒸馏可行性建立在一个关键的设计前提上:三个 specialist 共享统一的 action space A ∈ R^23,并共用同一套 PD 参数把 action 映射到关节目标位置 q_target = q_default + α · a_t,力矩 τ_t = K_p(q_target − q) − K_d · q̇。统一 action space 不是巧合,而是蒸馏能进行的设计前提——如果三专家输出维度不一致,MoE 学生网络就接不住它们的监督信号 X-Loco。
23 自由度构成为:每腿 6 个、每臂 4 个、腰部 3 个(Unitree G1)。PD 参数按关节分组(Hip Roll/Knee K_p=99.10、K_d=6.31;Hip Pitch/Yaw、Waist Yaw K_p=40.18、K_d=2.56;Ankle、Waist R/P K_p=28.50、K_d=1.81;Shoulder、Elbow K_p=14.25、K_d=0.91)。这组参数直接沿用 BeyondMimic 的标定值。
状态空间定义在 Problem Formulation 一节。Proprioception s^prop = [ω, g, q, q̇, a_{t−1}] ∈ R^78(角速度、重力向量、关节位置、关节速度、上一帧动作),是部署时唯一可用的观测。Privileged state s^priv = [v, b, e, f, h, m],包含线速度、头部高度、外力、feet info、局部地形高度采样 h ∈ R^143、motion command m ∈ R^52。外部感知是深度图 d ∈ R^{64×64}。专家读 clean privileged state,学生读加噪的非特权观测 o_u X-Loco。
π_l:直立行走
π_l 的训练目标是按速度命令 c = [v_x, v_y, ω_z]^T 跟踪直线与角速度。它用 history encoder 把 10 步本体感知历史 {s^prop, v, e, f} 压缩进 actor,同时接 elevation map encoder(局部地形高度采样)以适应不平地面。奖励里带 AMP(Adversarial Motion Prior,对抗式运动先验)style 项——用一个判别器区分参考 LAFAN1 motion(重定向到 Unitree G1)与策略生成的 5 步 transition 序列,对 23 个关节角度(即 G1 全部驱动自由度,与 action space 维度一致)做预测;style reward r^style = w_style · max(0, 1 − 0.25(d−1)^2)。总奖励 r = r^task + r^style。π_l 训 30,000 iterations。
AMP 的引入让 π_l 学到的不仅是「走到命令速度」,还有「走得像 LAFAN1 里的人」——style reward 弥补了 task reward 在 gait 多样性上的不足 X-Loco。
π_r:摔倒恢复
π_r 故意不喂地形信息 h_t,因为目标是姿态恢复而非速度跟踪。它的 history encoder + actor 结构更精简,但 reward 设计面临一个棘手问题:fall recovery 是稀疏、非周期的多接触序列(先摆正、再撑起、再蹲下、再站立),单阶段 PPO 加稠密正则根本训不动。
HumanUP(RSS 2025)给了这个困难一个明确的答案:把 get-up 拆成两阶段 curriculum。Stage I(discovery policy f)只给稀疏任务奖励加极弱正则(torque limit 越界 −0.1,termination −500,但平滑项只是 1e−7 的 DoF acceleration),目的是先把接触序列搜出来。Stage II(deployable policy π)把 Stage I 发现的轨迹通过插值 8× 慢放得到 8 秒左右的目标,再用稠密 tracking reward exp(−(q−q*)²/4) × 8 训 π 严格跟踪,并叠加所有强正则(torque limit 越界 −5,DoF velocity 1e−3)HumanUP。
HumanUP 的消融实验给出直接证据:去掉 posture randomization(20K supine + 20K prone 随机初始姿态池),成功率从 78.3% 掉到 41.7% HumanUP。单阶段 PPO 带同样强正则直接训不出来。这恰恰是 X-Loco π_r 必须采用不同范式(4 个独立 critic 加 supine/prone 初始化加大关节位置噪声)的原因。
X-Loco 的 π_r 没有走 HumanUP 的两阶段 curriculum,而是用 4 个独立 critic 的 multi-critic 结构。训练时机器人在仰卧与俯卧两种姿态初始化并加大关节位置噪声,让 PPO 能在 critic 端分别处理 supine→stand 与 prone→supine 两条轨迹;AMP style reward 同样来自 MoCap(动作捕捉)重定向到 G1 的参考动作。π_r 训 10,000 iterations X-Loco。
FRASA(arXiv:2410.08655)是另一个 fall recovery 范本(注:FRASA 被引用为 ICRA 2025 工作,但 arXiv abstract 页未直接显示 venue 标签,接收声明以 research-plan 标注为准,未由原文独立验证),它把动作空间压到 5 个 DoF(左/右对称取平均,再加躯干俯仰),用 SAC(Soft Actor-Critic,一种最大熵强化学习算法)+ CrossQ 把训练时间压到 13–37 分钟(235k–575k timesteps on RTX 3060)。FRASA 没有 curriculum、没有 MoE、也没有 CASS——它就是一个端到端、刻意精简的 specialist FRASA:

图注:FRASA 的简化 specialist 范本。左侧 Sigmaban humanoid 在中性/恢复姿态的侧视;右侧是 pose vector
ψ_target = [q_target, θ_target],即 5 个受控 DoF 的关节角 + 躯干俯仰,标注了控制平面。这张图不是神经网络架构图,而是 state/pose 的几何示意;图注未给出具体关节索引,不在图中读出。FRASA
FRASA 跑在 Sigmaban 上(70cm、7.5kg),不是 Unitree G1;这个差异在对比时必须记住。它的工程价值不是给 X-Loco 提供奖励公式,而是给读者一个直接可对照的「只训 fall recovery 怎么做」范本:刻意简化 action space、用 SAC 替代 PPO、用 CrossQ 替代标准目标网络,这些是训 π_r 时可以借鉴的杠杆。
π_w:全身协调
π_w 是三专家里最贵的一个,训 50,000 iterations。它走 motion tracking 范式,输入含 motion command m_t;目标是 box climbing 与 rolling,即钻横杆、爬箱子这类需要把躯干压低、全身协调的动作。它不追求通用 motion imitation——X-Loco 不要它学会 LAFAN1 的全部 dance,只让它精专于横杆/箱子这两个典型全身协调场景 X-Loco。
为什么要拆三专家而不是训一个?
AHC(AAAI 2026 Oral)给了一个反例:它先训两个 primary(locomotion π_w^b + recovery π_r^b),再用 DAgger 蒸馏到 MoE 多行为学生。看起来跟 X-Loco 一样是「分训 + 蒸馏」,但 AHC 的蒸馏时切换 teacher 只靠基座高度 h_base > 0.5m 这一条硬阈值,没有 CASS 那样的完整 (b_t, I_t) 状态条件 AHC。
X-Loco 拆三专家而非直接训 multi-task PPO 是因为三技能冲突。Multi-task RL 的梯度在不同任务间互相干扰(一个任务的梯度对另一个任务是噪声),直接训往往只有一个技能学得动。AHC 论文本身承认 multi-task RL「directly learning multiple skills via multi-task RL is challenging」AHC。
X-Loco 走 CASS 而不是 base-height 阈值的根本原因是:CASS 要支持横杆与箱子两种全身协调 sub-case。横杆悬挂高度约 0.7m(需要前滚通过),高平台需要攀爬,这两种 sub-case 对应的 motion command 不同,单靠基座高度切不到这么细。
HumanUP 的实验还给出了另一个维度上的证据:单阶段 PPO 带强正则训不出 get-up。X-Loco 的 π_r 不走 curriculum 是因为它用 4 个独立 critic 替代了「先 discovery 后 deployable」的两阶段——把稀疏信号的处理分到 critic 端。这是一条与 HumanUP 不同但同样有效 HumanUP。
对照表:三专家与替代范式
| 维度 | X-Loco 三专家 | FRASA 单专家 | HumanUP 两阶段 | AHC 两 primary |
|---|---|---|---|---|
| 任务范围 | 直立 + recovery + 全身协调 | 仅 recovery | 仅 get-up | 直立 + recovery |
| 训练算法 | PPO + AMP style | SAC + CrossQ | PPO(两阶段) | PPO + AMP style |
| 奖励信号 | task + style | state + variation + collision | Stage I sparse → Stage II dense | task + style |
| 训练 iteration | 30k/10k/50k | 13–37 min 一次性 | 10k + 10k | 10k + 10k |
| Teacher 切换粒度 | CASS (b_t, I_t) 完整状态 | 无(单策略) | 无(单策略) | base-height 0.5m 硬阈值 |
| 平台 | Unitree G1 (23 DoF) | Sigmaban (5 DoF) | Unitree G1 (23 DoF) | Unitree G1 (20 DoF) |
四、协同蒸馏核心:CASS 硬切专家 + SAR 退火 + L_distill MSE 行为克隆
三专家训完后,下一步是把它们蒸馏进一个学生策略。X-Loco 的协同蒸馏由四个组件组成:CASS 决定每个时刻用哪个专家的输出做监督信号;SAR 把学生动作与专家动作按一个混合比 ρ 混合后施加到环境;SFI 在行走或攀爬过程中注入外力把机器人推进 recovery 区域;L_distill 是学生网络对监督信号的 MSE 模仿损失。
CASS:indicator 硬切换,不是软权重
CASS 是 X-Loco 最核心的设计选择,也是最容易被误读为「软标签按权重混合」的地方。它的完整分段函数定义在论文 Appendix C:
f(b_t, I_t) = c_rec if b_t < 1.1
c_coor^1 if b_t ≥ 1.1 and I_t = 1
c_coor^2 if b_t ≥ 1.1 and I_t = 2
c_loco otherwise
b_t 是头部高度,I_t 是环境上下文编码:I_t = 1 表示面前是需要攀爬的高平台,I_t = 2 表示存在离地约 0.7m 的悬挂障碍(可用前滚通过)。目标动作的选择公式是 X-Loco:
a*_t = Σ_{(i, π_i) ∈ C} I(i = f(b_t, I_t)) · π_i(s_{i,t})
这里的 I(·) 是 indicator function,同一时刻只有一个专家被激活,权重恒为 1。如果 b_t = 0.9(机器人摔倒了),只有 π_r 输出动作;如果 b_t = 1.2 且 I_t = 1(站立着且面前是高平台),只有 π_w 输出动作。
CASS 示意图如下:

图注:CASS 选择过程的示意图,依据头部高度 b_t 与环境上下文 I_t 做 case 划分。论文 Appendix C 用该图图示 I_t 的语义。caption 未给出 1.1m 阈值或 0.7m 悬挂高度等具体数值,这些数值来自正文而非图注;不在图上读出任何分段公式。X-Loco
CASS 的 indicator 硬切换带来两条工程保证。第一,终止条件与被选中的专家保持一致——收集到的轨迹留在专家训练时探索过的 state-space manifold(状态流形)内,避免学生看到 expert 之外的状态分布。第二,在 c_coor 内部,CASS 会按地形调制喂给 π_w 的 motion command,因此 c_coor 实际展开成若干子 case c_coor^i。CASS 不只是「按头部高度挑」,而是「按 (头部高度, 环境上下文) 共同挑 case」。
纠正关键直觉:CASS 不做软权重加权。X-Loco 的协同性来自「按 case 硬切换 + SAR 混合执行动作」,不是来自动作分布的加权平均。这是 X-Loco 与 Distral、AHC 的根本分野 Distral。
SAR:混合比 ρ 的 hysteresis 退火
SAR 决定如何把学生动作与专家动作混合后施加到环境。执行到环境的动作是 X-Loco:
a_env = β_t · a*_t + (1 − β_t) · π_g(o_{g,t}), β_t ~ Bernoulli(ρ)
其中 β_t 是 Bernoulli 变量(以概率 ρ 取 1、否则取 0),ρ 是混合比(mixture ratio)。注意 SAR 论文原文用的是 b_t 这个符号,但 b_t 同时是头部高度的缩写——专题中我们换用 β_t 以避免混淆。
退火规则(正文公式):ρ ← max(0, ρ − Δρ · I(L_distill < ε))——当蒸馏损失低于阈值 ε 时,ρ 衰减。Training Details 给出的实际实现是 hysteresis-based 双阈值带滞环:每 iteration 衰减步长 1e−4;仅当 MSE loss 低于下阈值 τ_low = 0.005 时才衰减;若 loss 超过上阈值 τ_high = 0.010 则暂停衰减,直到 loss 重新回落到 τ_low 以下。滞环区间的作用是防止 ρ 过早下降、稳定更新 X-Loco。
纠正关键直觉:SAR 混合的是「施加到环境的动作」,存进 buffer 的监督标签始终是纯专家动作 a*_t(伪代码第 581 行 store (o_{u,t}, a*_t) 写得很清楚)。学生网络看到的训练目标是 clean expert action,不是混合后的 a_env X-Loco:

图注:SAR 数据流:施加混合动作,但监督标签始终是纯专家动作
SAR 的设计动机有两个。第一,未训练的学生会产出相对专家 OOD(Out-of-Distribution,分布外)的轨迹,且难以靠 early termination 过滤掉——混合后学生动作与专家动作共同影响环境,迫使学生走出 OOD 区域。第二,contact-rich(富含接触)与全身协调技能里,动作早期的误差会让 agent 根本经历不到后续阶段——混合执行保证学生能继续 rollout 到 π_r 或 π_w 能处理的 state-space manifold 内。
SFI:把机器人打进 recovery 区域
SFI(外力注入扰动)的目标是在学生 rollout 过程中强制它经历 recovery case。不同于「把一部分环境初始化在倒地状态」,SFI 在机器人行走或攀爬过程中注入随机外力,强行把它从正常状态推入 c_rec 区域。为保证真实性,外力注入并非完全随机,而是条件于特定易失稳场景(原文举例:高速转向、翻滚动作)X-Loco。
配套的额外终止判据:维护头部高度缓冲区 H,当
I(f(b_t, I_t) = c_rec) · I(Var(H_{t−k:t}) < δ)
成立时终止 episode。含义是:机器人被判为在起身过程中「卡住」了(CASS 选中了 recovery 但头部高度方差过低、说明没在起身)。目的是剪掉 π_r 无法推进的轨迹,避免损坏数据污染学生策略。论文未给出 k 与 δ 的具体数值,专题中以 qualify 方式提及 X-Loco。
SFI 的消融结果是直接的:无 SFI 0.912 → 有 SFI 0.958 X-Loco。
L_distill:纯 MSE 行为克隆
蒸馏损失的完整形式 X-Loco:
L_distill = E[ ‖π_g(o_{u,t}) − a*_t ‖₂² ]
学生 π_g 读加噪的非特权观测 o_{u,t},目标是逼近 CASS 选出来的纯专家动作 a*_t。没有 KL、没有 JS、没有蒸馏温度——这是与 Distral 的根本分野(Distral 的核心机制是 KL 双向正则加 centroid),也是与 AHC 的路线差异(AHC 的蒸馏损失是 λ_MSE · ||a^d − a^b||² + λ_KL · KL(π^d || π^b),λ_MSE=0.1、λ_KL=0.5)AHC。
为什么 X-Loco 选择 MSE 而非 KL?论文自己的 Limitations 给了答案:行为克隆使策略性能上界被专家封顶,在缺乏专家覆盖的 edge case 上效果较差。这是 MSE imitation 的代价——但换来的是训练稳定性与收敛速度,X-Loco 选择了后者 X-Loco。
蒸馏回路与混合执行逻辑图

图注:CASS 案例选择 + SAR 混合执行的蒸馏闭环
横向对照:CASS vs DAgger vs DAgger+mode mask vs KL-centroid
| 范式 | 代表工作 | Teacher 选择 | 监督标签 | 混合执行 | 损失函数 |
|---|---|---|---|---|---|
| CASS + SAR | X-Loco | (b_t, I_t) 状态条件硬切换 | 纯专家动作 a*_t | Bernoulli(ρ) 混合执行 | 纯 MSE |
| DAgger + PCGrad | AHC | base-height 0.5m 硬阈值 | online 收集 teacher 动作 | 无 | λ_MSE + λ_KL |
| DAgger + mode mask | HOVER | 无切换(同一 oracle) | oracle 动作 | 无 | 纯 MSE |
| KL + centroid | Distral | 无切换 | centroid π₀ 动作 | 无 | KL 双向正则 |
| KL + 行为专属 critic | AHC | base-height 0.5m | teacher 动作 | 无 | λ_MSE + λ_KL |
AHC 的 DAgger 是「在线收集 teacher 标签」的路数——学生 rollout 后用 teacher 在对应状态下的输出当监督信号。HOVER(ICRA 2025)的 mode mask 是「随机子集化命令空间」的路数——把 oracle 的完整 command 随机 mask 一部分给学生,逼学生学多种 mode 子集 HOVER。X-Loco 走的是状态条件 teacher 切换 + 混合执行,与它们都不同 X-Loco。
AHC 的 Stage II 用 PCGrad(梯度投影消解)处理多任务梯度冲突,cosine similarity 从 0.247(无 PC)升到 0.535(完整 AHC)AHC。X-Loco 不需要 PCGrad,因为它的梯度冲突问题在 CASS 阶段就被硬切换解决——同一时刻只有一个专家贡献梯度,多任务梯度冲突在源头被消除。
五、视觉学生网络:MoE-2 怎么把三技能压进 proprio + depth 输入
学生策略 π_g 需要把三个 specialist 的能力压进一个本体感知 + 视觉输入的网络,部署时不再依赖特权信息。它的架构是 MoE:gating network(门控网络,决定各 expert 的贡献权重)+ 2 个 experts(专家子网络)。Gating 与 experts 都是 3 层 MLP [512, 256, 128]。CNN depth encoder 把序列深度图压成 128 维 latent;history encoder 处理 10 步本体感知序列;两者拼接后送入 MoE 预测动作 X-Loco。
理解 MoE 的最好方式是把它想成程序里的「函数调用 + 默认返回值」:gating network 充当主函数,根据输入状态决定调用哪个 expert 子函数;expert 各自输出动作;gating 权重把它们融合成最终输出。不熟悉 MoE 的读者也能从「主函数决定调用哪个子函数、子函数给出结果、主函数整合后返回」这个直觉读懂。
MoE-2 > MoE-3 > MLP:消融解释
消融表给出直接的反直觉结论 X-Loco:
| 变体 | Locomotion | WBC | Recovery | Average |
|---|---|---|---|---|
| Ours w/o CASS | 0.903 | 0.446 | 1.000 | 0.783 |
| Ours w/o MoE (MLP) | 0.692 | 0.561 | 0.996 | 0.749 |
| MoE-3 | 0.628 | 0.709 | 1.000 | 0.779 |
| MoE-2 (Ours) | 0.939 | 0.845 | 1.000 | 0.928 |
MLP backbone 没有能力把多专家的 state-action 分布调和到共享参数空间;MoE-3 反而退化(尤其 Upright Locomotion 从 0.939 掉到 0.628),归因于「过多专家导致稀疏更新与次优的专家利用率」——MoE 的 expert 数与 CASS 的 3 个 case 不是一一对应。MoE-2 才是采用的架构——不要想当然认为 3 case 对应 3 expert。 这个结论需要在 §5 用消融表反复确认。
MoE 拆分粒度对照:X-Loco 拆 case vs LooperMuscle 拆 joint group
MoRE(arXiv:2506.08840,同作者组前置工作)给出了 MoE 学生网络的设计先验:latent 空间加残差(z' = Σ z^e_i · softmax(w)[i] 加到 actor hidden z^o 上),gating 输入是 gait command(一热向量),配合 AMP multi-discriminator 实现多 gait 可切换 MoRE。

图注:MoRE Figure 2。左栏 Stage I(Locomotion Skill Learning)展示 depth camera + 仿真地形 + PPO 训练循环;右栏 Stage II(Anthropomorphic Gait Acquisition),pretrained base policy 与 mixture of latent residual experts 用 ⊕ 符号示意 latent 加法,右端 multi-discriminators 接入 gait reward。两阶段 + 残差 + MoE 总览,作为 X-Loco 学生 MoE 的设计先验对照——不要把 MoRE 的 gait command gating 当成 X-Loco 的 CASS gating;X-Loco 学生网络还要接 Ray-caster Warp 与 CASS 状态条件 teacher。MoRE
LooperMuscle(arXiv:2608.00820,2026-08 listing scan 命中)给出了另一种 MoE 拆法:K=4 experts × G=2 joint groups(upper-body / lower-body),per-joint-group gating w_{k,g(j)},per-joint scaling S_{k,j},per-expert output alignment c_k LooperMuscle。

图注:LooperMuscle MoE Actor 架构。observation → recruitment network → per-joint-group gating weights
w_{k,g};下方 K 个 Muscle Unit (expert) boxes 输出μ_k(s_t);每个 expert 输出乘 per-joint scalingS_{k,j}(按 Unitree G1 关节 angular range 初始化)+ per-expert output alignmentc_k,融合成 per-joint actiona_{t,j} = Σ_k w_{k,g(j)} · c_k · S_{k,j} · μ_{k,j}。这是另一种 MoE——gating 在 joint-group 粒度而非 case 粒度,与 X-Loco 学生 MoE 形成拆分粒度对照。LooperMuscle
对照起来,X-Loco MoE 拆的是 case(任务级 specialist:upright / recovery / whole-body coordination),LooperMuscle MoE 拆的是 joint group(任务内部分身体区域:upper-body / lower-body)。两者的拆分粒度不在同一维度——前者服务于多任务蒸馏,后者服务于单一 whole-body tracking 任务内部的动态区域分工。
视觉栈:Ray-caster + 深度增强 + 相机随机化
学生策略的视觉输入是 64×64 深度图,由 Ray-caster camera(基于 NVIDIA Warp 的并行光线投射)渲染。原文 Camera Rendering 节明确了两个问题:现有仿真器的 sensor rendering 吞吐量低,且缺乏视觉隔离(机器人会误看到并行环境里的实例)。NVIDIA Warp 这类加速框架「往往难以同时处理动态与静态 mesh」。X-Loco 的解法是把环境解耦为静态 mesh(地形)与动态 mesh(机器人本体),每个 agent 的 ray-caster 只选择性查询全局静态 mesh 和自己的局部动态 mesh X-Loco。
⚠️ 原文没有给出任何吞吐量提速倍数或 FPS 数字——这部分专题只能以定性方式提及。
深度 sim-to-real 的工程细节:仿真侧注入 Gaussian 噪声(σ=0.02m)+ 模糊,并随机化相机内外参(位置 U[−0.05, 0.05] m、pitch U[−10, 5]°、roll/yaw U[−1, 1]°、水平 FOV U[−10, 10]°);实机侧对深度图做 hole-filling + Gaussian 滤波 X-Loco。
实机部署图直观展示了深度增强前后的对比:

图注:实机部署。左侧 (a) fall recovery + platform traversal、(b) 抗外部扰动、(c) 恢复→爬楼梯→翻滚连续序列;右侧上方是缺相机随机化导致绊倒的失败案例(caption 明确归因为缺少 camera randomization,不是 SFI/CASS 的失败),下方从左到右为仿真原始深度图、加噪深度图、处理后的实机深度图——这组三联图正好对应深度增强与 hole-fill + Gaussian 前处理的讲解。X-Loco
控制栈:50Hz 策略 + 500Hz PD + 200Hz 物理
部署控制环的频率安排:仿真物理 200Hz,策略 50Hz(decimation=4,即每 4 个物理步执行一次策略),PD 控制器 500Hz 在底层做关节位置跟踪。策略输出目标关节位置 q_target = q_default + α · a_t,由 PD 控制器转力矩 τ = K_p(q_target − q) − K_d · q̇。PD 参数按关节分组(见 §3)。实机 Unitree G1 配 Intel RealSense D435i 深度相机,Jetson Orin NX 板载计算 X-Loco。
六、复现路径与消融:跑通最小任务 + 哪些组件不能省?
X-Loco 截至 2026-09 在 arXiv 页与 TeX 源中均未挂出 GitHub 链接;项目页面的代码仓库状态本次未独立验证,需以实时项目页为准。复现路径因此应定位为基于论文超参的自行复刻。下面给出最小可行路径与消融结论。
复现路径:两条入口 + 三个最小任务
工程入口兼顾 legged_gym(最小骨架)与 Isaac Lab(活跃维护)。legged_gym 阅读最干净,代码段极短,依赖 Python 3.6–3.8、PyTorch 1.10+cu113、Isaac Gym Preview 3。Isaac Lab 是 2024-01-09 后 NVIDIA 官方维护的迁移版,对齐最新生态。两条入口分别对应「读完代码再动手」与「拿到最新 GPU 加速」两种需求 legged_gym README。
三个最小任务:fall recovery(π_r 单独训 + 部署)、terrain traversal(π_l 训 + 域随机化)、whole-body coordination(π_w 训 + motion command)。截至本次处理在 arXiv 页与 TeX 源中均未发现可用的 GitHub 仓库链接(项目页面状态未独立验证),复现时按论文 Appendix 的超参表(PPO 30k/10k/50k iterations、AMP style reward、域随机化具体范围)自行搭建。
域随机化的具体维度列在论文 Appendix:静摩擦 U[0.6, 1.0]、动摩擦 U[0.4, 0.8]、躯干负载 U[−1.0, 5.0] kg、推力间隔 U[5, 8] s、K_p/K_d 各 U[0.8, 1.2]× 标称值。地形课程是 10×20 网格、每块 8m×8m,五类地形(slopes 0–20°、pits 0.05–0.3m、hanging bars 净空 0.67–0.72m、stairs 0–0.15m、boxes 0.45–0.65m)X-Loco。
消融解读:哪些组件不能省
X-Loco 主消融表(来自论文 Table: ablation)汇总了所有组件的贡献 X-Loco,加上 §4 的 SFI 消融(SFI 0.958 vs 无 SFI 0.912)。
| 变体 | Locomotion | WBC | Recovery | Average | 解读 |
|---|---|---|---|---|---|
| w/o CASS | 0.903 | 0.446 | 1.000 | 0.783 | WBC 退化最严重(CASS 是 WBC 关键) |
| w/o MoE (MLP) | 0.692 | 0.561 | 0.996 | 0.749 | Locomotion 退化最严重 |
| MoE-3 | 0.628 | 0.709 | 1.000 | 0.779 | expert 数过多导致稀疏更新 |
| MoE-2 (Ours) | 0.939 | 0.845 | 1.000 | 0.928 | 完整模型 |
每个组件的相对贡献:去掉 CASS,平均从 0.928 掉到 0.783,主要损失在 WBC(0.446)——CASS 是协调全身动作的关键。去掉 MoE(退化成 MLP),平均从 0.928 掉到 0.749,主要损失在 Locomotion(0.692)——MoE 是多专家分布调和的关键。MoE-3 比 MoE-2 在 Locomotion 上差 0.311(0.628 vs 0.939),归因于 expert 过多导致的稀疏更新与次优利用率。
对照 AHC 的消融:AHC 引入 PCGrad + behavior-specific critic 后任务梯度 cosine similarity 从 0.247 升到 0.535——X-Loco 通过 CASS 硬切换在源头消除梯度冲突,不需要 PCGrad;AHC 通过 PCGrad 在梯度空间里消解冲突。两种范式都能解决多任务冲突,但 CASS 的开销更低(不需要算梯度投影)AHC.
对照 LooperMuscle 的消融:w/o MoE Actor 的退化最大(+51.5% body error),w/o Deferred Scheduling 次之(+17.8%)LooperMuscle。MoE 在 humanoid whole-body tracking 上的核心贡献是跨动力学区域的容量分布,与 X-Loco 的「跨任务」MoE 形成不同维度的设计空间。
对照 FRASA 的训练时长锚:13–37 min(235k–575k timesteps,CrossQ on RTX 3060)——这是「单 specialist 训完的最低成本」的下界 FRASA。X-Loco 三 specialist 总训练量在 90k iterations(30k+10k+50k)量级,比 FRASA 长一个数量级——这是 X-Loco 训练开销的真实参考。
常见坑与可验证的最小任务
复现时常踩的坑有四个。
坑一:把 CASS 当成软权重混合。 CASS 是 indicator 硬切换,同一时刻只有一个专家激活。如果按 a* = w_l · π_l + w_r · π_r + w_w · π_w 加权平均实现,会让三个专家的动作分布互相拉平,破坏 X-Loco 的核心设计。
坑二:把 SAR 当成对监督标签的混合。 SAR 混合的是施加到环境的动作 a_env,存进 buffer 的监督标签始终是纯专家动作 a*_t。如果把 a_env 写进 buffer 当监督标签,蒸馏目标会被噪声污染。
坑三:MoE expert 数与 CASS case 数对齐。 CASS 有 3 个 case(c_loco、c_rec、c_coor^i),但 MoE 用 2 个 expert。MoE-3 反而退化(Locomotion 从 0.939 掉到 0.628)。不要想当然写 MoE(num_experts=3)。
坑四:符号冲突 b_t。 论文中 b_t 既表示头部高度(状态定义)又表示 SAR 的 Bernoulli 变量(L192/L578)。写代码时必须换符号(如 Bernoulli 变量改 β_t),否则同一变量在不同公式里含义不同会引发 bug。
可验证的最小任务是 fall recovery + terrain traversal 两个。Fall recovery 单独训 π_r,跑 supine/prone 起立;terrain traversal 训 π_l,在五种地形上验证线速度/角速度跟踪。这两个任务是论文主结果明确报告的,硬件平台是 Unitree G1(23 DoF),复现时先确认 humanoid env 注册正确。
论文自承局限
论文 Limitations 节明确给出三个局限。第一个是 narrow-FOV 相机导致感知视野受限——单目 RealSense D435i 的视野在箱子与横杆场景下可能不够,需要后续工作加多相机或更广 FOV。第二个是真实传感器噪声难以完美建模——仿真侧 Gaussian 噪声 σ=0.02m 不足以覆盖实机所有噪声模式,hole-fill + Gaussian 滤波是工程妥协。第三个是因蒸馏依赖行为克隆,策略性能被专家上界封顶——在缺乏专家覆盖的 edge case 上效果较差,这是 MSE imitation 路线的固有限制 X-Loco。
参考文献
本专题引用的核心资料如下,建议深入学习时阅读原文:
- X-Loco: Towards Generalist Humanoid Locomotion Control via Synergetic Policy Distillation — arXiv:2603.03733
- X-Loco Project Page — https://x-loco-humanoid.github.io/
- legged_gym & rsl_rl (RSL) — Isaac Gym PPO codebases — https://github.com/leggedrobotics/legged_gym
- MoRE: Mixture of Residual Experts for Humanoid Lifelike Gaits Learning on Complex Terrains — arXiv:2506.08840
- Towards Adaptive Humanoid Control via Multi-Behavior Distillation and Reinforced Fine-Tuning (AHC) — arXiv:2511.06371
- HOVER: Versatile Neural Whole-Body Controller for Humanoid Robots — arXiv:2410.21229
- LooperMuscle: Fast and Stable Learning of Humanoid Whole-Body Tracking via Structured Mixture-of-Experts — arXiv:2608.00820
- Distral: Robust Multitask Reinforcement Learning — arXiv:1707.04175
- FRASA: An End-to-End Reinforcement Learning Agent for Fall Recovery and Stand Up of Humanoid Robots — arXiv:2410.08655
- Learning Getting-Up Policies for Real-World Humanoid Robots (HumanUP) — arXiv:2502.12152
- Learning-based legged locomotion: state of the art and future perspectives — arXiv:2406.01152