修改现有的 Direct RL 环境#
学习如何在 创建直接工作流RL环境 中创建任务,在 注册环境 中注册任务,以及在 与 RL Agent 进行训练 中训练任务后,我们现在将探讨如何对现有任务进行小的修改。
有时由于复杂性或与现有示例的变化,有必要从头开始创建任务。然而,在某些情况下,可以从现有代码开始,逐一进行小的修改,以根据我们的需求进行转换。
在本教程中,我们将对直接工作流程中的人形任务进行轻微修改,将简单的人形模型更改为 Unitree H1 人形机器人,而不影响原始代码。
基础代码#
对于本教程,我们从 omni.isaac.lab_tasks.direct.humanoid
模块定义的直接工作流 Humanoid 环境开始。
人形环境的代码 humanoid_env.py
1# Copyright (c) 2022-2024, The Isaac Lab Project Developers.
2# All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5
6from __future__ import annotations
7
8from omni.isaac.lab_assets import HUMANOID_CFG
9
10import omni.isaac.lab.sim as sim_utils
11from omni.isaac.lab.assets import ArticulationCfg
12from omni.isaac.lab.envs import DirectRLEnvCfg
13from omni.isaac.lab.scene import InteractiveSceneCfg
14from omni.isaac.lab.sim import SimulationCfg
15from omni.isaac.lab.terrains import TerrainImporterCfg
16from omni.isaac.lab.utils import configclass
17
18from omni.isaac.lab_tasks.direct.locomotion.locomotion_env import LocomotionEnv
19
20
21@configclass
22class HumanoidEnvCfg(DirectRLEnvCfg):
23 # env
24 episode_length_s = 15.0
25 decimation = 2
26 action_scale = 1.0
27 action_space = 21
28 observation_space = 75
29 state_space = 0
30
31 # simulation
32 sim: SimulationCfg = SimulationCfg(dt=1 / 120, render_interval=decimation)
33 terrain = TerrainImporterCfg(
34 prim_path="/World/ground",
35 terrain_type="plane",
36 collision_group=-1,
37 physics_material=sim_utils.RigidBodyMaterialCfg(
38 friction_combine_mode="average",
39 restitution_combine_mode="average",
40 static_friction=1.0,
41 dynamic_friction=1.0,
42 restitution=0.0,
43 ),
44 debug_vis=False,
45 )
46
47 # scene
48 scene: InteractiveSceneCfg = InteractiveSceneCfg(num_envs=4096, env_spacing=4.0, replicate_physics=True)
49
50 # robot
51 robot: ArticulationCfg = HUMANOID_CFG.replace(prim_path="/World/envs/env_.*/Robot")
52 joint_gears: list = [
53 67.5000, # lower_waist
54 67.5000, # lower_waist
55 67.5000, # right_upper_arm
56 67.5000, # right_upper_arm
57 67.5000, # left_upper_arm
58 67.5000, # left_upper_arm
59 67.5000, # pelvis
60 45.0000, # right_lower_arm
61 45.0000, # left_lower_arm
62 45.0000, # right_thigh: x
63 135.0000, # right_thigh: y
64 45.0000, # right_thigh: z
65 45.0000, # left_thigh: x
66 135.0000, # left_thigh: y
67 45.0000, # left_thigh: z
68 90.0000, # right_knee
69 90.0000, # left_knee
70 22.5, # right_foot
71 22.5, # right_foot
72 22.5, # left_foot
73 22.5, # left_foot
74 ]
75
76 heading_weight: float = 0.5
77 up_weight: float = 0.1
78
79 energy_cost_scale: float = 0.05
80 actions_cost_scale: float = 0.01
81 alive_reward_scale: float = 2.0
82 dof_vel_scale: float = 0.1
83
84 death_cost: float = -1.0
85 termination_height: float = 0.8
86
87 angular_velocity_scale: float = 0.25
88 contact_force_scale: float = 0.01
89
90
91class HumanoidEnv(LocomotionEnv):
92 cfg: HumanoidEnvCfg
93
94 def __init__(self, cfg: HumanoidEnvCfg, render_mode: str | None = None, **kwargs):
95 super().__init__(cfg, render_mode, **kwargs)
变更说明#
复制文件并注册新任务#
为了避免修改现有任务的代码,我们将复制包含Python代码的文件,并对该副本进行修改。然后,在Isaac Lab项目 source/extensions/omni.isaac.lab_tasks/omni/isaac/lab_tasks/direct/humanoid
文件夹中,我们将复制 humanoid_env.py
文件并将其重命名为 h1_env.py
。
在代码编辑器中打开 h1_env.py
文件,并将所有人形任务名称( HumanoidEnv
)及其配置( HumanoidEnvCfg
)实例分别替换为 H1Env
和 H1EnvCfg
。这是为了在注册环境时避免名称冲突而必要的。
一旦更改名称完成,我们就开始在名称为 Isaac-H1-Direct-v0
的任务下添加新条目。为此,我们修改同一工作文件夹中的 __init__.py
文件,并添加以下条目。有关环境注册的更多详细信息,请参考 注册环境 教程。
提示
如果任务中的变化很小,则很可能可以使用相同的 RL 库智能体配置成功训练它。否则,建议创建新的配置文件(在 kwargs
参数下注册时调整其名称),以避免更改原始配置。
from .h1_env import H1Env, H1EnvCfg
gym.register(
id="Isaac-H1-Direct-v0",
entry_point="omni.isaac.lab_tasks.direct.humanoid:H1Env",
disable_env_checker=True,
kwargs={
"env_cfg_entry_point": H1EnvCfg,
"rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_ppo_cfg.yaml",
"rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:HumanoidPPORunnerCfg",
"skrl_cfg_entry_point": f"{agents.__name__}:skrl_ppo_cfg.yaml",
},
)
改变机器人#
H1EnvCfg
类(在新创建的 h1_env.py
文件中)封装了环境的配置值,包括要实例化的资产。特别是在这个例子中,robot
属性保存着目标关节配置。
由于 Unitree H1 机器人包含在 Isaac Lab 资产扩展 (omni.isaac.lab_assets
) 中,我们可以直接导入并进行替换 (在 H1EnvCfg.robot
属性下),如下所示。请注意,我们还需要修改 joint_gears
属性,因为它包含特定于机器人的配置值。
提示
如果目标机器人不包含在Isaac Lab资产扩展中,可以通过使用 ArticulationCfg
类从USD文件加载和配置它。
查看 Isaac-Franka-Cabinet-Direct-v0 源代码以获取从 USD 文件加载和配置机器人的示例。
请参考 Importing a New Asset 教程,了解如何从 URDF 或 MJCF 文件以及其他格式导入资产的详细信息。
from omni.isaac.lab_assets import H1_CFG
robot: ArticulationCfg = H1_CFG.replace(prim_path="/World/envs/env_.*/Robot")
joint_gears: list = [
50.0, # left_hip_yaw
50.0, # right_hip_yaw
50.0, # torso
50.0, # left_hip_roll
50.0, # right_hip_roll
50.0, # left_shoulder_pitch
50.0, # right_shoulder_pitch
50.0, # left_hip_pitch
50.0, # right_hip_pitch
50.0, # left_shoulder_roll
50.0, # right_shoulder_roll
50.0, # left_knee
50.0, # right_knee
50.0, # left_shoulder_yaw
50.0, # right_shoulder_yaw
50.0, # left_ankle
50.0, # right_ankle
50.0, # left_elbow
50.0, # right_elbow
]
机器人发生了变化,因此控制的关节数量或构成关节的刚体数量也发生了变化,例如。因此,还需要调整环境配置中的其他值,这些值依赖于机器人的特性,例如观察和动作空间中的元素数量。
action_space = 19
observation_space = 69
代码执行#
完成了轻微修改之后,类似于之前的教程,我们可以使用其中一个可用的强化学习工作流来对该任务进行训练。
./isaaclab.sh -p source/standalone/workflows/rl_games/train.py --task Isaac-H1-Direct-v0 --headless
当训练完成时,我们可以使用以下命令可视化结果。要停止仿真,您可以关闭窗口,或者在启动仿真的终端中按下 Ctrl+C
。
./isaaclab.sh -p source/standalone/workflows/rl_games/play.py --task Isaac-H1-Direct-v0 --num_envs 64
在本教程中,我们学习了如何对现有环境进行轻微修改,而不影响原始代码。
重要的是要注意,虽然需要进行的更改可能很小,但它们不一定能在第一次尝试时成功,因为在被修改的环境中可能存在对原始资产的更深层依赖关系。在这些情况下,建议详细分析可用示例的代码,以便进行适当的调整。