Files
Motrixlab/docs/source/zh_CN/user_guide/demo/acrobot.md
motphys-developers b568ac5600 chore: release v0.2.0
2026-02-10 08:08:11 +00:00

3.9 KiB
Raw Blame History

Acrobot 双连杆

Acrobot 是一个双连杆摆动和平衡任务。目标是使用一个电机扭矩摆动双臂并到达目标位置。

:poster: _static/images/poster/acrobot.jpg
:nocontrols:
:autoplay:
:playsinline:
:muted:
:loop:
:width: 100%

任务描述

双连杆 Acrobot 由一个铰链关节驱动,该关节由单个电机控制。电机安装在肘关节处,这是系统中唯一的驱动关节。电机的扭矩使连杆在平面内旋转,实现从任意初始角度摆起并到达目标位置。扭矩受限于执行器的 ctrlrange通过调节其大小和方向策略必须积累能量以摆起并到达目标同时保持稳定性。

动作空间

项目 详情
类型 Box(-1.0, 1.0, (1,), float32)
维度 1

观察空间

项目 详情
类型 Box(-inf, inf, (6,), float32)
维度 6

顺序:upper_arm_horizontal, lower_arm_horizontal, upper_arm_vertical, lower_arm_vertical, shoulder_velocity, elbow_velocity


奖励函数设计

  • 基础稀疏奖励:鼓励末端进入目标区域(半径 = 0.2
  • 持续奖励:在目标区域内每步提供 0.1 的奖励
  • 距离奖励0.3 * (1.0 - clip(distance / 2.0, 0, 1.0)) 鼓励向目标移动
  • 速度惩罚0.01 * max(0, velocity_magnitude - 2.0) 惩罚过高的速度

初始状态

  • 肩关节角度随机于 [-pi, pi]
  • 肘关节角度随机于 [-pi, pi]
  • 角速度初始化为零

Episode 终止条件

  • Episode 长度由 max_episode_seconds 限制
  • 对观察值进行 NaN 检查

1. 环境预览

uv run scripts/view.py --env acrobot

2. 开始训练

# 使用默认参数训练
uv run scripts/train.py --env acrobot

# 自定义并行环境数
uv run scripts/train.py --env acrobot --num-envs 1024

# 开启训练时渲染
uv run scripts/train.py --env acrobot --render

3. 查看训练进度

uv run tensorboard --logdir runs/acrobot

4. 测试训练结果

# 自动发现最佳策略(推荐)
uv run scripts/play.py --env acrobot

# 手动指定策略文件
uv run scripts/play.py --env acrobot --policy runs/acrobot/nn/best_policy.pickle

提示:策略会从 runs/acrobot/ 中自动选择。你可以使用 --policy 参数覆盖。


配置参数

环境配置

@dataclass
class AcrobotEnvCfg(EnvCfg):
    model_file: str = ".../acrobot.xml"  # MJCF 模型
    max_episode_seconds: float = 10.0
    sim_dt: float = 0.01
    ctrl_dt: float = 0.02
    reset_noise_scale: float = 0.1
    render_spacing: float = 2.0

训练配置PPO 示例)

@rlcfg("acrobot", backend="jax")
@dataclass
class AcrobotPPO(PPOCfg):
    max_env_steps: int = 60_000_000
    check_point_interval: int = 500

    # 覆盖 PPO 配置
    policy_hidden_layer_sizes: tuple[int, ...] = (32, 32)
    value_hidden_layer_sizes: tuple[int, ...] = (32, 32)
    rollouts: int = 64
    learning_epochs: int = 5
    mini_batches: int = 8
    learning_rate: float = 3e-4
    grad_norm_clip: float = 0.1
    clip_predicted_values: bool = False
    value_clip: float = 10.0
    entropy_loss_scale: float = 0.1
    learning_rate_scheduler_kl_threshold: float = 0.02
    discount_factor: float = 0.995
    lambda_param: float = 0.97
    ratio_clip: float = 0.2
    value_loss_scale: float = 0.5
    random_timesteps: int = 0
    learning_starts: int = 0
    kl_threshold: float = 0.03

预期训练结果

  1. Acrobot 能够摆动双臂到达目标位置
  2. 末端能够稳定地停留在目标区域内
  3. 过高的震荡通过速度惩罚得到减少
  4. 策略能够以平滑的动作高效地接近目标