Skip to content

fix: go1-stairs-terrain-walk with hardcoded spawn z and over-penalized lin_vel_z #48

Description

@Jiaxi-Huang

问题

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.pyoffset_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,"不旋转"即可白拿约一半的跟踪收益,与 ② 叠加形成"慢速苟活"最优解。

修复

  1. reset 改为 terrain-aware:出生 z = sample_terrain_height(出生点) + init_state.pos[2],删除硬编码高度表;
  2. lin_vel_z: -2.0 → -0.5

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions