11---
22sidebar_position : 6
3- title : 6. 强化学习步态训练
3+ title : 6. 策略训练
44description : " 用 PPO 训练 Pupper 在仿真里走:MDP 建模、奖励设计、训练曲线和第一条学出来的步态。"
55displayed_sidebar : practicesCs123CourseSidebar
66---
77
8- # 6. 强化学习步态训练
8+ # 6. 策略训练
99
1010
1111上一章的 trot 是我们** 编程** 让它走;这一章我们让它** 学会** 走。我们会把 Pupper 仿真包成一个 Gymnasium 环境,用 PPO 训练一条能向任意方向走的策略,并和第 5 章的开环步态对比。
@@ -24,7 +24,7 @@ displayed_sidebar: practicesCs123CourseSidebar
2424- [ 强化学习 · 策略梯度] ( /docs/foundations/rl-for-robotics/policy-gradient )
2525- [ 项目 · DDPG Reacher-v5] ( /docs/practices/robot-arm/ddpg-mujoco/reacher-v5 ) (熟悉连续动作训练)
2626
27- ## 6.1 为什么步态可以被 RL 学出来
27+ ## 6.1 为什么能学
2828
2929第 5 章的 trot 是把"哪条腿什么时候抬、抬多高、落哪里"全写死的脚本。改地形要重写,改速度要重调,改 Pupper 的腿长要从头来一遍——** 控制器和机器人是绑死的** 。
3030
@@ -38,7 +38,7 @@ RL 把这件事反过来做:**把奖励写下来,让策略自己摸索哪条
3838
3939代价也清楚:奖励工程要花时间、训练要花算力、sim2real 还要花一轮调参。这一章的目标是把这三笔账都摆到台面上。
4040
41- ## 6.2 环境封装: Gymnasium 接口
41+ ## 6.2 Gymnasium 环境
4242
4343Pupper 的 RL 环境本质就是 MuJoCo 仿真套一个 Gymnasium 标准接口,重点是把 ` reset ` / ` step ` / ` observation_space ` / ` action_space ` 四件套写干净:
4444
@@ -100,7 +100,7 @@ class PupperEnv(gym.Env):
100100- ** 观测里用 base 系下的重力方向** 而不是世界系下的四元数。这样可以让策略对** 绝对朝向** 不敏感,转一圈也不会失忆——sim2real 时这个细节救命。
101101- ** ` step ` 里跑多个物理步** 。仿真器 timestep 一般 0.5–2 ms(数值稳定),策略决策 20–50 Hz 已足够,二者解耦。
102102
103- ## 6.3 动作设计:PD 残差是默认选择
103+ ## 6.3 动作设计
104104
10510512 维连续动作直接喂给关节 PD 的目标角,写法上有三档:
106106
@@ -112,21 +112,21 @@ class PupperEnv(gym.Env):
112112
113113` scale = 0.3 ~ 0.5 rad ` 是经验值——大到能学出步态,小到不会一上来就翻。** 先 stand 再 walk** 是这条选择背后真正的动机:环境一上来不"立即崩盘",奖励信号才有梯度可以爬。
114114
115- ## 6.4 奖励工程:主奖励 + 四类辅助奖励
115+ ## 6.4 奖励设计
116116
117117这一节是整章的核心,也是 CS123 Lab 5 slides 反复强调的一句话:** 只奖励"跟随速度命令"是远远不够的** 。直接训出来的策略会用"上半身狂甩 + 四肢乱踢"的方式跑出 vx,但你绝不想把它接到真机上。
118118
119119业内通用的做法是把奖励拆成** 一个主奖励 + 四类辅助奖励** :
120120
121- ### 主奖励:跟随速度命令
121+ ### 主奖励:速度跟随
122122
123123$$
124124r_\text{vel} = \exp\!\big(-\|v_\text{xy} - v_\text{xy,cmd}\|^2 / \sigma^2\big), \quad \sigma \approx 0.5
125125$$
126126
127127用 ` exp ` 的好处是它在 cmd 附近平滑、远离时不爆炸,比直接 ` -||·||² ` 训练更稳。
128128
129- ### 辅助奖励 1 :电机效率
129+ ### 辅助 :电机效率
130130
131131```
132132r_torque = -‖τ‖² # 力矩平方惩罚
@@ -135,22 +135,22 @@ r_act_rate = -‖a_t - a_{t-1}‖² # 动作变化率惩罚
135135
136136这两项是把"不要乱抖"写成数学。** ` r_act_rate ` 是出现优雅步态的关键** ——没有它,6.7 节那个暴走策略永远收敛不到 6.8 节的 trot。
137137
138- ### 辅助奖励 2 :稳定性
138+ ### 辅助 :稳定性
139139
140140```
141141r_ori = -‖roll‖² - ‖pitch‖² # 别歪
142142r_height = -(z_base - 0.18)² # 别趴
143143r_yaw = -‖ωz - ωz_cmd‖² # 朝向跟随命令
144144```
145145
146- ### 辅助奖励 3 :接触管理
146+ ### 辅助 :接触管理
147147
148148```
149149r_body_contact = -1 if 身体/膝盖触地 else 0 # 直接判负
150150r_air_time = +Σ (T_swing - 0.5)² # 摆动相要够长,鼓励"抬腿走"而不是"擦地走"
151151```
152152
153- ### 辅助奖励 4:地形鲁棒性
153+ ### 辅助:地形鲁棒
154154
155155```
156156r_foot_clearance = +Σ ‖p_foot,z‖ * |v_foot,xy| # 摆动腿水平移动时鼓励抬高
@@ -175,7 +175,7 @@ REWARD_WEIGHTS = {
175175
176176> ** 调参顺序** :先把 ` vel ` 单独训出来看暴走策略(实验 1);再加 ` torque + action_rate ` 看步态是否变规整(实验 2);再加稳定性、接触、地形三组看是否能在不平地形跑。** 一次只加一类** ,否则训练曲线变了也不知道是哪一项的功劳。
177177
178- ## 6.5 域随机化:让仿真策略能上真机
178+ ## 6.5 域随机化
179179
180180策略只在"理想 Pupper"上训练,到真机上必崩——质量误差 5%、地板摩擦 0.6 而不是 0.8、电池电压掉了 10%,这些都会让策略找不到熟悉的状态分布。** 域随机化(DR)** 就是在仿真里把这些参数随机抖一抖,强迫策略对它们不敏感:
181181
@@ -234,7 +234,7 @@ CPU 上 8 路并行训 2M 步大约 20–40 分钟,能学出一个看得过去
234234- ` train/clip_fraction ` :裁剪比例,长期 < 0.3 算稳;> 0.5 说明 lr 偏大。
235235- ` train/explained_variance ` :value head 学得好不好,> 0.7 算不错。
236236
237- ## 6.7 实验 1:只奖励前向速度的"暴走"策略
237+ ## 6.7 速度奖励实验
238238
239239只保留主奖励 ` vel ` ,其它权重全部置 0:
240240
@@ -250,7 +250,7 @@ REWARD_WEIGHTS = {'vel': 1.5, 'alive': 0.1}
250250
251251这条策略的存在价值只有一个:** 给 6.8 节做对照组** 。它说明"只跟随速度"不够。
252252
253- ## 6.8 实验 2:加能量惩罚后的"优雅"步态
253+ ## 6.8 能量惩罚实验
254254
255255在实验 1 基础上加两项:
256256
0 commit comments