加载自定义四足机器人环境¶
在本教程中,我们将看到如何使用 MuJoCo/Ant-v5
框架创建一个四足步行环境,使用模型文件(以 .xml
结尾),而无需创建新类。
步骤
获取你的机器人 MJCF (或 URDF) 模型文件。
创建你自己的模型(参见 指南),或者,
查找现成的模型(在本教程中,我们将使用来自 MuJoCo Menagerie 集合的模型)。
使用
xml_file
参数加载模型。调整环境参数以获得所需的行为。
调整环境模拟参数。
调整环境终止参数。
调整环境奖励参数。
调整环境观测参数。
训练智能体来移动你的机器人。
读者应熟悉 Gymnasium
API 和库、机器人技术的基础知识,以及包含的 Gymnasium/MuJoCo
环境及其使用的机器人模型。熟悉 MJCF 文件模型格式和 MuJoCo
模拟器不是必需的,但建议熟悉。
设置¶
我们需要 gymnasium>=1.0.0
。
pip install "gymnasium>=1.0.0"
步骤 0.1 - 下载机器人模型¶
在本教程中,我们将从优秀的 MuJoCo Menagerie 机器人模型集合中加载 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_skip
、reset_noise_scale
和 max_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
决定了每个 episode 在 truncation
之前的步数,这里我们将其设置为 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_unhealthy
和 healthy_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_weight
、ctrl_cost_weight
、contact_cost_weight
、healthy_reward
和 main_body
。
对于参数 forward_reward_weight
、ctrl_cost_weight
、contact_cost_weight
和 healthy_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_observation
和 exclude_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 - 训练你的智能体¶
最后,我们完成了,我们可以使用 RL 算法来训练智能体行走/运行 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
框架遵循本指南。