环境状态与策略观测
仿真程序能读取机器人许多内部量,但策略只接收任务提供的观测。本篇说明如何选择和组织输入,并建立一份训练与部署都能核对的观测约定。
1. 环境状态与策略观测
Section titled “1. 环境状态与策略观测”状态 描述系统当前情况;在马尔可夫建模中,希望它包含预测后续转移所需的信息。观测 是策略实际获得的信息,可以表示为 ,并可能加入噪声或历史。 表示任务指令。
机器人模型的位置、速度和接触量不一定就是完整任务状态;执行器内部状态、延迟缓存或任务阶段也可能影响未来。工程中的“state”字段应按实现理解,不能仅凭名称判断是否满足马尔可夫性。
| 信息 | 可能用途 | 部署时的来源问题 |
|---|---|---|
| 关节角与角速度 | 策略观测、奖励、控制 | 编码器、驱动反馈或估计 |
| 机身角速度与倾斜 | 策略观测、姿态约束 | IMU 与姿态估计 |
| 机身线速度真值 | 奖励、评价、特权输入,也可用于某些策略 | 实机通常需要估计 |
| 接触、摩擦或外部扰动参数 | 评价或特权输入 | 不一定能直接测得 |
特权观测是训练时额外可用的信息。例如非对称 Actor-Critic 可以让价值网络使用更丰富的输入,而部署的 Actor 只使用可获得的观测。具体是否这样设计,要看算法和任务;不能将仿真真值一概排除,也不能默认部署端都能提供。
2. 观测向量的组成与维度
Section titled “2. 观测向量的组成与维度”以下为本文约定的单帧输入,适用于十二关节的位置偏移示例。它不是 legged_gym 或 mjlab 的通用默认配置。
| 索引(含首尾) | 观测项 | 维数 | 含义与约定 |
|---|---|---|---|
| 0–2 | 速度指令 | 3 | 前进、侧向速度及偏航角速度 |
| 3–5 | 机身角速度 | 3 | 机身坐标系,rad/s,随后缩放 |
| 6–8 | 重力方向投影 | 3 | 单位重力方向在机身坐标系中的表示 |
| 9–20 | 关节位置偏移 | 12 | 当前角度减默认角度,rad |
| 21–32 | 关节速度 | 12 | 与动作相同的关节顺序,rad/s |
| 33–44 | 上一次动作 | 12 | 本例约定为上次裁剪后、缩放前的动作 |
总维数为 。如果再加入三维线速度,维数变成 48;如果使用最近四帧完整观测,输入维数为 。其他项目也可能只为部分输入保留历史。
上一次动作的定义必须明确:网络原始输出、裁剪后的动作、关节目标不是同一个量。表中的约定需要在训练与部署两端一致实现。
3. 坐标变换与重力方向投影
Section titled “3. 坐标变换与重力方向投影”设 将机身坐标系中的向量旋转到世界坐标系,世界系单位重力方向为 ,则:
它能反映机身倾斜,但不能提供绕重力方向的绝对航向信息。若任务需要绝对航向,应通过其他信息或目标误差提供。
四元数分量顺序、旋转方向和机身轴向都需记录。验证时可以构造水平和已知倾斜姿态,检查投影方向;不能只凭得到三个有限数值就判定正确。
4. 观测缩放、噪声建模与数值裁剪
Section titled “4. 观测缩放、噪声建模与数值裁剪”一种示意处理方式是:
是原始物理量, 是以相同单位定义的噪声, 是缩放系数, 是裁剪界限。也有实现先缩放再加噪声,此时噪声量级应对应缩放后的空间。
例如关节速度为 10 rad/s、缩放系数为 0.05 时,无噪声的输入值为 0.5。缩放不改变物理速度,只改变网络看到的数值。运行均值方差归一化又是另一种处理,需要保存并复用相关统计量。
噪声应针对有意义的观测项设置。任务指令和过去输出的动作并非传感器读数,不应不加区分地添加相同噪声。裁剪可以限制异常输入,但大量数值持续被裁剪,往往说明量级或状态存在问题。
5. 观测历史与回合初始化
Section titled “5. 观测历史与回合初始化”历史观测为推断速度、接触和动态响应提供线索,但不能保证消除全部部分可观测性。必须约定帧顺序、采样周期和初始化方式。
回合重置时,可以清零历史,也可以用初始观测填充,选择应与训练设计一致。不能把上一回合摔倒前的历史带入新回合;循环网络的隐藏状态同样需要按结束的环境重置。
6. 观测向量的构建流程
Section titled “6. 观测向量的构建流程”下面只表达数据处理关系,不对应具体框架 API:
# 各项具有相同的环境批量维 N;scale 是各项约定的缩放。obs = concatenate([ command * command_scale, angular_velocity_body * angular_scale, gravity_direction_body, (joint_position - default_position) * position_scale, joint_velocity * velocity_scale, previous_processed_action,], axis=-1)assert obs.shape == (num_envs, 45)实际实现还应核对数据时刻、噪声、裁剪和历史。形状检查只能发现维度错误,无法发现左右腿交换或坐标系颠倒。
给定水平姿态、零速度、关节位于默认角度、前一动作全零的状态,手工写出这份观测中哪些段应为零,哪些仍包含指令或重力信息。再改变一个关节角,检查是否只有对应位置段发生预期变化。
为什么策略加载成功却表现异常? 对照同一组原始状态,逐段比较训练端与部署端预处理后的向量,优先检查顺序、单位、坐标系和历史。
是否一定要加入机身线速度? 取决于方案。可以提供估计值,也可以让策略或辅助模块利用历史推断;需要明确训练与部署各自采用什么来源。
下一篇:策略动作与关节控制。