【免费下载链接】Wheel-Legged-Gym
在Wheel-Legged-Gym(基于 Isaac Gym 的轮腿机器人强化学习环境)中,观测空间(Observation Space)的设计直接决定了训练出的策略能不能顺利部署到真实机器人。本文带你拆解这个项目的观测空间设计:27 维本体感知如何构成、为什么"故意藏掉"线速度、非对称训练中的特权观测、观测噪声注入,以及支撑真机迁移的域随机化配置。
为什么观测空间决定能否上真机
很多新手训练的四足/轮腿机器人在仿真里走得很好,一上真机就东倒西歪。原因往往不在算法,而在观测设计:
- 策略在仿真里"偷看"了真实传感器根本拿不到的信息(比如基座线速度);
- 观测没有加噪声,策略对传感器误差毫无鲁棒性;
- 没有动作延迟与域随机化,策略对执行器差异敏感。
Wheel-Legged-Gym 的观测方案正是冲着这些问题来的,下面逐项看。
27 维本体感知:策略到底"看"什么
Actor(策略网络)使用的观测由compute_proprioception_observations构建,总维度为 27(在 legged_robot_config.py 中由num_observations = 27定义)。以 wheel_legged_vmc 任务为例:
| 观测项 | 维度 | 缩放系数 | 说明 |
|---|---|---|---|
基座角速度base_ang_vel | 3 | 0.25 | IMU 可测,放在机身坐标系下 |
投影重力projected_gravity | 3 | 1 | 重力在机体坐标的投影,代替绝对姿态角 |
速度指令commands[:, :3] | 3 | 指令缩放 | 期望的 vx、vy、偏航角速度 |
腿部连杆角theta0/theta0_dot | 4 | 1 / 0.05 | VMC 统一运动表示下的连杆状态 |
虚拟杆长L0/L0_dot | 4 | 5 / 0.25 | VMC 统一运动表示下的杆长状态 |
| 轮关节位置/速度(2 个轮) | 4 | 1 / 0.05 | 编码器可测 |
上一时刻动作self.actions | 6 | — | 让策略"知道自己刚做了什么" |
💡 所有缩放系数都集中定义在 legged_robot_config.py 的
obs_scales中(如ang_vel = 0.25、dof_vel = 0.05),VMC 环境在 wheel_legged_vmc_config.py 中补充了l0 = 5.0、l0_dot = 0.25。缩放的目的就是让每项观测的数值量级接近 1,避免网络被大数值项主导。
VMC 环境的巧思:用统一变量替代关节角
VMC(Virtual Model Control)环境的核心思想,是用theta0/L0(连杆角与杆长)这组统一变量来描述腿部状态,而不是直接的关节角。这样在开链结构上训练的同一套观测格式,可以无缝迁移到闭链机构——观测定义见compute_proprioception_observations,而连杆量的计算来自每步物理步后的leg_post_physics_step中的正向运动学。
细节 1:故意不给策略"基座线速度"
对比基础环境的compute_proprioception_observations会发现一个反直觉的设计:base_lin_vel(基座线速度)被注释掉了,只保留了角速度。
为什么要藏掉它?因为真实机器人的 IMU 只能直接测角速度,线速度必须靠积分或外部估计,误差会随时间累积。如果训练时把精确线速度喂给策略,上真机后这项观测就"失真"了。
Wheel-Legged-Gym 的解法是:让网络自己从历史观测中学出来——
obs_history_length = 5(legged_robot_config.py):把最近 5 帧观测堆叠成 27×5 = 135 维输入;- 序列策略
ActorCriticSequence(actor_critic_sequence.py)用一个编码器把 135 维历史压缩成 3 维潜在向量(latent_dim = 3,注释写明"at least 3 to estimate base linear velocity"); - Actor 的输入 = 当前 27 维观测 + 3 维潜在变量(actor_critic_sequence.py)。
也就是说:策略不是"看不到"线速度,而是学会了从可测信息中估计它——这正是真机部署最需要的能力。
细节 2:非对称训练——Critic 看特权信息
在 wheel_legged_vmc_config.py 中,num_privileged_obs被设置为远超 27 的值(VMC 版本约 209 维)。compute_observations会在 Actor 观测之外额外拼接一批"特权"信息供 Critic(价值网络)使用:
| 特权观测项 | 维度 | 为什么 Actor 不能看 |
|---|---|---|
基座线速度base_lin_vel | 3 | 真机难以精确测量 |
关节加速度dof_acc | 6 | 仿真中用差分获得,真机噪声大 |
| 完整关节位置/速度 | 12 | 部分信息在开链/闭链间不对应 |
地形高度场heights | 187 | 机器人没有"透视地形"的传感器 |
关节力矩torques | 6 | 真机只能间接估计 |
| 随机化的质量/质心/摩擦/恢复系数 | 8 | 训练时的域随机化"答案" |
这种"Actor 只看可部署观测、Critic 看全量信息"的做法叫非对称训练(asymmetric actor-critic),训练循环中的分发逻辑见 on_policy_runner.py:critic_obs = privileged_obs if privileged_obs is not None else obs。部署时只需要保存 Actor + 编码器,特权部分自动"消失"。
细节 3:观测噪声——模拟真实传感器
legged_robot_config.py 默认开启add_noise = True,compute_observations会在每一步往观测里叠加均匀分布噪声,各项幅度由_get_noise_scale_vec决定。以基础 27 维布局为例:
| 观测段 | 噪声尺度 |
|---|---|
| 角速度 | 0.2 × 0.25 = 0.05 |
| 投影重力 | 0.05 |
| 速度指令 | 0(指令来自本机,不加噪) |
| 关节位置 | 0.01 |
| 关节速度 | 1.5 × 0.05 = 0.075 |
| 上一动作 | 0 |
VMC 环境在 wheel_legged_vmc.py 中按自己的观测顺序重写了该向量,并新增了l0 = 0.02、l0_dot = 0.1的噪声尺度——注释里特意提醒"note that observation noise need to be modified accordingly",说明作者把观测结构变更时同步维护噪声向量当作一条硬规矩。这一步让策略天然对 IMU 抖动和编码器毛刺免疫。
另外,所有观测和动作都会被clip_observations = 100.0/clip_actions = 100.0(legged_robot_config.py)截断,防止偶发仿真异常值污染训练。
细节 4:为真机做的"预演"——域随机化与动作延迟
上真机前,环境先把"机器人与地面的差异"提前练完。legged_robot_config.py 的domain_rand段包含:
- 摩擦系数随机化:
friction_range = [0.1, 2.0]; - 基座附加质量:
added_mass_range = [-2.0, 3.0]kg,质心偏移rand_com_vec = [0.05, 0.05, 0.05]; - PD 增益随机化 ±10%(
randomize_Kp/randomize_Kd),甚至覆盖 VMC 的kp_theta、kp_l0等(wheel_legged_vmc.py); - 电机力矩输出随机化 ±10%;
- 动作延迟:
delay_ms_range = [0, 10],每个环境随机抽取 0~10ms 的延迟,通过action_fifo队列实现(wheel_legged_vmc.py)——这正是真机上"指令下发 → 执行器响应"延迟的仿真版本。
这些随机化的"当前取值"(质量、摩擦、恢复系数、质心等)会被写进特权观测给 Critic 参考,而 Actor 只能靠观测去适应——训练完成时,策略就已经见过上千种"略有不同的真机"了。
细节 5:训练与部署流程
一切就绪后,训练和验证都很简单:
python wheel_legged_gym/scripts/train.py --task=wheel_legged_vmc_flat python wheel_legged_gym/scripts/play.py --task=wheel_legged_vmc_flat项目提供三个任务(注册在 envs/init.py):
| 任务 | 说明 |
|---|---|
wheel_legged | 开链结构,多种地形端到端训练 |
wheel_legged_vmc | 用 VMC 统一开链/闭链运动控制,便于迁移到闭链真机 |
wheel_legged_vmc_flat | 平地训练,显存占用低,适合验证观测/训练流程 |
训练出的策略只依赖"27 维本体感知 + 5 帧历史",全部是 IMU、编码器和指令就能提供的数据——这就是它能上真机的原因。
小结:观测空间设计的 5 条可复用经验
- 只给策略真机可测的观测:角速度、投影重力、关节状态、上一动作;
- 缺什么就"学"什么:用观测历史 + 编码器隐式估计基座线速度(
latent_dim = 3); - 特权信息只给 Critic:地形高度场、线速度、力矩等仿真独占数据走非对称通道;
- 观测加噪 + 截断:噪声向量和观测结构同步维护,
clip兜底防异常; - 域随机化 + 动作延迟:把真机的执行器与地面差异提前"喂"给策略。
相关文件索引
| 文件 | 内容 |
|---|---|
| wheel_legged_gym/envs/wheel_legged_vmc/wheel_legged_vmc.py | VMC 环境实现:观测构建、噪声向量、VMC 控制 |
| wheel_legged_gym/envs/base/legged_robot.py | 基础环境:本体感知、特权观测、高度采样 |
| wheel_legged_gym/envs/base/legged_robot_config.py | 观测维度、缩放、噪声、域随机化等基础配置 |
| wheel_legged_gym/envs/wheel_legged_vmc/wheel_legged_vmc_config.py | VMC 环境特有配置 |
| wheel_legged_gym/rsl_rl/modules/actor_critic_sequence.py | 序列策略:历史编码器 + 非对称 Actor/Critic |
| wheel_legged_gym/rsl_rl/runners/on_policy_runner.py | 训练循环中观测的分发 |
| wheel_legged_gym/utils/task_registry.py | 任务注册机制 |
掌握了这套观测设计,你再为自己的轮腿或足式机器人项目配置观测空间时,就不会掉进"仿真满分、真机翻车"的坑了。
【免费下载链接】Wheel-Legged-Gym
相关推荐
盘点Wheel-Legged-Gym的20+奖励函数:如何设计一个稳健的轮腿行走奖励
盘点Wheel Legged Gym的20+奖励函数:如何设计一个稳健的轮腿行走奖励 Wheel Legged Gym 是基于 Isaac Gym 构建的 轮腿
downkyi B站视频下载神器完整始末:为什么它被一封律师函永久关停
downkyi B站视频下载神器完整始末:为什么它被一封律师函永久关停 从支持 8K、HDR、杜比视界的哔哩哔哩视频下载工具,到一封律师函后的永久关停——dow
Dism++ 完整指南:磁盘清理、系统备份与离线补丁的免安装 Windows 系统维护方案
Dism++ 完整指南:磁盘清理、系统备份与离线补丁的免安装 Windows 系统维护方案 C 盘又红了,这次不是缓存的事,而是上次系统升级留下的一整套旧系统备
文档后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考