【SONIC源码阅读系列7】总结和回顾
第六阶段:结论、真正的创新点与研究方向
前五阶段已经把代码链路拆开了。第六阶段不再继续“讲代码”,而是把这些局部重新组合成一个研究系统:
SONIC 到底解决了什么问题?它为什么这样设计?哪些部分是真正的研究贡献?哪些只是工程实现?如果沿着这个方向继续做,最值得研究什么?
这一阶段压缩成下面这棵树:
Phase 6:SONIC 的研究理解
│
├── 6.1 它到底在解决什么问题
│ └── 异构运动来源 → 统一 latent → 通用 whole-body controller
│
├── 6.2 SONIC 的核心创新
│ ├── Universal Token
│ ├── latent alignment
│ ├── token-conditioned policy
│ └── VLA / motion / teleop 的统一接口
│
├── 6.3 真正的数据闭环
│ └── Motion → Token → PPO → Decoder → Robot
│
├── 6.4 为什么这个设计有效
│ ├── representation
│ ├── policy
│ └── deployment
│
├── 6.5 目前架构的关键限制
│ ├── token 空间依赖 checkpoint
│ ├── VLA-token 对齐
│ ├── 29-D body / 14-D hand 接口分裂
│ ├── latent 离散化的信息损失
│ └── sim-to-real / embodiment gap
│
└── 6.6 最值得继续做的研究
├── Universal Token 学习
├── VLA-token co-training
├── latent-conditioned WBC
├── hand / embodiment generalization
└── token-level adaptation / online control
6.1 SONIC 真正解决的是什么问题?
先不要把问题理解成:
“SONIC 是一个更好的 G1 控制器。”
这个理解太窄。SONIC 更核心的问题其实是:
机器人上层越来越容易产生各种不同形式的运动意图,但底层 whole-body controller 不应该为每一种上层表示重新设计一套。
例如上层可以产生:
SMPL motion
│
├── 3D human motion
│
Teleoperation
│
├── VR body targets
│
Motion generation
│
├── future joint trajectories
│
VLA
│
├── 64-D motion token
│
▼
SONIC
│
▼
G1 whole-body control
传统方式容易变成:
SMPL → controller A
Teleop → controller B
Motion planner → controller C
VLA → controller D
这会导致一个非常现实的问题:上层 representation 一变,底层控制器也要跟着重新适配。
SONIC 的思路是把中间层抽象出来:
不同 motion representation
↓
Universal Token
↓
Universal Controller
↓
Robot Action
所以它真正追求的是:
把“运动表示”和“机器人控制”解耦。
这也是为什么前面看到的 UniversalTokenModule 是整个 repo 最关键的研究模块。
6.2 第一核心创新:Universal Token
前面已经知道它不是简单的 VQ-VAE,它的基本结构可以写成:
xm⟶Emhm⟶Qz⟶Da x_m \overset{E_m}{\longrightarrow} h_m \overset{Q}{\longrightarrow} z \overset{D}{\longrightarrow} a xm⟶Emhm⟶Qz⟶Da
其中:
- xmx_mxm:某一种 motion modality
- EmE_mEm:对应 modality encoder
- hmh_mhm:连续 latent
- QQQ:FSQ
- zzz:64-D universal token
- DDD:共享/对应的 decoder
- aaa:G1 body action
这里真正重要的是:不同 modality 有自己的 encoder
例如:
G1 motion ────────> E_g1 ──┐
│
Teleop ───────────> E_tele ┤
├──> latent → FSQ → token
SMPL ─────────────> E_smpl ┘
但是最终进入的是同一个 latent/token space。
所以:
E_g1(x_g1) ≈
E_tele(x_tele) ≈ shared latent
E_smpl(x_smpl) ≈
这就是为什么 repo 里面会有下面这么多 aux loss:
G1SmplLatentLoss
G1TeleopLatentLoss
TeleopSmplLatentLoss
ReencodedSmplG1LatentLoss
它们不是附带的小 loss,它们实际上在训练:
“不同运动描述应该能够被压缩成同一个控制语义。”
6.3 第二核心创新:latent alignment
这一点我认为是理解 SONIC 最重要的一层。假设同一个动作:
“抬右手”
可以有三种描述(或者说三种来源):
SMPL:
人体关节轨迹
Teleop:
VR target / orientation
G1 motion:
G1 joint trajectory
SONIC 希望:
ESMPL(xSMPL)≈ETeleop(xTeleop)≈EG1(xG1) E_{SMPL}(x_{SMPL}) \approx E_{Teleop}(x_{Teleop}) \approx E_{G1}(x_{G1}) ESMPL(xSMPL)≈ETeleop(xTeleop)≈EG1(xG1)
然后经过 FSQ:
z=Q(h) z = Q(h) z=Q(h)
最终:
D(z,st)→at D(z,s_t) \rightarrow a_t D(z,st)→at
于是 decoder 不需要知道:
“这个 token 原来是 SMPL 还是 Teleop?”
它只需要知道:
这个 token 表示什么运动意图。
6.4 为什么这里一定要有 FSQ?
这也是一个很值得研究的点。
如果没有量化:
h∈R64 h\in\mathbb{R}^{64} h∈R64
那上层系统和 SONIC 之间传输的就是一个连续 64-D latent。
有了 FSQ:
h→Q(h)→z h \rightarrow Q(h) \rightarrow z h→Q(h)→z
当前配置:
num_fsq_levels = 32
max_num_tokens = 2
所以可以理解成:
token 1: 32-level vector
token 2: 32-level vector
总共:
2×32=64 2\times32=64 2×32=64
这里的 64 是向量维度,不是“64 个离散 token”。
这个区别非常重要。
FSQ 带来的好处之一是:
让上层 VLA 和下层 controller 之间拥有一个相对明确、有限结构的接口。
于是 VLA 不需要预测 29 joint positions,而是直接预测 64-D motion token,然后由 SONIC 负责把它变成:
29-D whole-body action
这实际上是在做一种:
semantic action abstraction
6.5 第三核心创新:Policy 不直接学 motion,而是学 token-conditioned control
到这里,把 PPO 接起来。SONIC 的 policy 可以抽象成:
at∼πθ(at∣zt,st) a_t \sim \pi_\theta(a_t|z_t,s_t) at∼πθ(at∣zt,st)
其中:
- ztz_tzt:Universal Token
- sts_tst:当前机器人 proprioception
- ata_tat:29-D body action
Universal Token
│
▼
┌─────────────┐
state ─> Policy │
└─────────────┘
│
▼
29-D action
注意这里的关键变化。普通 locomotion policy 是 at=π(st)a_t=\pi(s_t)at=π(st),而SONIC是:
机器人当前状态告诉 policy “我现在在哪里”;token 告诉 policy “我要往哪里运动”。
这使 SONIC 从一个固定技能 controller,变成了一个:
latent-conditioned whole-body controller
PPO 本身并不是 SONIC 最核心的创新。它解决的是:
如何让机器人真的执行这个 latent 所代表的运动。
所以研究贡献层次大概应该这样排:
第一层:Universal representation
不同运动来源能否进入统一 latent?
↓
第二层:latent-conditioned control
同一个 controller 能否根据 latent 执行不同 motion?
↓
第三层:deployment interface
VLA 能否直接产生这个 latent?
↓
第四层:PPO
怎样把这个 latent 变成稳定的物理控制?
6.7 整个 SONIC 的真正闭环
现在把前五阶段全部压缩成一条链。
训练阶段
Motion Dataset
│
┌──────────┼──────────┐
▼ ▼ ▼
G1 Teleop SMPL
│ │ │
▼ ▼ ▼
E_g1 E_tele E_smpl
│ │ │
└──────────┼──────────┘
▼
latent h
│
FSQ
│
▼
Universal Token z
│
┌────────┴────────┐
▼ ▼
alignment decoder
│ │
│ ▼
│ 29-D action
│ │
└──────┐ │
▼ ▼
PPO / Isaac Lab
│
▼
G1 control
这里有两个学习目标:
Representation objective
Llatent L_{latent} Llatent
让:
G1 ≈ Teleop ≈ SMPL
Control objective
LPPO L_{PPO} LPPO
让:
token + state → physically valid action
最终:
L=LPPO+λLaux L = L_{PPO} + \lambda L_{aux} L=LPPO+λLaux
也就是前面看到的:
PPO loss
+
g1 reconstruction
+
latent alignment
+
cycle consistency
6.8 VLA 处于什么位置?
完整链路是:
VLA
│
78-D action interface
│
┌─────────┴─────────┐
│ │
64-D token 14-D hand
│ │
▼ ▼
SONIC decoder Dex3 interface
│
▼
29-D body action
│
▼
G1
因此 VLA 是:
VLA → motion abstraction
↓
SONIC
↓
whole-body control
这其实是一个非常有意义的系统分工:
VLA
负责:
“我要做什么动作?”
SONIC
负责:
“怎样让 G1 身体真的完成这个动作?”
Robot low-level control
负责:
“怎样把这个动作稳定地执行到电机?”
因此:
semantic intelligence
↓
motion representation
↓
whole-body control
↓
motor execution
这就是 SONIC 的系统价值。
6.9 目前架构的五个限制
这一部分非常重要,因为它直接决定你的研究方向。
限制 1:Universal Token 并不是天然 universal
当前:
SMPL
Teleop
G1
↓
SONIC checkpoint
它们共享的是某一个 checkpoint 学到的 latent space。
因此:
64-D token 并不是一个全机器人界通用标准。
换一个 SONIC checkpoint,token semantics 可能就发生变化。
所以:
zSONIC−A≠zSONIC−B z_{SONIC-A} \neq z_{SONIC-B} zSONIC−A=zSONIC−B
即使两者都是 64-D。
6.10 限制 2:VLA 必须学会这个 latent space
当前 deployment 的一个非常关键的事实:
VLA
↓
64-D motion token
↓
SONIC decoder
也就是说 VLA 输出的 token 必须和 SONIC decoder 所理解的 latent space 对齐。
所以这里实际上存在一个隐藏接口:
FVLA(o)→ZSONIC F_{VLA}(o) \rightarrow Z_{SONIC} FVLA(o)→ZSONIC
如果 VLA 和 SONIC 没有共同训练/对齐:
VLA token
≠
SONIC token
那么 decoder 就会收到一个“合法维度但错误语义”的 token。
这其实是整个架构里非常值得研究的问题:
如何稳定地学习 VLA → Universal Token 的跨模型接口?
6.11 限制 3:body 和 hand 现在仍然是两条路径
当前:
64 token
↓
SONIC
↓
29 body
而:
14 hand
↓
Dex3
因此整个系统还不是完全统一的:
body → latent-conditioned policy
hand → direct action interface
从研究角度看,这其实是一个很明显的 future work。
理想结构可能是:
VLA
│
▼
Universal whole-body latent
│
├── body
├── left hand
└── right hand
│
▼
unified controller
当然,这会显著增加训练难度。
6.12 限制 4:FSQ 本身可能造成 information bottleneck
现在:
h→z h\rightarrow z h→z
中间存在离散化。好处是 token 更容易成为上层接口。
但代价是:
I(h;z)<I(h;h) I(h;z)<I(h;h) I(h;z)<I(h;h)
也就是说 token 可能丢失一些 motion information。
于是会出现一个很值得研究的问题:
64-D FSQ token 到底是不是最优 bottleneck?
可以研究:
32-D
64-D
128-D
以及:
continuous latent
vs
FSQ latent
最终看:
motion reconstruction
control success
VLA alignment
latency
token robustness
之间的 trade-off。
6.13 限制 5:latent space 和 physical embodiment 仍然绑定
当前最终还是:
token
↓
G1 decoder
↓
29 body action
所以它虽然解决了:
SMPL / Teleop / G1
之间的 representation mismatch,
但还没有完全解决:
G1
Humanoid B
Humanoid C
Robot D
之间的 embodiment mismatch。
真正更进一步的 universal controller 应该考虑:
a=π(z,s,e) a = \pi(z,s,e) a=π(z,s,e)
其中:
- zzz:motion intent
- sss:robot state
- eee:embodiment information
这样:
same motion token
│
┌────┼────┐
▼ ▼ ▼
G1 H1 H2
理论上可以产生不同机器人对应的动作。
这就从:
Universal Token
进一步走向:
Universal Motion Representation + Embodiment-conditioned Controller
我认为这是一个非常自然的研究延伸。
6.14 如果沿这个方向做研究,我会优先考虑什么?
如果你的目标是把 SONIC 变成自己的研究起点,而不是单纯复现,我会按下面的优先级考虑。
Research Direction A:VLA → Universal Token 对齐
这是我认为最直接、最贴近当前系统的方向。
现在:
VLA
↓
64-D token
↓
SONIC
可以研究:
L=LVLA+λ1Ltoken+λ2Lcontrol L = L_{VLA} + \lambda_1 L_{token} + \lambda_2 L_{control} L=LVLA+λ1Ltoken+λ2Lcontrol
让 VLA 不仅学习:
language → action
而是学习:
language + vision
↓
universal motion token
↓
SONIC
核心问题:
VLA 是否可以把 Universal Token 当成一种新的 action representation?
这会直接连接:
VLA + representation learning + whole-body control
6.15 Research Direction B:学习更好的 Token
这是更偏 representation learning 的方向。
现在:
motion
↓
encoder
↓
FSQ
↓
64-D token
可以研究:
FSQ
VQ
continuous latent
hierarchical latent
temporal token
semantic token
例如把一个动作拆成:
z_global
+
z_local
或者:
z_intent
+
z_style
+
z_dynamics
这样可能得到:
“走过去”
+
“挥手”
+
“快一点”
这样的 compositional motion representation。
这比单纯增加 token dimension 更有研究价值。
6.16 Research Direction C:Temporal Token
当前 token 本质上还是当前控制时刻对应的 motion representation。
但机器人动作本质上是时间序列:
zt:t+H z_{t:t+H} zt:t+H
所以可以进一步研究:
single token
↓
token sequence
↓
temporal controller
例如:
zt,zt+1,...,zt+H z_t,z_{t+1},...,z_{t+H} zt,zt+1,...,zt+H
然后 policy 学:
at=π(st,zt:t+H) a_t=\pi(s_t,z_{t:t+H}) at=π(st,zt:t+H)
这会和当前 SONIC 的:
future reference frames
自然衔接。
尤其值得研究:
token horizon 到底应该多长?
当前 repo 的 default / low-latency 已经给了一个非常好的实验入口:
~200 ms
vs
~80 ms
这其实已经暗示:
latency 和 motion horizon 存在明显 trade-off。
6.17 Research Direction D:真正的 whole-body hand integration
现在:
29 body
+
14 hand
还是两个接口。
可以进一步研究:
z→{abody,ahand} z \rightarrow \{a_{body},a_{hand}\} z→{abody,ahand}
甚至:
z→a43 z\rightarrow a_{43} z→a43
统一输出。
更进一步:
same token
↓
body + hand
↓
contact-aware control
例如:
抓杯子
不应该只是:
arm trajectory
+
finger trajectory
而应该考虑:
hand contact
arm posture
torso balance
foot placement
这才是真正的 whole-body manipulation。
6.18 Research Direction E:Embodiment Generalization
这是更长期、也更有潜力的方向。
当前:
z→G1 z\rightarrow G1 z→G1
可以改成:
(z,s,e)→a (z,s,e)\rightarrow a (z,s,e)→a
例如:
Universal Token
│
┌──────────┼──────────┐
▼ ▼ ▼
G1 Robot B Robot C
│ │ │
▼ ▼ ▼
action action action
这样 Universal Token 真正成为:
robot-independent motion language
而不只是:
G1-specific latent interface。
6.19 总结
SONIC 压缩成一句研究逻辑:
SONIC 把异构运动表示压缩到一个共享的 Universal Token 空间,再学习一个 token-conditioned whole-body controller,使上层 VLA、motion generation、teleoperation 等系统能够通过统一的运动接口驱动机器人。
然后再展开:
┌── SMPL
├── Teleop
├── G1 motion
└── VLA
│
▼
Universal Token
64-D FSQ
│
▼
Token-conditioned Policy
│
PPO
│
▼
29-D G1 Body
│
┌──────┴──────┐
▼ ▼
arms/body hands
│ │
▼ ▼
G1 Dex3
6.20 核心结论
经过前面六个阶段,整个 repo 可以浓缩成这六句话:
① Universal Token 是 SONIC 的表示层。
不同 motion modality 经过不同 encoder,进入共享 latent/token 空间。
② FSQ 把这个 latent 变成一个适合系统接口的离散化表示。
当前核心配置是 2×32 = 64-D,不是 64 个 token ID。
③ PPO 学的是 token-conditioned controller。
π(a∣s,z) \pi(a|s,z) π(a∣s,z)
token 决定运动意图,state 决定当前机器人状态。
④ VLA 的 78-D action 不是机器人 78 个关节。
78
├── 64 motion token → SONIC → 29 body
└── 14 hand action → Dex3
其中 29-D body 已经包括双臂。
⑤ SONIC 的部署核心不是重新训练一个 C++ controller。
训练好的:
Universal Token + policy
被导出为 TensorRT/ONNX,在 50 Hz policy loop 中运行,再由 500 Hz command writer 发送到 G1。
⑥ token 中间层
不是 PPO 本身,也不只是 TensorRT 部署。真正值得追的是:
Motion / VLA→Universal Token→Whole-body Control \boxed{ \text{Motion / VLA} \rightarrow \text{Universal Token} \rightarrow \text{Whole-body Control} } Motion / VLA→Universal Token→Whole-body Control
也就是:
如何学习一个既能被 VLA 理解、又能被机器人控制器执行、同时还能跨 motion modality / embodiment 泛化的统一运动表示。
这其实已经从“复现 SONIC”自然走到了一个比较完整的研究问题。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)