跳转到内容

环境状态与策略观测

仿真程序能读取机器人许多内部量,但策略只接收任务提供的观测。本篇说明如何选择和组织输入,并建立一份训练与部署都能核对的观测约定。

状态 sts_t 描述系统当前情况;在马尔可夫建模中,希望它包含预测后续转移所需的信息。观测 oto_t 是策略实际获得的信息,可以表示为 ot=h(st,ct)o_t=h(s_t,c_t),并可能加入噪声或历史。ctc_t 表示任务指令。

机器人模型的位置、速度和接触量不一定就是完整任务状态;执行器内部状态、延迟缓存或任务阶段也可能影响未来。工程中的“state”字段应按实现理解,不能仅凭名称判断是否满足马尔可夫性。

信息可能用途部署时的来源问题
关节角与角速度策略观测、奖励、控制编码器、驱动反馈或估计
机身角速度与倾斜策略观测、姿态约束IMU 与姿态估计
机身线速度真值奖励、评价、特权输入,也可用于某些策略实机通常需要估计
接触、摩擦或外部扰动参数评价或特权输入不一定能直接测得

特权观测是训练时额外可用的信息。例如非对称 Actor-Critic 可以让价值网络使用更丰富的输入,而部署的 Actor 只使用可获得的观测。具体是否这样设计,要看算法和任务;不能将仿真真值一概排除,也不能默认部署端都能提供。

以下为本文约定的单帧输入,适用于十二关节的位置偏移示例。它不是 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本例约定为上次裁剪后、缩放前的动作

总维数为 3+3+3+12+12+12=453+3+3+12+12+12=45。如果再加入三维线速度,维数变成 48;如果使用最近四帧完整观测,输入维数为 4×45=1804\times45=180。其他项目也可能只为部分输入保留历史。

上一次动作的定义必须明确:网络原始输出、裁剪后的动作、关节目标不是同一个量。表中的约定需要在训练与部署两端一致实现。

RWBR_{WB} 将机身坐标系中的向量旋转到世界坐标系,世界系单位重力方向为 g^W\hat g_W,则:

g^B=RWBTg^W\hat g_B=R_{WB}^{\mathsf T}\hat g_W

它能反映机身倾斜,但不能提供绕重力方向的绝对航向信息。若任务需要绝对航向,应通过其他信息或目标误差提供。

四元数分量顺序、旋转方向和机身轴向都需记录。验证时可以构造水平和已知倾斜姿态,检查投影方向;不能只凭得到三个有限数值就判定正确。

4. 观测缩放、噪声建模与数值裁剪

Section titled “4. 观测缩放、噪声建模与数值裁剪”

一种示意处理方式是:

x~=clip(sx(x+ϵ),b,b)\tilde x=\operatorname{clip}(s_x(x+\epsilon),-b,b)

xx 是原始物理量,ϵ\epsilon 是以相同单位定义的噪声,sxs_x 是缩放系数,bb 是裁剪界限。也有实现先缩放再加噪声,此时噪声量级应对应缩放后的空间。

例如关节速度为 10 rad/s、缩放系数为 0.05 时,无噪声的输入值为 0.5。缩放不改变物理速度,只改变网络看到的数值。运行均值方差归一化又是另一种处理,需要保存并复用相关统计量。

噪声应针对有意义的观测项设置。任务指令和过去输出的动作并非传感器读数,不应不加区分地添加相同噪声。裁剪可以限制异常输入,但大量数值持续被裁剪,往往说明量级或状态存在问题。

历史观测为推断速度、接触和动态响应提供线索,但不能保证消除全部部分可观测性。必须约定帧顺序、采样周期和初始化方式。

回合重置时,可以清零历史,也可以用初始观测填充,选择应与训练设计一致。不能把上一回合摔倒前的历史带入新回合;循环网络的隐藏状态同样需要按结束的环境重置。

下面只表达数据处理关系,不对应具体框架 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)

实际实现还应核对数据时刻、噪声、裁剪和历史。形状检查只能发现维度错误,无法发现左右腿交换或坐标系颠倒。

给定水平姿态、零速度、关节位于默认角度、前一动作全零的状态,手工写出这份观测中哪些段应为零,哪些仍包含指令或重力信息。再改变一个关节角,检查是否只有对应位置段发生预期变化。

为什么策略加载成功却表现异常? 对照同一组原始状态,逐段比较训练端与部署端预处理后的向量,优先检查顺序、单位、坐标系和历史。

是否一定要加入机身线速度? 取决于方案。可以提供估计值,也可以让策略或辅助模块利用历史推断;需要明确训练与部署各自采用什么来源。

下一篇:策略动作与关节控制