3.3 KiB
3.3 KiB
倒立摆
倒立摆(CartPole)是强化学习中的经典控制任务。其目标是训练一个通过控制小车左右移动来保持杆子平衡的智能体。
:poster: _static/images/poster/cartpole.jpg
:nocontrols:
:autoplay:
:playsinline:
:muted:
:loop:
:width: 100%
任务描述
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 的奖励函数设计如下:
# 每步保持杆子不倒下获得 +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. 环境预览
uv run scripts/view.py --env cartpole
2. 开始训练
uv run scripts/train.py --env cartpole
3. 查看训练进度
uv run tensorboard --logdir runs/cartpole
4. 测试训练结果
uv run scripts/play.py --env cartpole
预期训练结果
- 杆子角度大部分时间保持在 ±5 度以内
- Episode 时长接近或超过 10 秒
- 小车在合理范围内移动以保持平衡