四足机器人强化学习中的隐变量 Latent:从压缩表征到在线适应

写在前面:为什么四足 RL 里总会出现 latent?

在四足机器人强化学习论文和代码里,经常会看到这些说法:

  • latent vector
  • latent representation
  • terrain latent
  • privileged latent
  • adaptation latent
  • style latent
  • task embedding
  • history encoder output

这些词看起来都叫 latent,但它们并不完全是同一个东西。有的 latent 是为了压缩观测,有的是为了估计看不见的环境参数,有的是为了把 teacher policy 的特权信息传给 student policy,还有的是为了表达不同步态、不同任务或不同运动风格

我现在先把 latent 理解成一句话:

latent 是神经网络中间学出来的一小段向量,它不直接等于某个传感器读数,但里面浓缩了对控制有用的信息。

在四足机器人强化学习里,它的核心价值通常不是“玄学地变聪明”,而是解决一个很工程的问题:

机器人真机上能看到的信息不完整,但控制又需要知道地形、摩擦、负载、速度误差、接触状态等隐藏因素,所以我们需要一个紧凑的内部变量,把这些对控制有用但不一定能直接测量的东西表示出来。


一句话结论

四足 RL 里的 latent,本质上是策略网络学出来的“内部状态摘要”:它把历史观测、特权信息、地形信息、任务信息或运动风格压缩成一个低维向量,供 policy 更稳定地输出动作。

如果写成最简单的形式:

zt=fϕ(otk:t)z_t = f_\phi(o_{t-k:t})

at=πθ(ot,zt)a_t = \pi_\theta(o_t, z_t)

其中:

  • oto_t:当前观测,比如 IMU、关节角、关节速度、上一帧动作、速度命令。
  • otk:to_{t-k:t}:一段历史观测。
  • fϕf_\phi:encoder,把历史或额外信息压缩成 latent。
  • ztz_t:latent vector。
  • πθ\pi_\theta:控制策略。
  • ata_t:输出动作,比如关节目标位置。

可以直观理解成:

最近一段机器人运动表现 / 地形反馈 / 接触反馈
↓ encoder
latent:现在地面大概滑不滑?腿是不是踩空?负载是不是变了?
↓ policy
更合适的关节动作

1. latent 到底是什么?

latent variable 通常翻译为“隐变量”。“隐”不是说它神秘,而是说它不是我们直接观测到的原始量。

比如真实世界里,机器人脚下地面的摩擦系数 μ\mu 很重要:

  • 摩擦大,可以更激进地蹬地。
  • 摩擦小,动作太猛容易打滑。
  • 地面软,脚接触后的反馈和硬地不一样。

但真机部署时,机器人通常没有一个传感器直接告诉你:

当前地面摩擦系数 = 0.63
当前地面刚度 = 12000 N/m
当前机器人背上多了 1.5 kg 负载

这些变量对控制很重要,却不一定能直接测出来。于是网络可以从历史运动里推断:

  • 同样的动作发出去,机身速度是不是变慢了?
  • 脚端是否发生打滑?
  • 机身姿态是否比预期更晃?
  • 关节速度和接触状态是否异常?

这些信息经过一个 encoder 压缩后,就形成 latent。

所以 latent 可以看成一种“内部估计”:

zt机器人根据历史观测推断出来的隐藏环境与自身状态z_t \approx \text{机器人根据历史观测推断出来的隐藏环境与自身状态}

它不一定有明确单位,也不一定每一维都能解释,但整体上对控制有帮助。


2. 为什么四足机器人特别需要 latent?

四足 locomotion 有几个特点,使得 latent 很常见。

2.1 真实状态不可完全观测

理论上的 MDP 假设 state sts_t 能完整描述系统。但真机上的 policy 通常只能拿到 observation oto_t

完整状态里可能有:

st={q,q˙,pbase,Rbase,vbase,ωbase,c,μ,m,terrain,motor,delay,}s_t=\{q,\dot q, p_{base}, R_{base}, v_{base}, \omega_{base}, c, \mu, m, terrain, motor, delay, \cdots\}

但实际观测可能只有:

ot={q,q˙,Rbase,ωbase,command,at1}o_t=\{q,\dot q, R_{base}, \omega_{base}, command, a_{t-1}\}

很多关键量缺失了:

  • 线速度可能没有精确测量。
  • 接触状态可能有噪声。
  • 摩擦系数未知。
  • 地形高度未知。
  • 电机延迟和模型误差未知。
  • 机身负载变化未知。

这时问题就从标准 MDP 变成更接近 POMDP:Partially Observable Markov Decision Process,部分可观测马尔可夫决策过程。

latent 的一个重要作用,就是帮助 policy 在部分可观测情况下补足信息。

2.2 四足控制依赖历史

单帧观测经常不够。

例如,机器人当前 base pitch 有一点变化,单看这一帧很难判断:

  • 是刚踩到上坡?
  • 是脚打滑?
  • 是上一帧动作太猛?
  • 是背上负载变了?
  • 还是正常 gait 周期中的姿态波动?

但如果看最近几十帧,就能更容易推断发生了什么。

所以很多方法会使用 history encoder:

zt=fϕ(otH,otH+1,,ot)z_t = f_\phi(o_{t-H}, o_{t-H+1}, \ldots, o_t)

这个 ztz_t 就像是从历史中提炼出来的“运动上下文”。

2.3 sim-to-real 需要适应未知差异

仿真训练时,我们可以 domain randomization:

  • 随机质量
  • 随机摩擦
  • 随机电机强度
  • 随机地形
  • 随机延迟
  • 随机外力扰动

在仿真中,这些参数是已知的,甚至可以作为 privileged information 给 teacher policy。

但真机上,这些参数不可直接获得。于是常见做法是:

  1. teacher 在训练时看到 privileged information。
  2. student 在部署时不能看 privileged information。
  3. student 通过历史观测预测一个 latent。
  4. 这个 latent 尽量模仿 teacher 用到的隐藏信息。

这样就把“训练时知道、部署时不知道”的信息,通过 latent 桥接起来。


3. 四足 RL 中常见的 latent 类型

下面按用途把 latent 分几类。实际论文中它们经常混在一起。


3.1 Observation latent:压缩高维观测

最朴素的一类 latent,是把高维输入压缩成低维特征。

例如有些 policy 会输入高度图、深度图、点云或者大量历史帧。如果直接把所有原始数据塞给 policy,维度太大、训练不稳定、部署也重。

于是先用 encoder:

zt=fϕ(xt)z_t = f_\phi(x_t)

再让 policy 使用:

at=πθ(ot,zt)a_t = \pi_\theta(o_t, z_t)

这里的 xtx_t 可能是:

  • height map
  • depth image
  • scan points
  • proprioceptive history
  • contact history

这种 latent 的主要作用是:

  • 降维
  • 去噪
  • 提取控制相关特征
  • 减少 policy 主干网络负担

可以把它理解成“感知特征摘要”。


3.2 Terrain latent:地形表征

四足机器人走复杂地形时,policy 需要知道脚下和前方地形。

地形信息可能来自:

  • 仿真中的 height field
  • 深度相机
  • 激光雷达
  • 足端触觉和接触反馈
  • 本体历史观测推断

terrain latent 的目标是把复杂地形压缩成对 locomotion 有用的向量:

ztterrain=fϕ(terrain observation)z_t^{terrain}=f_\phi(terrain\ observation)

这个 latent 可能编码:

  • 前方是否有台阶
  • 地面是否倾斜
  • 落脚区域是否崎岖
  • 当前是否在上坡/下坡
  • 脚下是否容易打滑

注意,terrain latent 不一定等于完整地图。对控制来说,它只需要包含“足够影响动作选择”的信息。

例如 policy 不一定需要知道前方每一个点的精确高度,它只需要知道:

  • 下一步抬腿要不要更高?
  • 身体重心要不要前移?
  • 步幅要不要变小?
  • 是否要降低速度?

3.3 Privileged latent:特权信息的压缩

这是四足 RL 里非常重要的一类。

训练时,仿真器知道很多真机部署时不知道的信息:

  • ground truth base linear velocity
  • foot contact force
  • terrain height samples
  • friction coefficient
  • payload mass
  • motor strength
  • external disturbance
  • domain randomization parameters

这些信息叫 privileged information。

teacher policy 可以使用:

at=πteacher(ot,pt)a_t = \pi_{teacher}(o_t, p_t)

其中 ptp_t 是 privileged information。

但 student policy 部署到真机时不能依赖 ptp_t,所以常见做法是把 ptp_t 压成一个 privileged latent:

ztpriv=gψ(pt)z_t^{priv}=g_\psi(p_t)

然后训练 student 从历史观测预测它:

z^tpriv=fϕ(otH:t)\hat z_t^{priv}=f_\phi(o_{t-H:t})

最终部署时:

at=πstudent(ot,z^tpriv)a_t = \pi_{student}(o_t, \hat z_t^{priv})

这类结构的关键思想是:

训练时让网络知道答案,部署时让网络从历史里猜出答案。

它不是为了让 student 完美恢复所有物理参数,而是为了恢复对控制有用的那部分信息。


3.4 Adaptation latent:在线适应环境

adaptation latent 和 privileged latent 很接近,但更强调在线适应。

机器人部署时,环境可能一直在变:

  • 从水泥地走到草地
  • 从平地走到碎石
  • 被人推了一下
  • 脚底打滑
  • 关节性能变差
  • 背上负载变化

adaptation module 会根据最近一段历史输出 latent:

ztadapt=fϕ(otH:t,atH:t1)z_t^{adapt}=f_\phi(o_{t-H:t}, a_{t-H:t-1})

policy 根据这个 latent 调整动作:

at=πθ(ot,ztadapt)a_t=\pi_\theta(o_t,z_t^{adapt})

如果没有 adaptation latent,policy 可能只能学到一个“平均策略”:在所有随机环境里都勉强能走,但遇到具体变化时不够敏感。

有了 adaptation latent,policy 可以表现得更像:

刚才同样的蹬地动作没有带来预期速度 → 可能地面软/滑 → 降低蹬地强度,调整步态

或者:

机身响应变慢,关节负载变大 → 可能背上有负载 → 改变姿态和力分配

3.5 Skill latent / Gait latent:表示不同技能或步态

有些 latent 不表示环境,而表示“要执行什么风格的运动”。

例如:

  • trot
  • pace
  • bound
  • pronk
  • crawl
  • jump
  • climb
  • recovery

可以用一个 latent 控制 gait 或 skill:

at=πθ(ot,zskill)a_t = \pi_\theta(o_t, z^{skill})

不同的 zskillz^{skill} 对应不同运动模式。

这类 latent 常用于:

  • 多技能策略
  • 模仿学习
  • 运动风格控制
  • hierarchical RL
  • command-conditioned policy

它有点像连续版的“模式选择开关”。

传统状态机可能会显式写:

if mode == trot:
use trot controller
elif mode == climb:
use climb controller

而 skill latent 更像:

z = 某种运动风格的连续编码
policy 根据 z 自己生成对应动作

好处是不同技能之间可以平滑插值;坏处是可解释性更弱。


3.6 Task latent:表示任务目标

如果一个 policy 要处理多个任务,也可能使用 task latent。

例如同一个机器人既要:

  • 跟踪速度命令
  • 爬楼梯
  • 越障
  • 推箱子
  • 站立保持
  • 恢复摔倒

可以把任务编码成 latent:

ztask=e(task)z^{task}=e(task)

再输入 policy。

在简单 locomotion 里,速度命令 vx,vy,ωzv_x, v_y, \omega_z 本身就是一种任务条件。但在更复杂的 whole-body control 或 loco-manipulation 中,task latent 会更有意义。


4. 一个典型结构:teacher-student + latent adaptation

四足 RL 里很常见的结构可以画成这样:

训练阶段:

privileged info ─────┐

privileged encoder

privileged latent

observation ───→ teacher / actor ───→ action

同时训练:

observation history ─→ adaptation encoder ─→ predicted latent

└── 模仿 privileged latent

部署阶段:

observation history ─→ adaptation encoder ─→ latent

current observation ─────────────────────→ policy ─→ action

这个结构解决的问题是:

  • 训练时可以利用仿真的完整信息,让策略学得更稳。
  • 部署时不依赖仿真专有信息,只用真机可获得的历史观测。
  • latent 成为 teacher 和 student 之间的信息桥梁。

一个简化的 loss 可以写成:

L=LRL+λz^tztpriv2\mathcal{L}=\mathcal{L}_{RL}+\lambda \|\hat z_t - z_t^{priv}\|^2

其中:

  • LRL\mathcal{L}_{RL}:强化学习目标。
  • ztprivz_t^{priv}:由 privileged information 得到的 latent。
  • z^t\hat z_t:student/adaptation module 预测的 latent。
  • λ\lambda:模仿 latent 的权重。

当然,不同论文实现会不一样。有些直接模仿 action,有些模仿 value,有些模仿 latent,有些用 asymmetric actor-critic,有些用 reconstruction 或 contrastive learning。


5. latent 和普通 observation stacking 有什么区别?

一个容易混淆的问题:既然可以把历史观测直接堆起来,为什么还要 latent?

例如直接输入:

[ot5,ot4,,ot][o_{t-5}, o_{t-4}, \ldots, o_t]

不也能让 policy 看到历史吗?

区别在于:

5.1 observation stacking 是原始历史

它只是把最近几帧拼接起来。

优点:

  • 简单
  • 稳定
  • 容易实现

缺点:

  • 维度变大
  • 信息冗余
  • 难以处理长历史
  • policy 主干网络负担更重

5.2 latent 是历史的压缩解释

latent encoder 会把历史压缩成一个更小的向量:

zt=f(otH:t)z_t=f(o_{t-H:t})

它试图提取:

  • 哪些变化对控制有用
  • 哪些噪声可以忽略
  • 当前环境更像哪种 domain
  • 当前身体响应是否异常

所以 latent 更像“总结后的上下文”。

简单说:

observation stacking:把历史原样交给 policy
latent:先读历史,提炼重点,再交给 policy

6. latent 的维度怎么选?

latent 维度是一个工程超参数。

常见范围可能是:

  • 8
  • 16
  • 32
  • 64
  • 128

维度太小:

  • 信息瓶颈太强
  • 难以表达复杂地形或动态变化
  • policy 可能学不到足够上下文

维度太大:

  • 容易冗余
  • 可能过拟合仿真细节
  • 部署时更难稳定
  • 可解释性更差

我目前的经验性理解是:

latent 维度不应该追求大,而应该追求“刚好够 policy 做决策”。

如果 latent 是 adaptation latent,很多时候几十维已经够用。因为它不需要重建整个世界,只需要表达影响控制的隐藏因素。


7. latent 一定可解释吗?

不一定。

这是 latent 最容易让人误会的地方。我们可能希望:

z[0] = 摩擦系数
z[1] = 地面坡度
z[2] = 负载质量
z[3] = 左前脚接触可靠性

但神经网络自己学出来的 latent 通常不会这么整齐。

它可能是分布式表示:

  • 某几个维度共同表示地面滑不滑。
  • 某个维度同时和速度误差、负载、坡度相关。
  • 某些维度没有明显人类语义,但对控制有用。

所以 latent 的解释要谨慎。

可以做一些分析:

  • 改变摩擦系数,看 latent 是否规律变化。
  • 改变负载,看 latent 的轨迹是否分组。
  • 用 t-SNE / PCA 可视化不同地形下的 latent。
  • 对 latent 做 ablation,看哪些维度影响最大。
  • 用线性 probe 预测物理参数,看 latent 中是否包含这些信息。

但不能简单地把每一维都强行解释成一个物理量。


8. latent 在代码里通常长什么样?

一个非常简化的 PyTorch 结构可能像这样:

class AdaptationModule(nn.Module):
def __init__(self, obs_dim, history_len, latent_dim):
super().__init__()
self.encoder = nn.Sequential(
nn.Linear(obs_dim * history_len, 256),
nn.ELU(),
nn.Linear(256, 128),
nn.ELU(),
nn.Linear(128, latent_dim),
)

def forward(self, obs_history):
# obs_history: [batch, history_len, obs_dim]
x = obs_history.reshape(obs_history.shape[0], -1)
z = self.encoder(x)
return z


class Actor(nn.Module):
def __init__(self, obs_dim, latent_dim, action_dim):
super().__init__()
self.policy = nn.Sequential(
nn.Linear(obs_dim + latent_dim, 256),
nn.ELU(),
nn.Linear(256, 256),
nn.ELU(),
nn.Linear(256, action_dim),
)

def forward(self, obs, latent):
x = torch.cat([obs, latent], dim=-1)
action = self.policy(x)
return action

部署时大概就是:

z = adaptation_module(obs_history)
action = actor(obs, z)

如果是 teacher-student,还可能有:

z_priv = privileged_encoder(privileged_obs)
z_pred = adaptation_module(obs_history)
latent_loss = mse_loss(z_pred, z_priv.detach())

实际工程里还会加上 normalization、clip、recurrent network、CNN、Transformer、TCN 等结构。


9. latent 和 RNN / LSTM 的关系

RNN、LSTM、GRU 也会维护一个 hidden state:

ht=RNN(ot,ht1)h_t = \text{RNN}(o_t, h_{t-1})

这个 hidden state 本身也可以看成一种 latent。

区别在于:

  • 有些 latent 是显式 encoder 输出的,比如 history encoder。
  • 有些 latent 是 recurrent policy 内部的 hidden state。
  • 有些 latent 有额外监督,比如模仿 privileged latent。
  • 有些 latent 完全由 RL 目标自己学出来。

在四足 RL 里,显式 history encoder 很常见,因为它部署简单、并行训练方便,也比 RNN 更容易导出和调试。

但如果任务需要长期记忆,比如复杂导航、长时间接触历史、盲走复杂地形,RNN hidden state 也有优势。


10. latent 的几个常见坑

10.1 latent 学成了仿真捷径

如果训练时 privileged information 给得太直接,网络可能依赖仿真里才有的捷径。

例如 teacher 使用了非常干净的接触力或地形信息,而 student 在真机上很难从噪声观测里恢复,最后 sim-to-real 反而变差。

所以 privileged latent 要注意:

  • 不要让 student 学一个真机不可推断的东西。
  • privileged 信息最好和历史观测存在可学习关联。
  • 需要足够 domain randomization 和噪声建模。

10.2 latent 维度太大,policy 偷懒

latent 维度太大时,policy 可能过度依赖 latent,而忽略当前观测。

一旦 latent 在真机上预测不准,动作就会崩。

可以考虑:

  • 降低 latent dim
  • 给 latent 加噪声
  • dropout
  • 限制 privileged information
  • 做 ablation:去掉 latent 后性能下降是否合理

10.3 latent 没有时间平滑

如果 latent 每一帧跳变太大,policy 输出也可能抖。

可以检查:

  • latent 曲线是否平滑
  • 相似地形下 latent 是否稳定
  • 突变是否对应真实事件,比如打滑、撞击、落脚失败

必要时可以加:

  • temporal smoothing
  • recurrent encoder
  • latent regularization
  • history window 调整

10.4 latent 可解释性被高估

latent 很有用,但不要把它神化。

它不是一个自动获得物理真理的模块。它只是一个为了控制目标优化出来的中间表示。

判断 latent 好不好,最终还是看:

  • policy 是否更稳
  • sim-to-real 是否更好
  • 对扰动是否更鲁棒
  • 在未见地形上是否泛化
  • 去掉或扰动 latent 后性能如何变化

11. 读论文时可以这样看 latent

以后看到一篇四足 RL 论文里出现 latent,我会先问这几个问题:

11.1 latent 的输入是什么?

它来自:

  • 当前 observation?
  • 历史 observation?
  • privileged information?
  • 地形图?
  • 深度图?
  • 任务 command?
  • motion reference?

11.2 latent 的目标是什么?

它是为了:

  • 压缩感知?
  • 估计环境?
  • 模仿 teacher?
  • 表示技能?
  • 做在线适应?
  • 做多任务条件控制?

11.3 latent 怎么训练?

常见方式:

  • 只靠 RL reward 端到端训练
  • supervised learning 模仿 privileged variables
  • distillation 模仿 teacher latent/action
  • reconstruction loss
  • contrastive loss
  • variational objective,比如 VAE
  • auxiliary prediction,比如预测速度、摩擦、地形类别

11.4 latent 部署时是否可获得?

这是最重要的问题。

如果部署时还需要仿真器提供的 privileged information,那就不是真正可部署的方案。

要看清楚:

  • 训练时用了什么?
  • 测试时用了什么?
  • 真机部署时用了什么?
  • 有没有把 teacher 信息蒸馏到 student?

11.5 latent 对性能的贡献有没有验证?

最好有 ablation:

  • no latent
  • different latent dim
  • no privileged supervision
  • no history encoder
  • different history length
  • real-world test
  • unseen terrain test

如果没有 ablation,就很难判断 latent 是真正关键,还是只是网络结构里的一个普通中间层。


12. 和四足 locomotion 结合起来的直觉例子

假设一个四足机器人正在跟踪速度命令:

command=(vx=1.0,vy=0,ωz=0)command = (v_x=1.0, v_y=0, \omega_z=0)

也就是向前走 1 m/s。

policy 当前能看到:

  • 关节角
  • 关节速度
  • IMU 姿态和角速度
  • 上一帧动作
  • 速度命令

但它不知道地面摩擦。

现在机器人从高摩擦地面走到低摩擦地面。单帧观测未必立刻明显,但历史里会出现:

  • 同样动作下,前进速度变小。
  • 脚端相对机身运动异常。
  • 机身 pitch/roll 扰动增加。
  • stance phase 接触反馈不稳定。

history encoder 看到这些变化后,输出 latent:

z_adapt ≈ 当前环境更滑,动作响应变弱

policy 收到这个 latent 后,可能学会:

  • 减小水平蹬地冲击
  • 增加稳定性相关动作
  • 调整步频和步幅
  • 避免过激速度追踪

这就是 latent 在控制里的实际价值:不是为了好看,而是为了让同一个 policy 能根据隐藏环境变化调整行为。


13. latent 和 domain randomization 的关系

domain randomization 是训练时随机化环境参数,latent adaptation 是让策略识别当前大概处在哪个 domain。

可以这样理解:

domain randomization:训练时让机器人见过很多种世界
latent adaptation:部署时让机器人判断现在更像哪一种世界

如果只有 domain randomization,没有 adaptation,policy 可能学到一个平均鲁棒策略。

如果加上 latent adaptation,policy 可以更条件化:

at=π(ot,ztdomain)a_t = \pi(o_t, z_t^{domain})

同样一个观测 oto_t,在不同 latent 下可以输出不同动作。

这对 sim-to-real 很重要,因为真实世界不可能和仿真完全一致。latent 给了 policy 一个“调参旋钮”,让它能在线适应差异。


14. latent 和 VAE 的关系

有些文章会用 VAE,也就是 Variational Autoencoder。

VAE 里的 latent 通常写成:

zqϕ(zx)z \sim q_\phi(z|x)

然后 decoder 尝试重建:

x^=pθ(xz)\hat x = p_\theta(x|z)

在机器人里,VAE latent 可以用于:

  • 压缩高维运动数据
  • 学习动作 primitive
  • 表示运动风格
  • 从专家数据中学习 skill embedding
  • 做生成式运动控制

VAE latent 的特点是通常会对 latent 分布加约束,例如接近标准正态分布:

LVAE=Lrecon+βDKL(qϕ(zx)p(z))\mathcal{L}_{VAE}=\mathcal{L}_{recon}+\beta D_{KL}(q_\phi(z|x)||p(z))

这样 latent 空间更连续,更适合采样和插值。

但在很多四足 locomotion policy 里,latent 不一定是 VAE 的 latent。它可能只是普通 MLP encoder 的输出。

所以看到 latent 这个词时,不要自动等同于 VAE。


15. 我自己的理解总结

现在我对四足强化学习中的 latent 有几个层次的理解:

第一层:latent 是中间特征

这是最基础的理解。

神经网络把输入变成一段向量,这段向量再参与控制。

第二层:latent 是信息瓶颈

它强迫网络把复杂历史和高维感知压缩成对动作有用的少量信息。

第三层:latent 是隐藏状态估计

在部分可观测环境中,latent 帮助 policy 推断看不见的因素,比如地面、负载、摩擦、扰动。

第四层:latent 是 teacher-student 的桥

训练时利用 privileged information,部署时用历史观测预测对应 latent,从而提升 sim-to-real。

第五层:latent 是条件控制接口

不同地形、任务、技能、风格都可以通过 latent 条件化 policy,让一个策略覆盖更多行为。


16. 最后用一句话记住

四足 RL 里的 latent,不是一个固定物理量,而是 policy 为了更好控制机器人而学出来的内部上下文。它可以来自历史、地形、特权信息或任务条件;它的价值在于把不可直接观测但对动作有用的信息,压缩成 policy 能使用的向量。

如果以后读代码看到:

latent = encoder(obs_history)
action = actor(torch.cat([obs, latent], dim=-1))

我会先把它翻译成:

网络先根据最近的运动历史判断“现在是什么情况”,
再根据当前观测和这个判断输出动作。

这就是 latent 在四足机器人强化学习里最核心的意义。

3d打印 ai辅助设计 algorithms apriltag axis-angle bang-bang blender bode cadquery calibration camera calibration chrome cmake cmakelists cnn colcon conan control cpp cpu d435i data_struct db design-pattern dots economics eigen factory-pattern fcpx fiducial marker figure finance forge fov freecad gazebo gdb git gnu ibus interest isaac gym isaac lab isaaclab kdl latent variable latex launch learning-notes legged locomotion legged robotics legged-robot life linux linux-kernel mac math matlab matrix memory mlp money motion-control motor moveit mpc mujoco network ocs2 ode openscad operator optimal algorithm optimal-control perf performance personal-finance ppo privileged learning profiling python qos quadrotor realsense reinforcement learning representation learning reward tuning rnn robot robotics ros ros2 rtb security shell sim-to-real simulation socket stairs stl tcp-ip teacher policy thread tools twist ubuntu uml unitree urdf vae valgrind vcxsrv velocity vim web wifi work wsl 中文输入 交叉编译 依赖管理 分支管理 四足机器人 实验诊断 强化学习 机器人 机器人控制 机器人视觉 构建系统 深度学习 深度相机 点云 版本控制 神经网络 自主回充 视觉定位 训练曲线 输入法 配置类 飞控
知识共享许可协议