PAPER DEEP DIVE
CMoE:面向人形机器人运动控制与地形适应的对比混合专家
CMoE 利用对比学习优化 MoE 专家激活,提升人形机器人地形导航能力。在 Unitree G1 上验证,可跨越 20cm 台阶和 80cm 间隙。
一句话总结:CMoE 用对比学习约束混合专家网络的门控输出,让 Unitree G1 在真实场景中能用单一策略穿越 20 cm 连续台阶、80 cm 宽沟、30 cm 高障碍和 17° 斜坡,解决普通 MoE 门控在多种地形上激活近乎均匀、专家难以真正分工的问题。
论文信息:CMoE: Contrastive Mixture of Experts for Motion Control and Terrain Adaptation of Humanoid Robots,ICRA 2026,复旦大学的 Shihao Ma、Hongjin Chen、Zijun Xu、Yi Zhao、Ke Wu、Ruichen Yang、Leyao Zou、Zhongxue Gan、Wenchao Ding 等作者共同完成。
研究背景与动机
人形机器人在现实环境中部署,首先要面对的是连续变化且存在突然转换的地形:平地之后可能是台阶、沟、障碍、坡道,再进入混合地形。控制策略不能只在单一表面上保持稳定,还要在几十厘米的尺度上快速切换落脚策略。与四足机器人相比,人形机器人重心更高、支撑面更窄,地形误判往往直接导致摔倒,因此对感知、状态估计和动作选择的一致性要求更高。
近年来的学习方法通常把地形感知和运动控制放在同一网络里优化。混合专家是一种自然的候选结构:它可以通过多个专家子网络承载不同的运动技能,再由门控网络根据输入选择或组合专家输出,从而缓解多任务强化学习中的梯度冲突和任务干扰。MoE 在自动驾驶、自然语言处理、计算机视觉中已经得到广泛应用,也被用于四足和双足运动控制。
但论文指出,普通 MoE 在真实训练中存在“惰性门控”问题:理论上门控应该按地形选择专家,实践中多个专家却几乎以相同的权重被激活。这样一来,MoE 退化成一个大网络,专家没有形成清晰的职能边界,模型表达能力也受到限制。作者的核心动机是把“专家分工”从结构假设变成可学习的约束,让专家真正对应不同的地形运动模式。
针对这一观察,CMoE 提出把门控输出与高程图潜在表征放在同一个对比学习空间中进行对齐:同一轨迹上的门控与地形表征构成正样本,不同轨迹则构成负样本。通过 SwAV 风格的聚类分配与 Sinkhorn-Knopp 平衡约束,模型不再只依赖 PPO 奖励信号间接学习门控,而是被明确要求把专家激活与地形类型关联起来。
方法详解
系统总览
CMoE 是一个单阶段强化学习框架,整体由三部分组成:上下文状态蒸馏模型、混合专家策略、地形对比学习目标。上下文状态蒸馏模型负责从本体感知历史和高程图中提取显式身体状态与隐式地形表征;混合专家策略用多个专家 actor-critic 对生成动作与价值估计;对比学习目标则把门控权重和地形编码投影到同一低维空间,用可学习的原型引导专家按地形分工。
问题定义与 PPO
作者把多地形运动建模为马尔可夫决策过程,状态空间、动作空间、转移概率、奖励和折扣因子组成标准五元组。策略使用近端策略优化训练,目标是最大化期望折扣回报:
$$\pi^{*}=\arg\max\mathbb{E}\left[\sum_{t=0}^{\infty}\gamma^{t}R(s_{t},a_{t})\right]$$
实验中策略以 12 维腿部动作控制 Unitree G1,动作经比例控制器转换为关节目标,并在 Isaac Gym 中以 4096 个并行环境训练。与常见的两阶段师生蒸馏不同,CMoE 让感知、门控、专家与价值函数在同一个 RL 更新循环中共同优化。
观测设计
本体感知观测包含角速度、重力方向、速度指令、关节角度、关节角速度以及上一时刻动作:
$$\mathbf{o}_{t}=[\omega_{t},g_{t},c_{v}^{t},\theta_{t},\dot{\theta}_{t},a_{t-1}]$$
在实现中,单步观测为 45 维,网络使用最近 10 步历史组成 450 维本体感知序列;高程图观测包含 77 个采样高度点,覆盖机器人前方约 0.7 m × 1.1 m 的矩形区域。这种输入设计让策略同时具备短时运动历史和局部地形几何信息。
上下文状态蒸馏
上下文状态蒸馏模型包含两个并行编码器。第一个是基于 β-VAE 的机器人状态估计器,从本体感知历史中推断基座线速度和紧凑潜在状态;第二个是用于高程图重建的自动编码器,把 77 维高程点压缩为低维地形特征。两个估计器都以自监督方式从仿真观测中学习,不需要外部真值标签。
状态估计器的总损失同时约束速度估计和 VAE 重建:
$$\mathcal{L}_{\mathrm{CS}}=\mathrm{MSE}(\tilde{\mathbf{v}}_{t},\mathbf{v}_{t})+\mathcal{L}_{\mathrm{VAE}}$$
其中速度误差使用仿真器提供的真值基座线速度监督,VAE 部分则包含下一步观测重建与潜变量正则化:
$$\mathcal{L}_{\mathrm{VAE}}=\mathrm{MSE}(\tilde{\mathbf{o}}_{t+1},\mathbf{o}_{t+1})+\beta D_{\mathrm{KL}}(q(\mathbf{z}^{H}_{t}\mid\mathbf{o}^{H}_{t})\parallel p(\mathbf{z}^{H}_{t}))$$
高程图估计器采用更轻量的自动编码器,以重建误差作为训练目标:
$$\mathcal{L}_{\mathrm{AE}}=\mathrm{MSE}(\tilde{\mathbf{e}}_{t},\mathbf{e}_{t})$$
在代码实现中,状态估计器和地形估计器分别位于 `rsl_rl/rsl_rl/modules/state_estimator.py` 与 `rsl_rl/rsl_rl/modules/terrain_estimator.py`。前者通过 `reparameterize` 实现 VAE 采样,后者直接输出编码均值作为地形潜在表征。两个估计器的梯度更新被安排在 PPO 更新之前,使门控和专家始终使用较新的显式与隐式输入。
混合专家策略
CMoE 在 actor 和 critic 两侧都使用混合专家结构。每个专家模块包含独立的 actor-critic 对,但 actor 与 critic 共享同一个门控网络,以保证动作生成与价值评估采用相同的专家权重。最终动作均值由 softmax 归一化后的门控权重对各专家输出加权求和:
$$\mu_{\mathrm{weighted}}=\sum_{i=1}^{N}\mathrm{softmax}(g_{i})\cdot\mu_{i}$$
门控网络输入由当前观测、显式身体状态、本体潜在状态和高程图潜在状态拼接而成。在 `cmoe_actor_critic.py` 中,门控网络使用两层 MLP 加 softmax,五个专家共享同一输入但各自拥有独立网络参数。价值函数在 `evaluate` 中使用门控权重对专家价值进行加权,但门控权重本身被 detach,避免价值分支反向更新门控。
# rsl_rl/rsl_rl/modules/cmoe_actor_critic.py
expert_meansm = torch.stack(expert_means, dim=1)
weighted_means = (expert_meansm * self.gate_weights.unsqueeze(2)).sum(dim=1)
self.distribution = Normal(weighted_means, self.std)
return self.distribution.sample()
这种共享门控设计把专家选择权交给同一组地形相关输入,避免了 actor 与 critic 各自学习不同专家组合所带来的不一致。实验部分也表明,去掉对比学习后门控几乎不再随地形变化,说明仅靠 PPO 奖励不足以稳定地诱导专家分化。
地形对比学习
对比学习的目标是让门控输出与高程图编码形成语义对齐。作者用两个投影头分别把门控输出和高程潜在表征投影到 16 维空间,得到 $g^{z}_{t}$ 与 $e^{z}_{t}$;随后用 L2 归一化的原型矩阵计算每个样本分配到各聚类的概率。该方法受 SwAV 启发,用 softmax 温度缩放点积相似度:
$$\mathbf{p}^{g}_{t}=\frac{\exp(\frac{1}{\tau}{g^{z}_{t}}^{\top}e_{k})}{\sum_{k'}\exp(\frac{1}{\tau}{g^{z}_{t}}^{\top}e_{k'})}$$
为了避免所有样本都塌缩到同一个聚类,模型使用 Sinkhorn-Knopp 算法生成目标分配 $q$。最终对比损失最小化两个方向的聚类分配预测误差:
$$\mathcal{J}^{\mathrm{SwAV}}=-\frac{1}{2H}\sum^{H}_{t=1}(q^{g}_{t}\log p^{e}_{t}+q^{e}_{t}\log p^{g}_{t})$$
在实现中,原型数量为 32,温度为 0.2,Sinkhorn 迭代 3 次,epsilon 为 0.05。门控投影头和高程投影头都使用 128-64-16 的 MLP。对比损失直接加入 PPO 总损失,与策略 surrogate loss 一起反向传播,但计算门控输入时使用 detach,避免估计器内部被对比损失干扰。
# rsl_rl/rsl_rl/modules/cmoe_actor_critic.py
score_s = gate_z @ self.prototypes.weight.T
score_t = height_z @ self.prototypes.weight.T
with torch.no_grad():
q_s = sinkhorn(score_s)
q_t = sinkhorn(score_t)
log_p_s = F.log_softmax(score_s / self.temperature, dim=-1)
log_p_t = F.log_softmax(score_t / self.temperature, dim=-1)
contrastive_loss = -0.5 * (q_s * log_p_t + q_t * log_p_s).mean()
下面是方法流程的 Mermaid 示意,重点展示状态编码、门控、专家加权与对比学习之间的数据流:
flowchart TD
A[本体感知历史 450 维] --> B[StateEstimator beta-VAE]
B --> C[显式身体状态]
B --> D[隐式状态 z_H]
E[高程图 77 点] --> F[TerrainEstimator AE]
F --> G[隐式地形 z_E]
H[当前观测] --> I[拼接 Actor 输入]
C --> I
D --> I
G --> I
I --> J[门控网络]
I --> K[5 个 ExpertActorCritic]
J --> L[门控权重]
K --> M[加权动作均值]
L --> M
L --> N[GateProjector]
G --> O[TerrainProjector]
N --> P[SwAV 原型聚类]
O --> P
P --> Q[对比损失 J_SwAV]
M --> R[IsaacGym / Unitree G1]
Q --> S[PPO 总损失]
S --> R
域随机化与高程噪声
为了缩小仿真到真实之间的差距,作者随机化关节质量、转动惯量、摩擦、恢复系数、电机强度以及电机 $k_p$、$k_d$;每 16 秒对机器人施加最高 30 N 的外部扰动。高程图还加入延迟噪声、高斯噪声、偏移与旋转随机化。
论文专门设计了非线性盐椒噪声,用于模拟真实高程图中可能出现的极端高度点。对于高度点 $h(i)$,以概率 $p$ 采样靠近局部最大值或最小值的均匀分布,以概率 $1-2p$ 保持原值:
$$h(i)=\begin{cases}\mathcal{U}(M,2M-m) & \text{with probability }p,\\ \mathcal{U}(2m-M,m) & \text{with probability }p,\\ h(i) & \text{otherwise}\end{cases}$$
其中 $M$ 和 $m$ 是相应位置高度窗口内的最大值和最小值。论文还指出,真实传感器往往只能生成平滑曲线边缘,因此对仿真高程图的直角边缘进行倒角处理。这两项随机化共同提高了策略对高程感知误差的鲁棒性。
训练与实现细节
训练在单块 RTX 4090 上完成,4096 个环境并行,共 20,000 轮;使用 5 个专家、32 个原型、0.2 温度,高程图覆盖 0.7 m × 1.1 m。训练采用课程学习,把地形分为简单与复杂两类,对复杂地形逐步增加速度指令的幅值和方向。
官方仓库在 `legged_gym/legged_gym/envs/g1/g1_cmoe_config.py` 中给出完整配置。环境同时训练平地、粗糙坡、上下楼梯、离散凸起、沟、障碍、混合地形与窄楼梯,并通过 `terrain_proportions` 控制采样比例:
# legged_gym/legged_gym/envs/g1/g1_cmoe_config.py
terrain_dict = {
"plane": 0.,
"rough slope": 0.1,
"stairs up": 0.1,
"stairs down": 0.1,
"discrete": 0.1,
"parkour_gap": 0.3,
"parkour_step_up": 0.,
"parkour_step_down": 0.,
"parkour_hurdle": 0.1,
"mix": 0.1,
"narrow_stairs": 0.1,
"composite": 0.,
}
terrain_proportions = list(terrain_dict.values())
奖励函数在论文表 II 中列出。核心正奖励是速度跟踪与偏航跟踪,负奖励覆盖碰撞、过高基座高度、关节位置/速度/力矩超限、动作突变和足部绊脚。脚边奖励只在障碍或沟环境启用,因为台阶边缘接触不应一概惩罚。
| 奖励项 | 表达式 | 权重 |
|---|---|---|
| 速度跟踪 | $\exp\{-\|\mathbf{v}_{xy}-\mathbf{v}_{xy}^{c}\|_{2}^{2}/\sigma\}$ | 2.0 |
| 偏航跟踪 | $R_{\mathrm{yaw}}=\exp(-|\psi_{\mathrm{cmd}}-\psi|)$ | 2.0 |
| z 向速度 | $\mathbf{v}_{z}^{2}$ | -1.0 |
| 横滚俯仰角速度 | $\|\boldsymbol{\omega}_{xy}\|_{2}^{2}$ | -0.05 |
| 姿态 | $\|\mathbf{g}_{x}\|_{2}^{2}+\|\mathbf{g}_{y}\|_{2}^{2}$ | -2.0 |
| 基座高度 | $(h-h^{\mathrm{target}})^{2}$ | -15.0 |
| 足部绊脚 | $\bigvee_{i\in\text{feet}}\{\|\mathbf{F}_{i,xy}\|_{2}>3\cdot|F_{i,z}|\}$ | -1.0 |
| 碰撞 | $\sum_{i\in\mathcal{I}_{\mathrm{penalty}}}\mathbb{I}(\|\mathbf{F}_{i}\|_{2}>0.1)$ | -15.0 |
| 动作变化率 | $\|\mathbf{a}_{t}-\mathbf{a}_{t-1}\|_{2}^{2}$ | -0.3 |
| 关节速度 | $\sum_{i}\dot{\theta}_{i}^{2}$ | -5.0e-4 |
| 力矩 | $\sum_{i}\tau_{i}^{2}$ | -1.0e-5 |
| 关节位置越界 | $\mathrm{ReLU}(\theta-\theta_{\mathrm{max}})+\mathrm{ReLU}(\theta_{\mathrm{min}}-\theta)$ | -2.0 |
论文中的训练地形覆盖范围如下表所示。仿真跑道为 3 m × 18 m,机器人以 0.8 m/s 指令速度行走 20 秒;非足部碰撞或躯干横滚/俯仰偏差超过 1° 记为失败。
| 地形 | 描述 | 范围 |
|---|---|---|
| 斜坡 | 坡度角 | 0-20° |
| 楼梯 | 台阶高度 | 0.05-0.23 m |
| 沟 | 沟宽 | 0.1-0.8 m |
| 障碍 | 高度 / 宽度 | 0.2-0.4 m / 0.1-0.3 m |
| 离散凸起 | 不规则凸起高度 | 0.1-0.2 m |
| 混合 1 | 沟与台阶组合,沟宽 / 台阶高 | 0.1-0.8 m / 0.1-0.15 m |
| 混合 2 | 独木桥与台阶组合,桥宽 / 桥上台阶高 | 0.5-1.0 m / 0.1-0.25 m |
实验分析
仿真运动控制性能
作者与两个基线比较:Base 是不含 MoE 但参数量相同的 actor-critic,Vanilla MoE 使用最基础的 MoE 结构但不包含地形编码器和对比学习。仿真指标包括完整跑道的成功率与 20 秒内沿前进方向的平均行驶距离。
| 方法 | 斜坡 | 上楼梯 | 下楼梯 | 离散 | 沟 | 障碍 | 混合1 | 混合2 |
|---|---|---|---|---|---|---|---|---|
| CMoE | 0.991 | 0.886 | 0.905 | 0.991 | 0.974 | 0.987 | 0.767 | 0.747 |
| Vanilla MoE | 0.957 | 0.798 | 0.908 | 0.987 | 0.818 | 0.970 | 0.605 | 0.662 |
| Base | 0.966 | 0.481 | 0.483 | 1.000 | 0.221 | 0.779 | 0.276 | 0.388 |
| 方法 | 斜坡 | 上楼梯 | 下楼梯 | 离散 | 沟 | 障碍 | 混合1 | 混合2 |
|---|---|---|---|---|---|---|---|---|
| CMoE | 14.870 | 10.802 | 10.824 | 13.440 | 14.876 | 13.470 | 12.055 | 9.750 |
| Vanilla MoE | 11.675 | 8.898 | 9.250 | 14.870 | 11.980 | 14.780 | 9.960 | 8.703 |
| Base | 12.917 | 8.210 | 8.726 | 15.280 | 7.385 | 10.124 | 8.209 | 8.848 |
从成功率看,CMoE 在斜坡、上下楼梯、沟、障碍和两种混合地形上都保持较高水平;Base 在离散地形成功率 1.000,但沟成功率仅 0.221,说明普通单网络难以同时覆盖离散落脚和跨越沟。Vanilla MoE 在部分单地形接近 CMoE,但在沟和混合地形上明显下降,与对比学习缺失直接相关。
平均行驶距离同样反映趋势:CMoE 在沟上达到 14.876 m,混合 1 为 12.055 m,混合 2 为 9.750 m;Vanilla MoE 在障碍上 14.780 m 略高,但混合 1 和混合 2 分别只有 9.960 m 和 8.703 m。这说明专家分工在需要快速切换的复合地形中带来更稳定的持续运动。
对比学习的效果
论文用 t-SNE 可视化专家激活分布。Vanilla MoE 的激活点在各地形间没有明显分离,说明门控并没有学到地形特异性;CMoE 的激活点则按地形类型聚类,相似地形之间还存在按难度分层的结构。值得注意的现象是,上楼梯与下楼梯在表征空间中距离较远,说明模型没有把“楼梯”简单视为一类,而是区分了抬腿向上和稳定向下的不同运动需求。
训练曲线表明,CMoE 比 Base 更早达到更高地形等级,并且奖励增长速度和峰值更高。作者认为门控网络的地形分类降低了多任务学习难度,使专家和状态编码器能够更快收敛。
专家行为分析
作者设计了包含三个 30 cm 障碍、15° 上坡、十级下楼梯和三个 60 cm 沟的测试跑道,记录每个专家的激活水平随时间的变化。Vanilla MoE 中专家激活长期停留在小范围内,地形切换时几乎不产生突变;CMoE 中专家激活会在地形切换时明显跳变,不同专家承担不同角色。
论文进一步对专家 1 做移除实验:把专家 1 从评估网络中去除,机器人在上台阶前尝试抬腿但失败摔倒,在下坡场景中仍能正常行走。这验证了专家 1 专门负责上台阶类地形的抬腿动作,而不是全局平衡或下坡技能。这种行为级验证比只看激活数值更直接地证明了专家分工。
真实世界实验
CMoE 策略部署到 Unitree G1。真机系统使用雷达采集点云,结合机器人定位系统生成高程图,再把高程图作为观测发送给策略。实验覆盖了多种单一地形与混合地形:连续台阶最高 20 cm,沟最大 80 cm,障碍最高 30 cm,坡道可稳定上下 17°。
在混合地形中,机器人完成了 15 cm 台阶、60 cm 沟、30 cm 障碍和上坡的组合穿越。论文还测试了未训练过的户外台阶边缘、绳索拖拽和物体碰撞扰动:机器人在跨越 30 cm 障碍时被物体击中,仍能保持稳定姿态并完成任务。
这些结果说明 CMoE 的迁移收益主要来自两个层面:一是高程感知与状态估计让策略拥有前方地形先验,二是对比学习把门控稳定地绑定到地形语义上,使真实地形切换时专家权重能够及时变化。
代码与可复现性
官方代码以 BSD-3-Clause 许可发布,仓库包含 Isaac Gym 环境、G1 配置、CMoE actor-critic、PPO 算法、地形生成器和训练/回放脚本。仓库 README 提供了完整安装与训练方式,基础训练命令如下:
# README.md
python legged_gym/legged_gym/scripts/train.py --task=g1cmoe --alg=cmoe --run_name cmoe
当前初始版本只发布仿真训练代码。README 与 TODO.md 明确列出尚未发布的 MuJoCo 回放、Unitree SDK 真机部署和预训练权重,因此社区复现真机结果仍需等待后续版本。项目主页和演示视频提供了额外的定性与视觉验证材料。
局限性
- 真机定量证据有限:论文给出的 20 cm 台阶、80 cm 沟、30 cm 障碍和 17° 坡属于成功案例展示,没有报告多次重复试验的成功率、行驶距离或统计误差;真实环境中的鲁棒性仍缺少可复现的定量基准。
- 代码发布不完整:仓库当前只有 Isaac Gym 仿真训练代码,MuJoCo 回放、真机部署和预训练权重仍在计划中。研究者难以直接复现从训练到真机部署的完整链路。
- 消融覆盖有限:论文主要比较 CMoE、Vanilla MoE 和 Base,对原型数量、温度、专家数量、投影维度等关键超参没有系统消融,也没有单独分析对比损失与状态蒸馏各自对真机迁移的贡献。
- 对象与平台单一:所有实验都在 Unitree G1 上完成,未验证其他尺寸或自由度配置的人形机器人;20 cm 台阶和 80 cm 沟的极限能力可能依赖 G1 的腿部动力学与控制器频率。
- 失败条件严格:仿真以躯干横滚或俯仰偏差超过 1° 作为终止条件,这一标准较严格,可能使成功率偏低,但也会推动策略学习更保守的姿态恢复行为。
总结与展望
CMoE 的贡献不是简单地把 MoE 加入人形运动控制,而是用对比学习解决 MoE 在控制任务中最关键的结构失效:专家不分工。通过把门控输出与高程图编码投影到共享原型空间,模型获得了随地形变化而变化的专家激活,并在行为层面验证了专家确实承担不同运动功能。
从系统角度看,CMoE 保持了单阶段 RL 的简洁性,避免了多阶段师生蒸馏和复杂的风格约束。上下文状态蒸馏提供身体速度与地形潜在表征,MoE 负责在动作空间分解复杂控制任务,对比学习则负责把地形语义与门控选择绑定。三者在 PPO 更新中共同进化,使策略既能应对高难度单地形,也能在混合地形中连续切换。
论文将未来工作指向全身控制,目标是让手臂、躯干和腿部在跑酷任务中协同运动。对社区而言,更值得期待的是补全真机部署代码和预训练模型,以及把对比专家分工方法扩展到多机器人平台和更长时间范围的导航任务。
金句
专家分工不是混合专家网络的默认结果,而必须被显式学习:当门控与地形表征在同一个聚类空间中对齐时,机器人才真正学会“看到什么地形,就调用什么技能”。



