加载自定义四足机器人环境¶
在本教程中,我们将学习如何使用 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
决定了每个回合在 截断
前的步数,这里我们将其设置为 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 - 训练你的代理¶
最后,我们完成了,可以使用强化学习算法来训练一个代理让 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
框架按照本指南进行操作。