第十二讲、Isaaclab中使用RL对智能体进行训练

0 前言

官方教程:https://isaac-sim.github.io/IsaacLab/main/source/tutorials/03_envs/run_rl_training.html
Isaacsim+Isaaclab安装:https://blog.csdn.net/m0_47719040/article/details/146389391?spm=1001.2014.3001.5502

在前面的教程中我们已经学习了如何定义强化学习任务环境、并将其注册到gym中。以及使用智能体与环境交互。本节将在此基础上学习如何使用强化学习来训练智能体完成指定任务。

虽然envs.ManagerBasedRLEnv是按照gymnasium.Env的接口规范的,但并不是一个完全的gym环境。

  • 数据输入/输出类型不同
    • 标准gym库:使用Numpy数组(np.ndarray)
    • Isaaclab:使用Pytorch张量(torch.Tensor)
  • 数据维度不同
    • Isaaclab:Isaaclab是向量化环境,所有数据的第一维度为并行环境数量( [ n u m _ e n v s , o b s _ d i m ] [num\_envs,obs\_dim] [num_envs,obs_dim])。
    • 标准gym:仅处理单个环境( [ o b s _ d i m ] [obs\_dim] [obs_dim]

主流RL库的接口要求对比

库名称期望的观测类型动作输入类型并行环境支持方式设备要求
Stable-Baselines3np.ndarray列表np.ndarray列表SubprocVecEnv多进程CPU
RL-Gamestorch.Tensortorch.Tensor原生批量处理GPU
RSL-RLtorch.Tensortorch.Tensor完全GPU流水线GPU
SKRLtorch.Tensortorch.Tensor原生支持GPU/CPU

由于每个库都各不相同,所以Isaaclab给出了一种接口适配解决方案。即Isaaclab中的isaaclab_rl库,该库给出了对应不同主流RL库的包装器(RL-Games Wrapper、RSL-RL Wrapper、SKRL Wrapper、Stable-Baselines3 Wrapper)。官方文档:https://isaac-sim.github.io/IsaacLab/main/source/api/lab_rl/isaaclab_rl.html,设计目标:

  • 数据转换:在PyTorch张量和NumPy数组之间自动转换
  • 设备管理:确保数据在CPU和GPU之间正确传输
  • 接口兼容:将向量化环境转换为各库所需的格式(如SB3的VecEnv)

教程对应的脚本为train.pyscripts/reinforcement_learning/sb3目录下。

运行该程序:

  • 进入安装 isaac lab 时创建的conda虚拟环境
  • 在该环境下进入 isaac sim文件夹中运行source setup_conda_env.sh
  • 终端中输入./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Cartpole-v0 --num_envs 32运行你的代码,会基于工作流RL环境进行训练。
    在这里插入图片描述

2 包装流程

本教程的重点是创建环境并使用Stable-Baselines3 Wrapper进行包装。代码中包装器的应用顺序直接影响数据流处理方式,典型层次结构如下:

graph LR
    A[原始Isaac环境] --> B[gymnasium.wrappers.RecordVideo]
    B --> C[wrappers.sb3.Sb3VecEnvWrapper]
    C --> D[stable_baselines3.common.vec_env.VecNormalize]

1、RecordVideo 包装器

  • 核心功能:
    • 视频录制:定期截取环境状态生成训练过程视频
    • 触发机制:基于步数间隔或自定义条件启动录制
  • 关键参数配置
env = gym.wrappers.RecordVideo(
    env,
    video_folder="logs/videos",
    step_trigger=lambda step: step % 5000 == 0,  # 每5000步录制一次
    video_length=300,  # 每次录制300帧
    disable_logger=True  # 禁用默认日志避免冲突
)
  • 性能影响
    • 显存占用:开启渲染时增加约10%显存使用
    • 计算开销:帧捕获引入约5%的步进时间延迟

2、Sb3VecEnvWrapper 包装器

  • 接口适配需求
    • 数据类型转换:torch.Tensor ↔ np.ndarray
    • 设备管理:GPU张量 → CPU内存的异步传输
    • 批量处理:将向量化环境拆分为VecEnv期望的列表格式
  • 关键代码实现
class Sb3VecEnvWrapper(VecEnvWrapper):
    def __init__(self, env):
        super().__init__(env)
        # 设备自动检测
        self.device = env.unwrapped.device
        # 创建 pinned memory 缓冲区加速传输
        self._obs_buffer = torch.empty(
            (env.num_envs,) + env.obs_space.shape, 
            dtype=torch.float32, 
            pin_memory=True
        )

    def reset(self):
        obs = self.env.reset()
        self._obs_buffer.copy_(obs, non_blocking=True)
        return self._obs_buffer.cpu().numpy()

    def step_async(self, actions):
        # 转换NumPy数组为Tensor并发送到设备
        self.actions = torch.as_tensor(actions, device=self.device)

    def step_wait(self):
        obs, rewards, dones, infos = self.env.step(self.actions)
        self._obs_buffer.copy_(obs, non_blocking=True)
        return (
            self._obs_buffer.cpu().numpy(),
            rewards.cpu().numpy(),
            dones.cpu().numpy(),
            self._process_infos(infos)
        )

3、VecNormalize 包装器

  • 数据标准化

    • 观测归一化:将不同量纲的观测特征缩放到[-1,1]范围
    • 奖励缩放:防止梯度爆炸,提升训练稳定性
  • 关键参数配置

env = VecNormalize(
    env,
    norm_obs=True,        # 启用观测标准化
    norm_reward=True,     # 启用奖励标准化
    clip_obs=10.0,        # 观测裁剪范围[-10,10]
    clip_reward=10.0,     # 奖励裁剪范围
    gamma=0.99            # 用于奖励标准化的折扣因子
)

3 代码执行

scripts/reinforcement_learning/sb3/train.py从 Stable-Baselines3 训练一个 PPO 网络来解决车杆平衡问题。

非可视化环境下训练

./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Cartpole-v0 --num_envs 64 --headless

可视化训练

./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Cartpole-v0 --num_envs 64

记录训练期间的视频并做可视化训练

./isaaclab.sh -p scripts/reinforcement_learning/sb3/train.py --task Isaac-Cartpole-v0 --num_envs 64 --video

在新窗口中输入下述代码可以查看日志

./isaaclab.sh -p -m tensorboard.main --logdir logs/sb3/Isaac-Cartpole-v0

可以查看训练后的结果

# execute from the root directory of the repository
./isaaclab.sh -p scripts/reinforcement_learning/sb3/play.py --task Isaac-Cartpole-v0 --num_envs 32 --use_last_checkpoint

后续将会对train.py代码做更详细的解释

### 在 Isaac Sim使用强化学习训练机械臂 #### 环境准备 为了在 Isaac Sim 中利用强化学习训练机械臂,需先确保已按照官方文档完成环境配置和依赖安装[^1]。这包括但不限于 CUDA 和 NVIDIA 驱动程序的设置。 #### 安装 Isaac Lab 鉴于 IsaacGymEnvs 已经停止维护并转向了更先进的 Isaac Lab 开源项目,建议依据最新的安装指南来部署 Isaac Lab 应用程序。此过程涉及下载合适的 Isaac Sim 版本以及满足其最低硬件需求。 #### 构建仿真场景 创建适合机械臂操作的任务环境至关重要。通过 Isaac Sim 的图形界面或 Python API 可以轻松搭建此类虚拟工作区。对于特定应用如抓取物体、装配零件等,则要精心设计相应的物理参数与视觉效果以增强模拟的真实性。 #### 设计奖励函数 定义合理的奖励机制是成功实施强化学习算法的关键因素之一。针对机械臂控制问题,通常会考虑位置误差、姿态偏差等因素作为负向惩罚项;而当达到目标状态时给予正反馈激励。具体实现方式取决于所选用的学习框架和支持库。 #### 编写训练脚本 下面是一个简单的 PyTorch RL 训练循环模板: ```python import torch from omni.isaac.orbit_envs import make_vec_env, VecEnvWrapper def train_robot_arm(): env = make_vec_env("IsaacArmReaching-v0", num_envs=8) obs_space = env.observation_space act_space = env.action_space policy_net = Policy(obs_space.shape[0], act_space.shape[0]) target_net = TargetPolicy() optimizer = torch.optim.Adam(policy_net.parameters(), lr=1e-4) for episode in range(num_episodes): observations = env.reset() while True: actions = select_action(observations, policy_net) next_obs, rewards, dones, info = env.step(actions) loss = compute_loss(rewards, observations, actions, next_obs, done_flags=dones) optimizer.zero_grad() loss.backward() optimizer.step() if all(dones): break train_robot_arm() ``` 上述代码片段展示了如何初始化多实例化的机械臂到达任务(`IsaacArmReaching-v0`)环境,并执行基本策略梯度更新逻辑。实际开发过程中可能还需要加入更多细节处理,比如经验回放缓冲池、探索噪声注入等技术改进措施。 #### 测试评估模型表现 经过充分迭代后的神经网络应该能够在测试集中展现出良好的泛化能力。此时可以借助 Isaac Sim 提供的强大可视化工具观察机械臂的动作流畅性和准确性,进而调整超参直至满意为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值