Files
Motrixlab/docs/source/zh_CN/user_guide/demo/cartpole.md
motphys-developers 62011bb24f chore: release v0.1.0
(cherry picked from commit 82525f882f3924a332d9ce40bf64255d0d14f6a4)
2026-01-08 15:07:57 +08:00

3.3 KiB
Raw Blame History

倒立摆

倒立摆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

预期训练结果

  1. 杆子角度大部分时间保持在 ±5 度以内
  2. Episode 时长接近或超过 10 秒
  3. 小车在合理范围内移动以保持平衡