Skip to content

Commit 5604bf9

Browse files
committed
📝 docs: 简化 CS123 章节目录标题
1 parent 10ccb50 commit 5604bf9

9 files changed

Lines changed: 67 additions & 67 deletions

File tree

docs/practices/quadruped/cs123/0.intro.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ displayed_sidebar: practicesCs123CourseSidebar
3434
| [3. 逆运动学](/docs/practices/quadruped/cs123/inverse-kinematics) | IK 与点到点控制 | CS123 Lab 3 / Lec 4 |
3535
| [4. 搭建四足机器人](/docs/practices/quadruped/cs123/quadruped-mjcf) | Pupper 本体建模 | CS123 Lab 4 |
3636
| [5. 模型驱动步态](/docs/practices/quadruped/cs123/gait-control) | 开环 trot | Lec 5 |
37-
| [6. RL 步态训练](/docs/practices/quadruped/cs123/rl-gait) | PPO + 仿真训练 | CS123 Lab 5 / Lec 6 |
38-
| [7. LLM 控制](/docs/practices/quadruped/cs123/llm-control) | 语言指令驱动 | CS123 Lab 6 / Lec 8–9 |
39-
| [8. 机器人视觉](/docs/practices/quadruped/cs123/perception) | 相机与追踪、接入 LLM 工具 | CS123 Lab 7 / Lec 7 |
37+
| [6. 策略训练](/docs/practices/quadruped/cs123/rl-gait) | PPO + 仿真训练 | CS123 Lab 5 / Lec 6 |
38+
| [7. 语言控制](/docs/practices/quadruped/cs123/llm-control) | 语言指令驱动 | CS123 Lab 6 / Lec 8–9 |
39+
| [8. 视觉感知](/docs/practices/quadruped/cs123/perception) | 相机与追踪、接入 LLM 工具 | CS123 Lab 7 / Lec 7 |
4040

4141
## 前置知识
4242

docs/practices/quadruped/cs123/1.pid-control.mdx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,11 @@ $\omega_n$ 是**固有频率**(系统本来想振多快),$\zeta$ 是**阻尼
323323

324324
总结来说,调参的朴素做法就是先把 $K_p$ 按"我们想要的响应快慢"选出来,再按 $K_d = 2\zeta\sqrt{K_p I}$、取 $\zeta \in [0.7, 1.0]$,就能得到一个既不晃又不慢的响应。
325325

326-
## 1.6 MuJoCo 里实现 PD
326+
## 1.6 MuJoCo 实现
327327

328328
理论部分到此为止,下面把公式 $\tau = K_p\,(q_d - q) + K_d\,(\dot q_d - \dot q)$ 写进 MuJoCo 里真的跑一遍:先用内置的 `position` 执行器看整体效果,再自己手搓 PD,把 $K_p$ 和 $K_d$ 的作用一个一个拆开看。
329329

330-
### 1.6.1 MuJoCo 里的执行器模型
330+
### 1.6.1 执行器模型
331331

332332
MuJoCo 用 `<actuator>` 标签把控制信号 `ctrl[i]` 翻译成作用在关节上的广义力。对单关节 PD,有三种常见写法:
333333

@@ -343,7 +343,7 @@ MuJoCo 用 `<actuator>` 标签把控制信号 `ctrl[i]` 翻译成作用在关节
343343

344344
本章我们两种都写一遍:先用 `position` 看效果,再用 `motor` 自己手搓 PD,把 $K_p$、$K_d$ 的作用一个一个拆开看。
345345

346-
### 1.6.2 第一个 MJCF:单摆 PD 控制
346+
### 1.6.2 单摆 PD
347347

348348
这一节搭一个最小能跑的 PD 例子,只要两份文件:`pendulum.xml` 描述物理,`pd_single_joint.py` 给执行器写 `ctrl`。我们故意在同一个 MJCF 里同时留下两种 PD 写法,Python 里靠一个开关切换,方便我们亲眼对比"MuJoCo 内置的 `position` 执行器"和"自己手搓的 motor + PD"是同一件事。
349349

@@ -454,7 +454,7 @@ python pd_single_joint.py
454454

455455
</div>
456456

457-
### 1.6.3 实验 1:不同 $K_p / K_d$ 下的响应曲线
457+
### 1.6.3 实验:增益响应
458458

459459
只看 1.6.2 里 $K_p=20,\ K_d=1$ 那条单次响应,$K_p$、$K_d$ 仍然像两个调到不报错就行的旋钮。这一节固定 $K_p$,让 $K_d$ 扫过欠阻尼 / 接近临界 / 过阻尼三个区段,把每个旋钮单独负责什么看清楚。
460460

@@ -563,7 +563,7 @@ python pd_experiments.py
563563
2. **$K_d$ 是控制器主动出的阻尼,跟 MJCF 里的 `damping` 不是同一件事**。后者是关节本身的物理阻尼,写在 XML 里、和控制器无关;想干净地观察 $K_d$ 的作用,就把 `damping` 设小一点,避免两份阻尼混在一起。
564564
3. **$K_p$ 太大会让仿真先于真机崩**。$K_p$ 加到某个值之后曲线出现高频噪声甚至发散,这是 `timestep` 跟不上 $\omega_n = \sqrt{K_p / I}$ 的信号,不是 PD 公式错了;把 `timestep` 调小、或把 $K_p$ 减小,都能压下去。
565565

566-
### 1.6.4 实验 2:加上扰动看稳态误差
566+
### 1.6.4 实验:扰动误差
567567

568568
实验 2 用同一个 `pd_experiments.py`,只是在第 3 秒后给关节一个持续外力矩:
569569

docs/practices/quadruped/cs123/2.forward-kinematics.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import DocTable from '@site/src/components/DocTable';
2626
- 想更直观理解,可以点击 [**交互模式**](/cs123/fk-playground) 学习
2727

2828

29-
## 2.1 机械臂的运动组成
29+
## 2.1 机械臂组成
3030

3131
在推导出正运动学公式之前,我们先铺垫一些概念,首先是机械臂的运动组成。机械臂的运动由两个关键元素组成:**关节**(Joint)和**连杆**(Link)。此外还有一个特殊的连杆叫**末端执行器**(End Effector),它是机械臂的"手",在拓扑上是最后一个连杆,但功能特殊,所以单独命名。
3232

@@ -259,7 +259,7 @@ $$
259259

260260
但 DH 不是机器人模型文件的通用格式。URDF / MJCF 中的关节坐标系通常已经由建模工具、CAD 导出流程或仿真器约定好;这些坐标系不一定满足 DH 选系规则。把一个真实模型改写成 DH 表,往往需要重新放置中间坐标系,并逐个关节核对轴向、偏置和正方向。因此,本章后面的实现采用 URDF / MJCF 更自然的父-子链式写法。
261261

262-
### 2.5.2 URDF / MJCF 父-子链
262+
### 2.5.2 URDF / MJCF
263263

264264
URDF / MJCF 不要求我们重新按 DH 规则摆坐标系。它采用更直接的**父-子链式约定**:机器人是一棵树,`link` 是树上的节点,`joint` 是连接两个节点的边。沿着 `parent → child` 的方向把每条边的变换乘起来,就得到末端位姿。
265265

@@ -411,7 +411,7 @@ $$
411411

412412
所以末端位置不是额外算出来的,而是已经存放在 $T_0^3$ 的平移列中。代码里读 `T[:3, 3]`,读的正是这一列的前三个分量;平面问题里 $z=0$,所以前两项就是式 $\eqref{eq:planar_fk}$ 中的 $(x, y)$。
413413

414-
## 2.7 NumPy 实现与 MuJoCo 校验
414+
## 2.7 NumPy MuJoCo
415415

416416
先定义两个最基础的齐次变换构造器,后面所有 FK 代码都靠它们拼积木:
417417

@@ -576,7 +576,7 @@ $$
576576

577577
雅可比在后续章节会反复出现:第 3 章数值 IK 用它把末端位置误差转成关节角修正量;第 5 章接触力分析会用到雅可比转置;第 6 章奖励设计中也会用它描述末端速度。因此,本节只需要先建立两个结论:雅可比是 FK 对关节变量的局部线性化;它的每一列描述一个关节对末端瞬时运动的贡献。
578578

579-
## 2.9 实验 1:工作空间散点图
579+
## 2.9 工作空间散点
580580

581581
工作空间(reachable workspace) 是末端**能到达的所有点**的集合。用 FK 做一次 Monte Carlo 就能把它画出来:
582582

@@ -608,7 +608,7 @@ plt.show()
608608

609609
这张图在第 3 章选 IK 目标时会派上用场:**目标点落在工作空间外**就是典型的"无解",这时再好的 IK 算法也无法得到满足约束的关节角。
610610

611-
## 2.10 实验 2:末端位置叠加可视化
611+
## 2.10 末端叠加可视化
612612

613613
MuJoCo 支持在 viewer 里叠加"调试几何",非常适合把 FK 的中间结果可视化出来——比如末端位置、每一节连杆坐标轴、目标点。
614614

docs/practices/quadruped/cs123/3.inverse-kinematics.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ FK 是一个干净的前向函数,IK 则是"解一个非线性方程组",通
4040

4141
经验法则:**有特解就用解析,一般机械臂 / 人形 / 四足都用数值**。下面两节分别展开,3.5 节再回来谈三类绕不开的工程难题。
4242

43-
## 3.3 解析法:3-DoF 平面臂
43+
## 3.3 3-DoF 解析法
4444

4545
先退到最干净的情形——**3-DoF 平面臂**,三节长度 $L_1, L_2, L_3$,关节在 z 轴转。
4646

@@ -101,7 +101,7 @@ def ik_analytic_planar(xy, phi, L=(0.3, 0.25, 0.15), elbow_up=True):
101101

102102
解析解的价值不是"省 CPU",而是**做数值解的参考答案**:下一节的数值 IK 跑完后,在平面工况下和解析解比一下,能第一时间抓到"我的雅可比写错了"这类 bug。
103103

104-
## 3.4 数值法:阻尼最小二乘
104+
## 3.4 DLS 数值法
105105

106106
一旦到 6-DoF 一般机械臂、人形机器人,解析解要么不存在、要么写出来比数值法还长。业内的通用解法是**迭代线性化 + 最小二乘**
107107

@@ -163,7 +163,7 @@ def ik_dls(fk_fn, jac_fn, theta0, p_target,
163163
- `lam = 0` 效果最"贪心",但一进奇异就蹦;`lam` 太大则慢到收敛不动——经验值 0.01~0.1。
164164
- 迭代 500 次还没收敛,往往不是数值问题,而是**目标本来就不可达**
165165

166-
## 3.5 工程上的三个难题
166+
## 3.5 三个难题
167167

168168
不论用解析还是数值,在 MuJoCo / Isaac Sim 这类仿真器或真机上写 IK,总会反复撞上同样的三类问题。**这三件事就是第 3 章真正的难点**——算法本身只是骨架,工程上能不能用,看的是这三个坑怎么填。
169169

@@ -199,7 +199,7 @@ def ik_dls(fk_fn, jac_fn, theta0, p_target,
199199

200200
DLS 在这两类情形下都不会崩——它会"贴着边缘最近点"跟着目标走(3.9 节会直观看到这一点),这是它相对纯伪逆最大的工程优势。
201201

202-
## 3.6 IK + PD 串联控制
202+
## 3.6 IK + PD 控制
203203

204204
IK 给出的是**关节目标角**,不是力矩。把它喂进第 1 章那条 PD 回路,就构成了机器人学里最基础的 **Task-space → Joint-space → Torque** 三层串联:
205205

@@ -225,7 +225,7 @@ flowchart LR
225225

226226
上面这条实线是**命令链路**:末端目标先被 IK 换成关节目标角,再由 PD 换成力矩。下面这条虚线是**反馈链路**:MuJoCo 每一步都会给出当前关节角和关节速度,PD 用它们计算误差并修正下一次力矩。
227227

228-
### 3.6.1 MuJoCo FK 和雅可比
228+
### 3.6.1 MuJoCo FK / 雅可比
229229

230230
3.4 节的 `ik_dls` 留了两个口子——`fk_fn``jac_fn`,这一节先把它们落地。手算雅可比对 3-DoF 平面臂还行,到 6-DoF 真机就非常容易写错;**更靠谱的工程做法是直接让 MuJoCo 替你算**
231231

@@ -393,7 +393,7 @@ while data.time < 15.0:
393393

394394
这一个实验和 3.7 的圆放一起,刚好覆盖了"光滑轨迹 + 不光滑轨迹"两类典型任务,已经足够第 4 章四足步态或第 5 章末端抓取直接复用。
395395

396-
## 3.9 实验:viewer 里实时看 DLS 收敛
396+
## 3.9 viewer DLS 收敛
397397

398398
光看末端轨迹不够直观——把 <strong>目标点(绿球)</strong> 和 <strong>当前末端(红球)</strong> 都叠到 MuJoCo viewer 里,DLS 的"追"才能一眼看出来。这一段是第 2 章 viewer 实验的直接延伸,最终叠加效果见 [图 4](#fig-ik-viewer-debug-overlay)
399399

docs/practices/quadruped/cs123/5.gait-control.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import Figure from '@site/src/components/Figure';
2626
- 第 3 章 [逆运动学](/docs/practices/quadruped/cs123/inverse-kinematics)
2727
- 第 4 章 [搭建四足机器人](/docs/practices/quadruped/cs123/quadruped-mjcf)
2828

29-
## 5.1 四足常见步态:walk / trot / bound / gallop
29+
## 5.1 常见步态
3030

3131
四足步态可以先按速度理解:**walk 最稳、trot 最常用、bound/gallop 更快但更难控**。四种典型步态的着地节奏、占空比和适用场景如 [图 1](#fig-gait-overview) 所示。
3232

@@ -47,7 +47,7 @@ import Figure from '@site/src/components/Figure';
4747

4848
> CS123 Lab 4 slides 直接挑明:"Pupper is NOT expected to walk straight from this simple gait." 后面 5.7 节会让你**亲眼看到**这一点,并把它当作第 6 章 RL 的动机。
4949
50-
## 5.2 步态 = 各腿"抬/落"节奏图
50+
## 5.2 步态节奏图
5151

5252
**步态图**(gait diagram)用于描述各条腿在一个步态周期内的支撑相(stance)与摆动相(swing)分布。对本章的 trot 步态而言,主要关注以下三个参数:
5353

@@ -97,7 +97,7 @@ def leg_phase(t, leg, T_cycle):
9797

9898
这段实现的核心是将步态时序表示为相位计算:控制器只维护一个全局循环相位,每条腿通过 `PHASE_OFFSETS` 得到局部相位,再由 `DUTY` 判定其处于支撑相还是摆动相。
9999

100-
## 5.3 足端轨迹:四相位的摆动曲线
100+
## 5.3 足端轨迹
101101

102102
在确定各腿的支撑/摆动节奏后,还需要为每条腿生成足端在身体坐标系下的目标轨迹。CS123 Lab 4 slides 将单条腿一个周期内的足端运动划分为四个关键相位,如 [图 3](#fig-foot-trajectory-phases) 所示。
103103

@@ -140,7 +140,7 @@ def foot_trajectory(s, in_stance, step_length, step_height, stand_height):
140140
- **摆动相中使用 `sin(πs)` 生成抬脚高度**:该函数在 $s=0$ 和 $s=1$ 处高度为 0,在 $s=0.5$ 处达到最高点,能够形成平滑的抬脚-落脚过程。
141141
- **`step_length` 表示身体坐标系下的足端前后摆幅**:实现时需要保持坐标方向一致,避免将身体相对足端的运动方向与足端目标轨迹方向混淆。
142142

143-
## 5.4 把足端轨迹经 IK 转成关节角 → 喂 PD
143+
## 5.4 轨迹到关节角
144144

145145
5.3 节生成的是身体坐标系下的足端目标位置,而底层执行器接收的是关节空间中的控制输入。因此,需要先通过逆运动学(IK)将足端目标转换为目标关节角,再由 PD 控制器根据当前关节状态计算力矩或控制量,并送入 MuJoCo 仿真。这条执行管线如 [图 4](#fig-gait-ik-pd-pipeline) 所示。
146146

@@ -173,7 +173,7 @@ def gait_step(t, T_cycle, step_length, step_height, stand_height):
173173

174174
**频率分层**:步态生成器和 IK 通常可以以 50–100 Hz 更新;PD 控制器则跟随 MuJoCo 仿真步长运行,常见频率为 500 Hz–2 kHz。这与第 3 章 IK + PD 的结构一致,只是足端参考轨迹从单腿测试轨迹扩展为四条腿同步的步态轨迹。
175175

176-
## 5.5 中心模式发生器(CPG简述
176+
## 5.5 CPG 简述
177177

178178
5.2 节使用的模 1 相位计数器可以理解为一种**全局时钟**:控制器维护一个统一的全局相位 $t$,所有腿根据预先设定的相位偏移 $\phi_i$ 从同一时钟中读取自己的局部相位。与之相对,**CPG(Central Pattern Generator,中心模式发生器)**通常为每条腿配置一个振荡器,并通过振荡器之间的相位耦合维持整体节奏。两种节奏生成方式的差异如 [图 5](#fig-global-clock-vs-cpg) 所示。
179179

@@ -234,7 +234,7 @@ while data.time < 10.0:
234234

235235
通过这一关,至少证明 5.2 + 5.3 + 5.4 这三步串起来没有 bug。
236236

237-
## 5.7 实验 2:按给定速度往前走
237+
## 5.7 前进实验
238238

239239
`step_length` 改成"周期内身体应该走的距离":
240240

docs/practices/quadruped/cs123/6.rl-gait.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
---
22
sidebar_position: 6
3-
title: 6. 强化学习步态训练
3+
title: 6. 策略训练
44
description: "用 PPO 训练 Pupper 在仿真里走:MDP 建模、奖励设计、训练曲线和第一条学出来的步态。"
55
displayed_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

4343
Pupper 的 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

105105
12 维连续动作直接喂给关节 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
$$
124124
r_\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
```
132132
r_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
```
141141
r_ori = -‖roll‖² - ‖pitch‖² # 别歪
142142
r_height = -(z_base - 0.18)² # 别趴
143143
r_yaw = -‖ωz - ωz_cmd‖² # 朝向跟随命令
144144
```
145145

146-
### 辅助奖励 3:接触管理
146+
### 辅助:接触管理
147147

148148
```
149149
r_body_contact = -1 if 身体/膝盖触地 else 0 # 直接判负
150150
r_air_time = +Σ (T_swing - 0.5)² # 摆动相要够长,鼓励"抬腿走"而不是"擦地走"
151151
```
152152

153-
### 辅助奖励 4:地形鲁棒性
153+
### 辅助:地形鲁棒
154154

155155
```
156156
r_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

Comments
 (0)