问题
go1-stairs-terrain-walk 训练收敛(mean_reward 1089,episode 长度 1554/2000),但 policy 只下台阶、从不爬升:40s × 16 envs 评估中爬升事件(5s 窗口 z↑>0.3m)0 次、下降 13 次,前向速度误差 0.476 m/s(指令 0.5–1.0 m/s)。
复现:python scripts/train.py task=go1-stairs-terrain-walk/rslrl.ppo(默认配置 1000 iters)后以 scripts/play.py 评估。
根因(链式,两步缺一不可)
① reset 出生高度是固定常量,与地形无关(walk_stairs_terrain.py 原 offset_list)
出生 z 取自硬编码表 height_list={-1, 0.5, 1.5}。实测该表与 heightmap_stairs.hfield 资产不匹配(平台中心在 k·8−1,实际顶高集合 {−1.5, −1.32, −1.0, +1.0, +1.32, +1.5},八种转置/翻转组合均对不上):
| 指标(25 出生槽位实测) |
数值 |
| 埋入地形(最深) |
4/25(−2.1m) |
| 悬空坠落(最高) |
20/25(+3.4m) |
| 首步即触发 trunk 碰撞终止 |
9/25 |
出生状态错乱使机器人从未正常经历"随地形行走产生的高度变化",下述 ② 的问题在此阶段被掩盖。
② 修复 ① 后高度随地形变化,lin_vel_z=-2.0 暴露为主要矛盾
reset 改为"出生点地形采样 + init_state.pos[2] 间隙"后(25/25 槽位 clearance 精确 0.42m、首步零终止),垂直速度成为训练常态。此时 lin_vel_z=-2.0 开始惩罚一切正常垂直运动:攀上台阶需持续 vz≈0.25–0.5 m/s,惩罚 2·vz²=0.125–0.5/step,与速度跟踪满额收益(1.0/step)同量级——爬升期望收益为负,policy 合理地学成"只下不上"。
证据
lin_vel_z: -2.0 → -0.5 单变量重训(其余不变),同一评估流程:
| 指标 |
baseline |
lin_vel_z=−0.5 |
| episode 内爬升事件 |
0 |
26 |
| episode 内下降事件 |
13 |
24 |
| 前向速度误差 |
0.476 m/s |
0.108 m/s |
| episode 内世界高度活动范围 |
0.80m |
1.41m |
(已剔除 auto-reset 传送产生的 z 跳变,仅统计 episode 内行为。)
reward 分项分解(baseline policy 实测):tracking_ang_vel 贡献 +0.48/step——yaw 指令恒为 0,"不旋转"即可白拿约一半的跟踪收益,与 ② 叠加形成"慢速苟活"最优解。
修复
- reset 改为 terrain-aware:出生 z =
sample_terrain_height(出生点) + init_state.pos[2],删除硬编码高度表;
lin_vel_z: -2.0 → -0.5。
问题
go1-stairs-terrain-walk训练收敛(mean_reward 1089,episode 长度 1554/2000),但 policy 只下台阶、从不爬升:40s × 16 envs 评估中爬升事件(5s 窗口 z↑>0.3m)0 次、下降 13 次,前向速度误差 0.476 m/s(指令 0.5–1.0 m/s)。复现:
python scripts/train.py task=go1-stairs-terrain-walk/rslrl.ppo(默认配置 1000 iters)后以scripts/play.py评估。根因(链式,两步缺一不可)
① reset 出生高度是固定常量,与地形无关(
walk_stairs_terrain.py原offset_list)出生 z 取自硬编码表
height_list={-1, 0.5, 1.5}。实测该表与heightmap_stairs.hfield资产不匹配(平台中心在 k·8−1,实际顶高集合 {−1.5, −1.32, −1.0, +1.0, +1.32, +1.5},八种转置/翻转组合均对不上):出生状态错乱使机器人从未正常经历"随地形行走产生的高度变化",下述 ② 的问题在此阶段被掩盖。
② 修复 ① 后高度随地形变化,
lin_vel_z=-2.0暴露为主要矛盾reset 改为"出生点地形采样 +
init_state.pos[2]间隙"后(25/25 槽位 clearance 精确 0.42m、首步零终止),垂直速度成为训练常态。此时lin_vel_z=-2.0开始惩罚一切正常垂直运动:攀上台阶需持续 vz≈0.25–0.5 m/s,惩罚 2·vz²=0.125–0.5/step,与速度跟踪满额收益(1.0/step)同量级——爬升期望收益为负,policy 合理地学成"只下不上"。证据
lin_vel_z: -2.0 → -0.5单变量重训(其余不变),同一评估流程:(已剔除 auto-reset 传送产生的 z 跳变,仅统计 episode 内行为。)
reward 分项分解(baseline policy 实测):
tracking_ang_vel贡献 +0.48/step——yaw 指令恒为 0,"不旋转"即可白拿约一半的跟踪收益,与 ② 叠加形成"慢速苟活"最优解。修复
sample_terrain_height(出生点) + init_state.pos[2],删除硬编码高度表;lin_vel_z: -2.0 → -0.5。