倒立摆#

倒立摆(CartPole)是强化学习中的经典控制任务。其目标是训练一个通过控制小车左右移动来保持杆子平衡的智能体。

任务描述#

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

预期训练结果#

  1. 杆子角度大部分时间保持在 ±5 度以内

  2. Episode 时长接近或超过 10 秒

  3. 小车在合理范围内移动以保持平衡