修改现有的 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 )实例分别替换为 H1EnvH1EnvCfg 。这是为了在注册环境时避免名称冲突而必要的。

一旦更改名称完成,我们就开始在名称为 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文件加载和配置它。

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
训练结果 Isaac-H1-Direct-v0 任务

在本教程中,我们学习了如何对现有环境进行轻微修改,而不影响原始代码。

重要的是要注意,虽然需要进行的更改可能很小,但它们不一定能在第一次尝试时成功,因为在被修改的环境中可能存在对原始资产的更深层依赖关系。在这些情况下,建议详细分析可用示例的代码,以便进行适当的调整。