chore: release v0.1.0
(cherry picked from commit 82525f882f3924a332d9ce40bf64255d0d14f6a4)
This commit is contained in:
@@ -1,16 +1,89 @@
|
||||
# 倒立摆训练示例
|
||||
# 倒立摆
|
||||
|
||||
倒立摆(CartPole)是强化学习中的经典控制任务,目标是通过控制小车左右移动来保持杆子平衡。
|
||||

|
||||
倒立摆(CartPole)是强化学习中的经典控制任务。其目标是训练一个通过控制小车左右移动来保持杆子平衡的智能体。
|
||||
|
||||
```{video} /_static/videos/cartpole.mp4
|
||||
:poster: _static/images/poster/cartpole.jpg
|
||||
:nocontrols:
|
||||
:autoplay:
|
||||
:playsinline:
|
||||
:muted:
|
||||
:loop:
|
||||
:width: 100%
|
||||
```
|
||||
|
||||
## 任务描述
|
||||
|
||||
- **状态空间**:小车位置、小车速度、杆子角度、杆子角速度
|
||||
- **动作空间**:向左或向右施加力
|
||||
- **奖励函数**:每一步保持杆子不倒下获得+1 奖励
|
||||
- **终止条件**:杆子角度超过 ±15 度或 episode 长度超过 10 秒
|
||||
CartPole 是一个经典的平衡控制任务。环境由一个小车和一根通过铰链连接在小车上的杆组成。智能体通过向左或向右施加力来控制小车移动,使杆子保持直立不倒。该任务要求精确的时序控制和平衡能力。
|
||||
|
||||
## 快速开始
|
||||
---
|
||||
|
||||
## 动作空间(Action Space)
|
||||
|
||||
| 项目 | 详细信息 |
|
||||
| -------- | ------------------------------- |
|
||||
| **类型** | `Box(-3.0, 3.0, (1,), float32)` |
|
||||
| **维度** | 1 |
|
||||
|
||||
动作对应如下:
|
||||
|
||||
| 序号 | 动作含义(施加在小车上的力) | 最小值 | 最大值 | 对应 XML 中名称 |
|
||||
| ---: | ---------------------------- | :----: | :----: | :-------------: |
|
||||
| 0 | 水平方向的力 | -3.0 | 3.0 | `slider` |
|
||||
|
||||
---
|
||||
|
||||
## 观察空间
|
||||
|
||||
| 项目 | 详细信息 |
|
||||
| -------- | ------------------------------- |
|
||||
| **类型** | `Box(-inf, inf, (4,), float32)` |
|
||||
| **维度** | 4 |
|
||||
|
||||
CartPole 环境的观测空间由以下部分组成(按顺序):
|
||||
|
||||
| 部分 | 内容说明 | 维度 | 备注 |
|
||||
| -------- | -------------------- | ---- | -------------- |
|
||||
| **qpos** | 小车位置和杆子角度 | 2 | 位置和角度信息 |
|
||||
| **qvel** | 小车速度和杆子角速度 | 2 | 速度为位置导数 |
|
||||
|
||||
| 序号 | 观察量 | 最小值 | 最大值 | XML 名称 | 关节 | 类型 (单位) |
|
||||
| ---- | ---------- | ------ | ------ | -------- | ----- | -------------- |
|
||||
| 0 | 小车位置 | -Inf | Inf | slider | slide | 位置 (m) |
|
||||
| 1 | 杆子角度 | -Inf | Inf | hinge | hinge | 角度 (rad) |
|
||||
| 2 | 小车速度 | -Inf | Inf | slider | slide | 速度 (m/s) |
|
||||
| 3 | 杆子角速度 | -Inf | Inf | hinge | hinge | 角速度 (rad/s) |
|
||||
|
||||
---
|
||||
|
||||
## 奖励函数设计
|
||||
|
||||
cartpole 的奖励函数设计如下:
|
||||
|
||||
```python
|
||||
# 每步保持杆子不倒下获得 +1 奖励
|
||||
reward = 1.0 # 每步固定奖励
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 初始状态
|
||||
|
||||
- **小车初始位置**:0.0 米(中心位置)
|
||||
- **杆子初始角度**:0.0 弧度(直立)
|
||||
- **初始速度**:均为 0
|
||||
- 在初始状态上添加小幅随机噪声(`reset_noise_scale = 0.01`)以增加训练多样性
|
||||
|
||||
## Episode 终止条件
|
||||
|
||||
- 杆子角度超过 ±0.2 弧度(约 ±11.5 度)
|
||||
- 小车位置超出 [-0.8, 0.8] 米范围
|
||||
- 杆子角度出现 NaN 值
|
||||
- Episode 最大时长:10 秒
|
||||
|
||||
---
|
||||
|
||||
## 使用指南
|
||||
|
||||
### 1. 环境预览
|
||||
|
||||
@@ -21,14 +94,7 @@ uv run scripts/view.py --env cartpole
|
||||
### 2. 开始训练
|
||||
|
||||
```bash
|
||||
# 使用默认参数训练
|
||||
uv run scripts/train.py --env cartpole
|
||||
|
||||
# 自定义环境数量
|
||||
uv run scripts/train.py --env cartpole --num-envs 1024
|
||||
|
||||
# 启用渲染(训练时可视化)
|
||||
uv run scripts/train.py --env cartpole --render
|
||||
```
|
||||
|
||||
### 3. 查看训练进度
|
||||
@@ -40,60 +106,13 @@ uv run tensorboard --logdir runs/cartpole
|
||||
### 4. 测试训练结果
|
||||
|
||||
```bash
|
||||
# 自动寻找最佳策略测试(推荐)
|
||||
uv run scripts/play.py --env cartpole
|
||||
|
||||
# 手动指定策略文件测试
|
||||
uv run scripts/play.py --env cartpole --policy runs/cartpole/nn/best_agent.pickle
|
||||
|
||||
```
|
||||
|
||||
> **提示**:系统会自动在 `runs/cartpole/` 目录下寻找最新、最佳的策略文件进行测试。您也可以通过 `--policy` 参数手动指定特定的策略文件。
|
||||
---
|
||||
|
||||
## 配置参数
|
||||
## 预期训练结果
|
||||
|
||||
倒立摆环境的主要配置参数:
|
||||
|
||||
```python
|
||||
@dataclass
|
||||
class CartPoleEnvCfg(EnvCfg):
|
||||
model_file: str = "path/to/inverted_pendulum.xml" # MJCF模型文件
|
||||
reset_noise_scale: float = 0.01 # 重置噪声
|
||||
max_episode_seconds: float = 10.0 # 最大episode长度
|
||||
```
|
||||
|
||||
训练配置参数:
|
||||
|
||||
```python
|
||||
@dataclass
|
||||
class CartPoleRLCfg(BaseRLCfg):
|
||||
num_envs: int = 2048 # 并行环境数量
|
||||
learning_rate: float = 3e-4 # 学习率
|
||||
batch_size: int = 2048 # 批大小
|
||||
max_epochs: int = 500 # 最大训练轮数
|
||||
```
|
||||
|
||||
## 自定义训练
|
||||
|
||||
您可以通过命令行参数覆盖默认配置:
|
||||
|
||||
```bash
|
||||
uv run scripts/train.py --env cartpole \
|
||||
--num-envs 1024 \
|
||||
--train-backend jax \
|
||||
--sim-backend np
|
||||
```
|
||||
|
||||
## 预期结果
|
||||
|
||||
- 杆子角度大部分时间保持在 ±5 度以内
|
||||
- 小车位移范围适中
|
||||
|
||||
## 故障排除
|
||||
|
||||
如果训练效果不佳,可以尝试:
|
||||
|
||||
1. 调整学习率(尝试 1e-4 到 1e-3)
|
||||
2. 增加环境数量(更多并行训练)
|
||||
3. 调整奖励函数权重
|
||||
4. 检查物理参数设置是否合理
|
||||
1. 杆子角度大部分时间保持在 ±5 度以内
|
||||
2. Episode 时长接近或超过 10 秒
|
||||
3. 小车在合理范围内移动以保持平衡
|
||||
|
||||
Reference in New Issue
Block a user