加载自定义四足机器人环境

在本教程中,我们将学习如何使用 MuJoCo/Ant-v5 框架创建一个四足行走环境,使用一个模型文件(以 .xml 结尾)而无需创建新类。

步骤:

  1. 获取你的机器人 MJCF (或 URDF) 模型文件。

    • 创建你自己的模型(参见 指南)或,

    • 找到一个现成的模型(在本教程中,我们将使用 MuJoCo Menagerie 集合中的一个模型)。

  2. 使用 xml_file 参数加载模型。

  3. 调整环境参数以获得所需的行为。

    1. 调整环境模拟参数。

    2. 调整环境终止参数。

    3. 调整环境奖励参数。

    4. 调整环境观察参数。

  4. 训练一个代理来移动你的机器人。

读者应熟悉 Gymnasium API 和库、机器人学基础,以及他们使用的机器人模型所包含的 Gymnasium/MuJoCo 环境。熟悉 MJCF 文件模型格式和 MuJoCo 模拟器不是必需的,但建议熟悉。

设置

我们将需要 gymnasium>=1.0.0

pip install "gymnasium>=1.0.0"

步骤 0.1 - 下载机器人模型

在本教程中,我们将从优秀的 MuJoCo Menagerie 机器人模型集合中加载 Unitree Go1 机器人。Unitree Go1 机器人在平坦地形场景中

Go1 是一个四足机器人,控制它移动是一个重要的学习问题,比 Gymnasium/MuJoCo/Ant 环境要困难得多。

我们可以下载整个 MuJoCo Menagerie 集合(其中包括 Go1),

git clone https://github.com/google-deepmind/mujoco_menagerie.git

你可以使用任何其他四足机器人来完成本教程,只需根据你的机器人调整环境参数值。

步骤 1 - 加载模型

要加载模型,我们只需在 Ant-v5 框架中使用 xml_file 参数。

import gymnasium
import numpy as np
env = gymnasium.make('Ant-v5', xml_file='./mujoco_menagerie/unitree_go1/scene.xml')

虽然这足以加载模型,但我们还需要调整一些环境参数以获得我们环境中所需的行为,目前我们还将显式设置模拟、终止、奖励和观察参数,我们将在下一步中调整这些参数。

env = gymnasium.make(
    'Ant-v5',
    xml_file='./mujoco_menagerie/unitree_go1/scene.xml',
    forward_reward_weight=0,
    ctrl_cost_weight=0,
    contact_cost_weight=0,
    healthy_reward=0,
    main_body=1,
    healthy_z_range=(0, np.inf),
    include_cfrc_ext_in_observation=True,
    exclude_current_positions_from_observation=False,
    reset_noise_scale=0,
    frame_skip=1,
    max_episode_steps=1000,
)

步骤 2 - 调整环境参数

调整环境参数对于获得所需的学习行为至关重要。在以下小节中,鼓励读者参考 参数的文档 以获取更详细的信息。

步骤 2.1 - 调整环境模拟参数

感兴趣的参数是 frame_skipreset_noise_scalemax_episode_steps

我们希望调整 frame_skip 参数以使 dt 达到一个可接受值(典型值为 dt \(\in [0.01, 0.1]\) 秒),

提醒:\(dt = frame\_skip \times model.opt.timestep\),其中 model.opt.timestep 是在MJCF模型文件中选择的积分器时间步长。

我们使用的 Go1 模型的积分时间步长为 0.002,因此通过选择 frame_skip=25,我们可以将 dt 的值设置为 0.05s

为了避免策略过拟合,reset_noise_scale 应设置为一个适合机器人尺寸的值,我们希望该值尽可能大,同时不会使状态的初始分布无效(无论控制动作如何,状态均为 Terminal),对于 Go1,我们选择 0.1 的值。

max_episode_steps 决定了每个回合在 截断 前的步数,这里我们将其设置为 1000 以与基础的 Gymnasium/MuJoCo 环境保持一致,但如果你需要更高的数值,你可以相应地设置。

env = gymnasium.make(
    'Ant-v5',
    xml_file='./mujoco_menagerie/unitree_go1/scene.xml',
    forward_reward_weight=0,
    ctrl_cost_weight=0,
    contact_cost_weight=0,
    healthy_reward=0,
    main_body=1,
    healthy_z_range=(0, np.inf),
    include_cfrc_ext_in_observation=True,
    exclude_current_positions_from_observation=False,
    reset_noise_scale=0.1,  # set to avoid policy overfitting
    frame_skip=25,  # set dt=0.05
    max_episode_steps=1000,  # kept at 1000
)

步骤 2.2 - 调整环境终止参数

终止对于机器人环境非常重要,以避免采样“无用”的时间步。

感兴趣的参数是 terminate_when_unhealthyhealthy_z_range

我们希望将 healthy_z_range 设置为在机器人倒下或跳得非常高时终止环境,这里我们必须为机器人的高度选择一个合理的值,对于 Go1 我们选择 (0.195, 0.75)。注意:healthy_z_range 检查机器人高度的绝对值,因此如果你的场景包含不同高度的层次,它应该设置为 (-np.inf, np.inf)

我们也可以设置 terminate_when_unhealthy=False 来完全禁用终止,这在 Go1 的情况下是不可取的。

env = gymnasium.make(
    'Ant-v5',
    xml_file='./mujoco_menagerie/unitree_go1/scene.xml',
    forward_reward_weight=0,
    ctrl_cost_weight=0,
    contact_cost_weight=0,
    healthy_reward=0,
    main_body=1,
    healthy_z_range=(0.195, 0.75),  # set to avoid sampling steps where the robot has fallen or jumped too high
    include_cfrc_ext_in_observation=True,
    exclude_current_positions_from_observation=False,
    reset_noise_scale=0.1,
    frame_skip=25,
    max_episode_steps=1000,
)

注意:如果你需要不同的终止条件,你可以编写自己的 TerminationWrapper (参见 文档)。

步骤 2.3 - 调整环境奖励参数

感兴趣的参数是 forward_reward_weightctrl_cost_weightcontact_cost_weighthealthy_rewardmain_body

对于参数 forward_reward_weightctrl_cost_weightcontact_cost_weighthealthy_reward,我们需要为我们的机器人选择合理的值,您可以使用默认的 MuJoCo/Ant 参数作为参考,并在需要时根据您的环境进行调整。在 Go1 的情况下,我们只更改了 ctrl_cost_weight,因为它具有更高的执行器力范围。

对于参数 main_body,我们必须选择哪个身体部位是计算 forward_reward 时的主要身体部位(通常在模型文件中被称为“躯干”或“主干”),在 Go1 的情况下,它是 "trunk"(注意:在大多数情况下包括这种情况,可以保留默认值)。

env = gymnasium.make(
    'Ant-v5',
    xml_file='./mujoco_menagerie/unitree_go1/scene.xml',
    forward_reward_weight=1,  # kept the same as the 'Ant' environment
    ctrl_cost_weight=0.05,  # changed because of the stronger motors of `Go1`
    contact_cost_weight=5e-4,  # kept the same as the 'Ant' environment
    healthy_reward=1,  # kept the same as the 'Ant' environment
    main_body=1,  # represents the "trunk" of the `Go1` robot
    healthy_z_range=(0.195, 0.75),
    include_cfrc_ext_in_observation=True,
    exclude_current_positions_from_observation=False,
    reset_noise_scale=0.1,
    frame_skip=25,
    max_episode_steps=1000,
)

注意:如果你需要一个不同的奖励函数,你可以编写自己的 RewardWrapper(参见 文档)。

步骤 2.4 - 调整环境观察参数

感兴趣的参数是 include_cfrc_ext_in_observationexclude_current_positions_from_observation

对于 Go1 ,我们没有特别的理由去改变它们。

env = gymnasium.make(
    'Ant-v5',
    xml_file='./mujoco_menagerie/unitree_go1/scene.xml',
    forward_reward_weight=1,
    ctrl_cost_weight=0.05,
    contact_cost_weight=5e-4,
    healthy_reward=1,
    main_body=1,
    healthy_z_range=(0.195, 0.75),
    include_cfrc_ext_in_observation=True,  # kept the game as the 'Ant' environment
    exclude_current_positions_from_observation=False,  # kept the game as the 'Ant' environment
    reset_noise_scale=0.1,
    frame_skip=25,
    max_episode_steps=1000,
)

注意:如果你需要额外的观察元素(例如额外的传感器),你可以编写自己的 ObservationWrapper(参见 文档)。

步骤 3 - 训练你的代理

最后,我们完成了,可以使用强化学习算法来训练一个代理让 Go1 机器人行走/跑步。注意:如果你按照本指南使用自己的机器人模型,你可能会在训练过程中发现某些环境参数不符合预期,随时可以回到第2步并根据需要进行更改。

import gymnasium

env = gymnasium.make(
    'Ant-v5',
    xml_file='./mujoco_menagerie/unitree_go1/scene.xml',
    forward_reward_weight=1,
    ctrl_cost_weight=0.05,
    contact_cost_weight=5e-4,
    healthy_reward=1,
    main_body=1,
    healthy_z_range=(0.195, 0.75),
    include_cfrc_ext_in_observation=True,
    exclude_current_positions_from_observation=False,
    reset_noise_scale=0.1,
    frame_skip=25,
    max_episode_steps=1000,
)
... # run your RL algorithm

图像

尾声

您可以按照本指南创建大多数四足环境。要创建人形/双足机器人,您也可以使用 Gymnasium/MuJoCo/Humnaoid-v5 框架按照本指南进行操作。

作者: @kallinteris-andreas