修改现有的 Direct RL 环境#

学习如何在 创建直接工作流 RL 环境 中创建任务,在 注册环境 中注册任务,以及在 与 RL Agent 进行训练 中训练任务后,我们现在将探讨如何对现有任务进行小的修改。

有时由于复杂性或与现有示例的变化,有必要从头开始创建任务。然而,在某些情况下,可以从现有代码开始,逐一进行小的修改,以根据我们的需求进行转换。

在本教程中,我们将对直接工作流程中的人形任务进行轻微修改,将简单的人形模型更改为 Unitree H1 人形机器人,而不影响原始代码。

基础代码#

本教程从 isaaclab_tasks.core.locomotion.humanoid 模块中定义的直接工作流 Humanoid 环境开始。

humanoid_direct_env.py 代码
 1# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
 2# All rights reserved.
 3#
 4# SPDX-License-Identifier: BSD-3-Clause
 5
 6"""Direct-workflow Humanoid locomotion environment."""
 7
 8from __future__ import annotations
 9
10from ..locomotion_direct_env import LocomotionDirectEnv
11from .humanoid_direct_env_cfg import HumanoidEnvCfg
12
13
14class HumanoidEnv(LocomotionDirectEnv):
15    """Direct-workflow Humanoid locomotion environment.
16
17    The behavior is fully defined by :class:`LocomotionDirectEnv` and :class:`HumanoidEnvCfg`.
18    """
19
20    cfg: HumanoidEnvCfg

变更说明#

派生并注册新任务#

为避免修改现有任务,在 Isaac Lab 项目的 source/isaaclab_tasks/isaaclab_tasks/core/locomotion/humanoid 目录下创建 h1_env.py 。下面的新类继承现有环境和配置,只改变机器人相关的数据。

将派生任务注册为 Isaac-H1-Direct-v0。为此,修改同一工作目录中的 __init__.py 文件,添加以下条目。环境注册的详细说明见 注册环境 教程。

提示

如果任务中的变化很小,则很可能可以使用相同的 RL 库智能体配置成功训练它。否则,建议创建新的配置文件(在 kwargs 参数下注册时调整其名称),以避免更改原始配置。

from .h1_env import H1Env, H1EnvCfg
gym.register(
    id="Isaac-H1-Direct-v0",
    entry_point="isaaclab_tasks.core.locomotion.humanoid:H1Env",
    disable_env_checker=True,
    kwargs={
        "env_cfg_entry_point": H1EnvCfg,
        "rl_games_cfg_entry_point": f"{agents.__name__}:rl_games_direct_ppo_cfg.yaml",
        "rsl_rl_cfg_entry_point": f"{agents.__name__}.rsl_rl_ppo_cfg:HumanoidDirectPPORunnerCfg",
        "default_agent": "rsl_rl",
        "skrl_cfg_entry_point": f"{agents.__name__}:skrl_direct_ppo_cfg.yaml",
    },
)

改变机器人#

新建 h1_env.py 中的 H1SceneCfg 类声明环境要构建的资产。本例中,其 robot 属性保存目标关节体配置。

Unitree H1 机器人已包含在 Isaac Lab 资产扩展( isaaclab_assets )中,因此直接导入并替换 H1SceneCfg.robot 属性即可,如下所示。还需修改 joint_gears 属性,因为它保存机器人专用的配置值。

提示

如果目标机器人不包含在 Isaac Lab 资产扩展中,可以通过使用 ArticulationCfg 类从 USD 文件加载和配置它。

from isaaclab.assets import ArticulationCfg
from isaaclab.utils import configclass, replace
from isaaclab_assets import H1_CFG

from isaaclab_tasks.core.locomotion.humanoid.humanoid_direct_env import HumanoidEnv
from isaaclab_tasks.core.locomotion.humanoid.humanoid_direct_env_cfg import HumanoidDirectSceneCfg, HumanoidEnvCfg
@configclass
class H1SceneCfg(HumanoidDirectSceneCfg):
    robot: ArticulationCfg = replace(H1_CFG, prim_path="{ENV_REGEX_NS}/Robot")

更换机器人后,需要控制的关节数、组成关节体的刚体数等也可能改变。因此,应定义派生的环境配置,并调整依赖机器人的值,例如动作空间和观测空间。环境实现本身无需修改。

H1 有 19 个受控关节。继承的观测函数包含 12 个根节点和目标值、19 个关节位置、19 个关节速度、19 个动作,以及两个足部的 12 个力旋量分量,共 81 个值。请将 feet_body_names 设为 H1 的踝部连杆名称,使关节力旋量传感器选择正确的刚体,而不是沿用基类 Humanoid 的足部名称。

@configclass
class H1EnvCfg(HumanoidEnvCfg):
    action_space = 19
    observation_space = 81
    scene: H1SceneCfg = H1SceneCfg(num_envs=4096, env_spacing=5.0, replicate_physics=True, clone_in_fabric=True)
    # the gears are keyed by joint name expression, so they are independent of the joint ordering
    joint_gears: dict[str, float] = {".*": 50.0}
    feet_body_names: list[str] = [".*ankle_link"]


class H1Env(HumanoidEnv):
    cfg: H1EnvCfg

代码执行#

完成了轻微修改之后,类似于之前的教程,我们可以使用其中一个可用的强化学习工作流来对该任务进行训练。

uv run --extra rl-games isaaclab train --rl_library rl_games --task Isaac-H1-Direct-v0
./isaaclab.sh train --rl_library rl_games --task Isaac-H1-Direct-v0

当训练完成时,我们可以使用以下命令可视化结果。要停止仿真,您可以关闭窗口,或者在启动仿真的终端中按下 Ctrl+C 。

uv run --extra rl-games isaaclab play --rl_library rl_games --task Isaac-H1-Direct-v0 --num_envs 64 --viz kit
./isaaclab.sh play --rl_library rl_games --task Isaac-H1-Direct-v0 --num_envs 64 --viz kit
训练 Isaac-H1-Direct-v0 任务的 `result`

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

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