论文精读:SOLO——从清晰地形边缘到 1.5 km 长时程人形机器人运动

论文信息

  • 题目:SOLO: Stable Omni-terrain Long-Horizon Perceptive Humanoid Locomotion
  • 作者:Pihai Sun、Gang Han、Jingkai Sun 等
  • 版本:arXiv v2,2026 年 8 月 31 日
  • 论文:arXiv:2608.26583
  • 项目页:SOLO Project Page
  • 机器人:Omni humanoid,25 个策略控制关节
  • 关键词:Query Reconstructor、TA-MSE、Teacher–Student、Perceptive Humanoid Locomotion、Long Horizon
先说我的结论 SOLO 的贡献不是让机器人“偶尔跨过一个更难的障碍”,而是同时减少感知端的局部几何损失和控制端的长期行为偏移,让一次尚可接受的小误差不容易在后续数百、数千步里滚成摔倒。

本文的三个动态图均在浏览器本地运行,不加载第三方绘图库。动画用于解释机制;带有论文数字的图会明确标注数据口径。系统开启“减少动态效果”时,页面自动保留静态状态。

0. 一张图先看清 SOLO 在修什么

传统感知运动链条里有两个容易被忽略的“慢性误差源”:

深度历史
↓
共享向量 → 一次性解码整张高度图
↓ 局部尖锐边缘被平滑
Student 当前动作 ≈ Teacher 当前动作
↓ 只约束眼前,不问这个动作把下一状态带到哪里
未来状态逐渐偏离 → 后续观测与动作更难匹配 → 长时程跌倒

SOLO 在两个位置分别动刀:

问题 常见做法 SOLO 的修改 直接服务的场景
地形边缘被抹平 共享 latent 一次解码整张图 每个网格单元用自己的 Fourier query 检索传感器 token 台阶边缘、窄踏石、坑边、平台边缘
当前动作看似相近,未来却越走越偏 只做同一时刻的 action MSE 把下一状态的师生分歧加到当前 transition reward 连续地形切换、长距离无重置行走
训练与部署输入不一致 Teacher 永远吃特权高度图 最后阶段接入 QR,并在 Student 自己的 on-policy 数据上更新 深度噪声、延迟、遮挡下的 Sim-to-Real

关键是二者互补:QR 减少“看错地形”,TA-MSE 减少“这一步暂时没错、但把未来带坏”。

1. 长时程不是把单个障碍重复很多次

如果一个 5 m 测试段成功率为 pp,不能简单认为 1.5 km 的成功率就是 p300p^{300}:真实路线的地形、速度、恢复机会并不独立同分布。这个算式不适合预测论文结果,却揭示了一个工程事实:

只要失败风险会沿闭环积累,短测试中看不明显的小差距,在长距离中就会变得重要。

人形机器人每一步都同时改变三件事:

  1. 下一次相机的视角;
  2. 下一时刻的身体状态与落脚可达域;
  3. Student 接下来将访问的状态分布。

所以“感知误差”和“控制误差”不是两条互不相干的链。脚踩偏一点会让机身姿态改变,姿态改变又会让下一帧深度更难解释。这正是论文用 long-horizon fragility 描述的问题。

2. 输入、输出与部署边界

Teacher 观察为

otT=(mt,vt,pt),o_t^T=(m_t,v_t,p_t),

其中 mtm_t 是特权高度图,vtv_t 是真值基座速度,ptp_t 是 84 维本体与命令信息:

pt=[ωtb,gtb,ct,qt,q˙t,at−1]∈R84.p_t=[\omega_t^b,g_t^b,c_t,q_t,\dot q_t,a_{t-1}]\in\mathbb R^{84}.

Student 看不到 mtm_t 与真值 vtv_t,只使用深度历史与本体历史。部署时的数据形状是:

信号 设置 作用
胸前深度相机 RealSense D455;原始 640×480640\times480,网络输入 113×64113\times64 提供自我中心局部几何
深度历史 4 帧,stride 4 用时间差辅助几何和运动估计
本体历史 84 维 × 10 帧 在视觉退化时保留身体动态线索
QR 输出 16×3216\times32 高度图 + 3-DoF 基座速度 给 Student 一个显式、紧凑的运动相关表示
Policy 输出 25 维默认关节位置偏移 控制双腿、腰部与双臂
控制频率 50 Hz 每 20 ms 产生一次策略动作

这里的“无外部定位”容易被误读。它表示真机部署不使用 motion capture、外部里程计或外部地图;并不表示系统没有 IMU、本体状态估计和相机输入。

3. Query Reconstructor:为什么“每个格子自己提问”会更清楚

3.1 Dense decoder 的共享瓶颈

传统重建器常把整段深度历史压成一个共享 latent,再把 latent 上采样成整张高度图。大坡面很容易重建,因为它主要是低频结构;台阶竖直边缘、踏石边界和窄坑则属于高频细节,很容易在压缩和上采样中被平均掉。

对于 locomotion,这不是普通的视觉模糊。高度差若刚好落在脚掌边缘,几厘米误差就可能把“完整支撑”改成“跨边支撑”。

3.2 QR 的数据流

SOLO 先把每帧深度变成视觉 token,再把同一时刻的本体特征与时间编码加入 memory:

4 帧 depth ─→ ResNet ─→ visual tokens ┐
├─→ Transformer memory M_t
10 帧 proprio ─→ MLP + time embedding ┘

平面网格坐标 (x_i, y_i)
↓ 12 个 Fourier 频率
cell query q_i ──cross attention──→ M_t ─→ 单格高度 ĥ_i

单独的 velocity query ─────────────→ M_t ─→ v̂_t

网格共有

N=GxGy=16×32=512N=G_xG_y=16\times32=512

个单元。第 ii 个 query 带着自己的空间坐标去 memory 中寻找相关证据,而不是让一个共享向量同时记住 512 个位置的所有细节。

动态图 1 · QUERY RECONSTRUCTOR

同一段地形:共享平滑与逐格查询的差别

真值地形、共享解码器平滑结果与逐格查询重建结果的动态比较。

这张动画是机制示意,不是论文数据复刻。它强调的是:QR 不是凭空获得更多传感器信息,而是改变“哪里用哪些证据”的读取方式,让不同网格不必竞争同一个过度压缩的全局表示。

3.3 重建目标和训练位置

QR 同时监督高度与基座速度:

Lrec=λh1N∑i=1N∣h^i−hiGT∣+λv∥v^t−vtGT∥1.\mathcal L_{\mathrm{rec}} = \lambda_h\frac{1}{N}\sum_{i=1}^{N}\left|\hat h_i-h_i^{GT}\right| + \lambda_v\left\|\hat v_t-v_t^{GT}\right\|_1.

第三阶段里,QR 在“已经接入 QR 的 Student”产生的 on-policy buffer 上继续训练。策略读取的是停止梯度后的 QR 预测,因此策略 loss 不会借道修改 QR。这个细节非常实用:

  • QR 学的是 Student 真正会访问的相机视角;
  • 策略不能通过扭曲地图来投机降低控制 loss;
  • 感知与控制的数据分布联合变化,但优化目标保持解耦。

4. TA-MSE:为什么同一时刻动作接近还不够

普通蒸馏在 Student 自己访问的状态上,最小化

Laux(θ)=Et[∥μθ(htS)−μT(otT)∥22].\mathcal L_{\mathrm{aux}}(\theta) = \mathbb E_t\left[ \left\|\mu_\theta(h_t^S)-\mu_T(o_t^T)\right\|_2^2 \right].

它只回答:“在当前状态,两者动作有多像?”
它没有回答:“Student 刚才那个动作,把系统带到的下一状态是否仍容易被 Teacher 接管?”

SOLO 先在下一状态计算师生分歧,并停止梯度:

ℓˉt+1=sg⁡(∥μθ(ht+1S)−μT(ot+1T)∥22),\bar\ell_{t+1} = \operatorname{sg}\left( \left\|\mu_\theta(h_{t+1}^S)-\mu_T(o_{t+1}^T)\right\|_2^2 \right),

再把它接到前一个 transition:

rtTA=rttask−βℓˉt+1.r_t^{TA}=r_t^{task}-\beta\bar\ell_{t+1}.

这就是论文所谓“trajectory-aware”的最小改动。奖励本身只向前看一步,但 PPO 的 GAE 会把后续分歧继续向更早动作传播。对应的模仿回报可以写成:

Gtimit=−β∑k=t+1TRγk−t−1sg⁡[ℓˉk].G_t^{imit} = -\beta\sum_{k=t+1}^{T_R} \gamma^{k-t-1}\operatorname{sg}[\bar\ell_k].

动态图 2 · TEMPORAL CREDIT

未来第几步的分歧,会怎样回到当前动作

普通动作 MSE 与 TA-MSE 时序信用分配的动态比较。

4.1 为什么要停止梯度

如果不做 sg⁡\operatorname{sg},同一个分歧既作为监督 loss 又沿 reward 路径参与策略梯度,优化含义会变得混乱。停止梯度后:

  • 当前状态的 action MSE 仍负责直接模仿;
  • 分歧数值只被当成环境返回的代价;
  • PPO/GAE 负责把这项代价分配给此前动作。

完整目标为

max⁡θJPPO(θ;rTA)−λLaux(θ).\max_\theta \mathcal J_{\mathrm{PPO}}(\theta;r^{TA}) -\lambda\mathcal L_{\mathrm{aux}}(\theta).

因此三个 baseline 的区别非常清楚:

方法 当前动作 MSE 下一状态分歧 reward PPO task reward
PPO — — ✓
MSE + PPO ✓ — ✓
TA-MSE ✓ ✓ ✓

TA-MSE 没有增加新 critic、显式动力学模型或额外 Teacher rollout。Teacher 只在 Student rollout 已访问的状态上提供标签。

5. 三阶段训练:每一步在消除什么分布差

阶段 Terrain 输入 Policy 初始化 优化目标 解决的问题
I. Teacher 特权真值高度图 + 真值速度 从零 AMP 正则化 PPO 先获得稳定、自然的全地形技能
II. Privileged distillation 仍用特权地形 迁移形状兼容的 AME 权重;LSTM 与 action head 随机 TA-MSE + PPO 让 Student 在自己的轨迹上接近 Teacher
III. QR fine-tuning QR 预测高度图 + 速度 继承阶段 II Policy 继续 TA-MSE;QR 用 on-policy 重建 loss 对齐仿真部署输入与实际访问视角

部署时只保留

Depth + proprioception → QR → Student policy → joint targets

Teacher、privileged critic、AMP discriminator 和真值标签全部删除。

5.1 网络与训练预算

  • Teacher action MLP:[256,256,128][256,256,128];
  • Student action MLP:[512,256,128][512,256,128];
  • Student 本体旁路:单层 LSTM,input 84、hidden 128;
  • QR:dmodel=64d_{\mathrm{model}}=64、8 heads、4 层 memory self-attention、2 层 cross-attention;
  • QR 参数量:0.54 M;
  • 训练使用 4 张 H800;
  • Teacher:4096 env/GPU,50k iterations,约 90 h;
  • 特权蒸馏:4096 env/GPU,20k iterations,约 64 h;
  • QR fine-tuning:2048 env/GPU,5k iterations,约 20 h。

这说明方法虽然部署端很轻,但完整训练并不轻量。复现时最合理的顺序不是直接申请四卡跑满,而是先在小规模地形上验证:

  1. cell query 是否真的比 dense decoder 保住边缘;
  2. TA reward 的索引有没有错一位;
  3. Student rollout 上的 Teacher label 与 done mask 是否对齐;
  4. QR 输入延迟与相机历史是否和部署一致。

6. 公式究竟服务到哪段代码

把它映射到 rsl_rl/legged_gym 风格的训练循环,最关键的是 transition 对齐:

for t in range(num_steps_per_env):
action_t = student.act(student_obs_t)
teacher_action_t = teacher.act(privileged_obs_t)

next_obs, task_reward_t, done_t = env.step(action_t)

with torch.no_grad():
next_student_action = student.mean(next_obs.student)
next_teacher_action = teacher.mean(next_obs.privileged)
next_disagreement = mse(next_student_action, next_teacher_action)

reward_t = task_reward_t - beta * next_disagreement

storage.add(
obs=student_obs_t,
action=action_t,
reward=reward_t,
done=done_t,
teacher_action=teacher_action_t,
)

advantages = compute_gae(storage.rewards, storage.values, storage.dones)
loss = ppo_loss(advantages) + lambda_aux * action_mse(student, teacher)

上面是概念伪代码,不是作者公开实现。它暴露出最容易写错的三处:

  • ℓˉt+1\bar\ell_{t+1} 必须挂到 rtr_t,不能挂到 rt+1r_{t+1};
  • terminal transition 需要正确 mask,避免把 reset 后新 episode 的分歧算回旧 episode;
  • 计算 disagreement 时不应让梯度穿过 reward 数据通路。

如果想继续追 storage → GAE → PPO update 的真实张量形状,可以接着看 从公式走进 rsl_rl 与 legged_gym 的 PPO 训练闭环。

7. Reward 为什么也在强调“别踩边缘”

SOLO 的 task reward 并不只追踪速度。一个很能说明设计意图的项是 foothold gradient penalty:

redge=1[vxb>0]∑f∈Fcf[0.7(dffront+dfrear)+0.3(dfleft+dfright)],r_{\mathrm{edge}} = \mathbf 1[v_x^b>0] \sum_{f\in\mathcal F}c_f \left[ 0.7(d_f^{front}+d_f^{rear}) +0.3(d_f^{left}+d_f^{right}) \right],

权重为 −5-5。若脚下某方向的局部高度差跨过 5 cm 阈值,对应 dfs=1d_f^s=1。前后边缘比左右边缘权重更高。

这把 QR 和控制目标真正接了起来:

QR 保住高度不连续
↓
Policy 看见落脚边缘
↓
edge reward 告诉策略不要跨边支撑
↓
减少 stumble 与后续姿态偏移

其他关键项还包括:腰/头触地终止 −200-200、foot stumble −5-5、非足部接触、腾空、脚滑、接触力、动作变化率和能耗。这里的重点不是背权重,而是理解:更清楚的地图只有在 reward 或策略目标真正关心落脚几何时才有价值。

8. 地形课程和 Sim-to-Real

训练地形是 10×1710\times17 的程序化 curriculum 网格,每块 8×88\times8 m,水平分辨率 5 cm、竖直分辨率 5 mm。10 行增加难度,17 列覆盖不同地形族:

  • 上下楼梯共 35.3%,最高台阶 25 cm;
  • 上下坡共 11.8%;
  • 方台与坑共 11.8%;
  • 随机网格 5.9%;
  • 随机粗糙地面 11.8%;
  • gap 5.9%,宽度最大 50 cm;
  • stepping stones 11.8%,石块最窄 20 cm、间隙最大 30 cm。

随机化同时覆盖两类误差:

类别 例子
动力学 摩擦、腰部质量与 CoM、PD 增益、初始位姿、10–15 s 随机推扰
感知 本体噪声、相机外参、0–3 帧深度延迟、值/边缘噪声、缺失像素、盲区与模糊

值得注意的是,最高难度仿真 stress test 关闭了噪声和推扰,用来更干净地比较重建器;真实部署的鲁棒性则来自完整训练随机化与系统闭环。两类证据不能混为一张表。

9. 实验数字:哪些结果最能支持方法

9.1 高度重建

在难度 0.99 的 8 类地形上,平均高度 L1 为:

重建器 平均 L1(cm) Gap Random Grid Stones
START 7.59 10.11 5.18 14.76
DPL 9.26 10.62 8.09 12.75
QR 2.29 2.27 2.43 5.92

因此论文摘要中的“3.3–4.0 倍”来自 7.59/2.29≈3.317.59/2.29\approx3.31 与 9.26/2.29≈4.049.26/2.29\approx4.04。这不是“提升 330%–400%”,而是误差缩小到基线的大约 1/3.31/3.3 与 1/4.01/4.0。

在参数量受控的离线比较里,QR 为 0.54 M 参数,平均 L1 2.98±0.072.98\pm0.07 cm、Edge F1@1 0.386±0.0080.386\pm0.008;DPL 为 0.78 M 参数,对应 4.36±0.104.36\pm0.10 cm 与 0.214±0.0040.214\pm0.004。QR 的优势不仅是平均高度,更明显地落在边缘质量上。

9.2 最高难度运动 stress test

每种地形 100 次 rollout、最长 30 s、通过 5 m 算成功;命令前进速度为 0.4–1.0 m/s,侧向和转向为零,并关闭噪声和推扰。

动态图 3 · REPORTED RESULTS

别只看均值:窄踏石才是重建器的压力点

SOLO QR、START 与 DPL 在最高难度地形上的成功率对比。

指标 START DPL SOLO / QR
八类地形平均成功率 75.0% 75.6% 97.5%
Stepping stones 3% 0% 96%
各方法最差地形 3% 0% 92%

楼梯上的 foot stumble 和 foothold-gradient 代价也全面降低;dense baselines 为 QR 的 1.78–10.83 倍。这比只看总 reward 更接近方法想解决的因果点:地图边缘更清楚,脚跨边支撑更少。

9.3 TA-MSE 的证据强度

主 curriculum 曲线中,TA-MSE 最终约到 5.5,MSE+PPO 约 5.1,纯 PPO 低于 5.0 且更震荡。附录的三随机种子、缩减算力对比中,level-9 stepping stones 为:

方法 成功率
MSE + PPO 72.66±5.1272.66\pm5.12%
TA-MSE 79.43±5.9779.43\pm5.97%

增量为 6.77±5.866.77\pm5.86 个百分点。简单/中等地形接近饱和,个别项目并非 TA-MSE 更高,例如 Down-25 中 TA-MSE 为 97.92%,MSE+PPO 为 100%。因此更稳妥的判断是:

TA-MSE 对“未来动作分歧会放大的难地形”最有帮助,但现有消融还不足以证明它在每种地形上都严格占优。

10. 真机结果:1.5 km 到底证明了什么

SOLO 使用胸前单目深度输入(D455 depth stream)和本体状态,zero-shot 部署完成:

  • 一次无重置、无人工扶持的连续 1.5 km 户外路线;
  • 自然楼梯、斜坡、草地过渡与不平地面;
  • 室内连续混合路线:上楼、踏石、45 cm gap、下楼、可移动障碍;
  • 七类隔离地形各 10 次:除踏石 9/10 外,其余均为 10/10,总计 69/70。

这组证据可以支持:

  1. 单深度相机 + 本体输入的完整系统具备很强的连续闭环稳定性;
  2. QR 与 Student 可以在 50 Hz 的板载预算里工作;
  3. 训练中的噪声、延迟与动力学随机化足以支撑有代表性的 zero-shot 真机迁移。

但它不能单独支持:

  • “任意 1.5 km 路线都能完成”:论文展示的是一条连续路线,不是多路线重复统计;
  • “已经自主导航”:平面速度命令由人给出,策略负责按命令稳定穿越;
  • “完全不依赖状态估计”:本体与重力方向仍是输入;
  • “仿真 97.5% 等于户外长程成功率”:前者是 5 m、30 s、关闭噪声的 stress test。

把展示、受控仿真和重复真机试验分开读,反而更能看到论文证据链的完整性。

11. 板载延迟为什么不是瓶颈

在 Jetson AGX Thor MAXN 上,TensorRT batch-1 推理为:

  • network inference:1.03±0.211.03\pm0.21 ms;
  • p95:1.59 ms;
  • 完整 pipeline:1.15±0.231.15\pm0.23 ms;
  • TensorRT engine:7.56 MB。

相对 50 Hz 的 20 ms 控制周期,网络本身余量很大。工程上的剩余风险更可能来自相机采集、帧同步、缓冲延迟、状态估计和控制通信,而不是一次 forward。

12. 我认为最值得复现的四个小实验

实验 A:只验证“边缘”,不要先训机器人

生成楼梯、窄平台和踏石高度图,构造同一批深度历史,比较 dense decoder 与 cell-query decoder:

  • overall height L1;
  • 靠近高度不连续处的 edge L1;
  • Edge F1;
  • 参数量与推理延迟。

如果 overall L1 接近而 Edge F1 明显不同,才能说明表示真的服务于落脚而非只提高平均像素分数。

实验 B:检查 TA reward 是否错位

做一个长度 8 的玩具 rollout,只在 t+5t+5 注入一次分歧,打印每个 transition 的 imitation return。它应该按 γ\gamma 向前衰减,并在 episode boundary 截断。本文动态图 2 就是这个单元测试的可视化版本。

实验 C:分开记录当前 MSE 与未来分歧

若 action MSE 持续下降但 next-state disagreement 不降,说明 Student 会在眼前模仿,却仍把系统带向 Teacher 难以纠正的状态。只记录合并后的 PPO reward 会掩盖这个问题。

实验 D:让重建误差与脚下事件对齐

按时间同步记录:

edge reconstruction error
foot contact position
foothold_grad_penalty
foot stumble
termination reason

然后检查“边缘误差升高 → 跨边支撑 → stumble/跌倒”是否真的存在。只有这条链成立,QR 的视觉指标才与运动收益形成闭环。

13. 与已有笔记的连接

SOLO 可以放进这条演进线:

鲁棒感知运动:视觉坏了时靠本体记忆与可信度
↓
AME-1:用身体状态查询地形,隐式选择落脚区域
↓
AME-2:局部 attention + 全局地形上下文 + 不确定性地图
↓
SOLO:逐格查询保住尖锐边缘 + 时序分歧约束长程状态分布

SOLO 与 AME 系列都使用 attention,但 query 的语义不同:

方法 谁发出 query 想回答的问题
AME-1 本体状态 当前身体状态下,地图哪些位置与动作最相关?
AME-2 本体 + 全局地形上下文 当前整体地形中,哪些局部区域最值得关注?
SOLO QR 每个高度图单元的空间坐标 传感器历史中,哪些证据能重建我这个格子的高度?

一个是为 policy 选信息,一个是为 reconstructor 恢复空间位置,不能因为都有 cross-attention 就视为同一模块。

14. 局限与我仍然想追问的地方

论文明确列出的边界包括:

  1. 仍是 2.5D 高度图,每个 (x,y)(x,y) 只能表达一个地面高度;
  2. 胸前前视相机存在后方盲区;
  3. 透明、反光表面会破坏深度;
  4. 目前依赖人工速度命令,没有自主路径规划;
  5. 更长记忆、体素表示或互补传感器仍是后续方向。

此外,我会保留四个判断:

  • 1.5 km 很有说服力,但仍是一条路线的一次连续系统展示;
  • 跨论文 long-horizon 对比涉及不同机器人、路线与协议,只适合提供背景;
  • 4 张 H800、约 174 h 的三阶段训练成本不低;
  • 截至本文整理时,论文和项目页没有给出公开代码入口,因此本文伪代码只表达算法索引,不能替代作者实现。

15. 最后的理解

SOLO 最让我受用的地方,是它把“长期稳定”拆成两个非常具体的局部问题:

空间上,不要让一张共享表示抹掉脚真正关心的边缘;时间上,不要只问当前动作像不像 Teacher,还要问它把未来带到了哪里。

QR 并没有解决所有深度感知问题,TA-MSE 也没有变成完整的轨迹模型。两者都选择了相对小、容易接入现有 teacher–student PPO 系统的改动:

per-cell query → 少丢一点动作关键几何
next-state disagreement → 早一点惩罚会导致未来偏离的动作
on-policy QR fine-tuning → 让感知器适应 Student 真正看到的视角

当单步误差不能完全消灭时,长时程系统更现实的目标就是:让误差更少发生、发生后更难积累,并尽快回到 Teacher 熟悉的状态分布。SOLO 的 1.5 km 展示,正是这套思路在完整真机闭环中的一次强证据。

参考资料

  1. Sun, P., Han, G., Sun, J., et al. SOLO: Stable Omni-terrain Long-Horizon Perceptive Humanoid Locomotion. arXiv:2608.26583v2, 2026.
  2. SOLO authors. SOLO Project Page. 2026.
  3. Peng, X. B., et al. AMP: Adversarial Motion Priors for Stylized Physics-Based Character Control. ACM TOG, 2021.
知识共享许可协议