安装
下载库
bash
git clone https://github.com/isaac-sim/IsaacGymEnvs.git
激活虚拟环境
bash
conda activate IsaacGymEnvs
进入文件夹
bash
cd IsaacGymEnvs
安装依赖
bash
pip install -e .
运行DEMO
打开另一个终端,进入文件夹
bash
cd ~/IsaacGymEnvs/isaacgymenvs
运行历程(shadowhand手旋转魔方)
bash
python train.py task=ShadowHand task.env.numEnvs=4096 train.params.config.minibatch_size=16384
运行图:

实际上,Bi-DexHands 的代码结构是直接从 IsaacGymEnvs 继承和魔改来的
python
根目录
├── cfg/ # [配置中心] 使用 Hydra 管理所有参数
├── isaacgymenvs/ # [核心代码包]
│ ├── tasks/ # [环境定义] 物理世界、机器人、奖励函数的定义 (最核心)
│ │ ├── base/ # └── vec_task.py (所有任务的父类,定义标准接口)
│ │ ├── humanoid.py # └── 具体任务实现 (如人形机器人)
│ │ └── ...
│ ├── utils/ # [工具箱] 数学计算、随机化工具 (大多是 JIT 编译的)
│ ├── learning/ # [算法接口] (主要是对 rl_games 的封装)
│ └── pbt/ # [高级功能] 基于种群的训练 (Population Based Training)
├── assets/ # [资产] URDF/MJCF 机器人模型文件、纹理等
└── train.py # [入口] 程序启动点
核心模块详细解析
1. 入口与配置 (train.py & cfg/)
-
文件:train.py, cfg/config.yaml, cfg/task/*.yaml, cfg/train/*.yaml
-
作用:程序的指挥塔。它负责解析命令行参数,并组合出完整的配置字典。
-
关键技术 :Hydra (一个基于 yaml 的配置管理工具)。
-
流程:
-
用户运行 python train.py task=Ant。
-
Hydra 读取 cfg/config.yaml。
-
根据 task=Ant,加载 cfg/task/Ant.yaml(定义物理环境参数)和 cfg/train/AntPPO.yaml(定义 PPO 算法参数)。
-
初始化 isaacgymenvs.make() 创建环境。
-
2. 任务系统 (isaacgymenvs/tasks/) ------ 这是需要读写的重点
这是定义"智能体在做什么"的地方。
-
基类 (base/vec_task.py):
-
作用:连接 Isaac Gym 底层 C++ 接口和 Python RL 算法的桥梁。
-
接口 :它实现了类似 OpenAI Gym 的接口 (step, reset),但它是向量化的(Vectorized),即一次性处理数千个环境的数据。
-
关键代码:它负责分配 GPU 显存 (gym.acquire_..._tensor),这是高性能的关键。
-
-
具体任务 (e.g., shadow_hand.py, humanoid.py):
-
内容:
-
create_sim(): 加载地面、加载机器人 URDF 文件、创建数千个副本。
-
pre_physics_step(actions): 物理模拟前的准备。通常负责将神经网络输出的 -1 到 1 的 Action 转换成电机需要的力矩或位置目标。
-
post_physics_step(): 物理模拟后的处理。调用计算奖励和观测的函数,并判断哪些环境需要 Reset。
-
compute_reward() : 灵魂函数。定义什么行为是好的。
-
compute_observations(): 定义机器人能看到什么(关节位置、速度、目标距离等)。
-
-
3. 工具箱 (isaacgymenvs/utils/)
-
文件:torch_jit_utils.py (最重要)
-
作用:因为数据全在 GPU 上(PyTorch Tensor),我们不能用 numpy 或 math 库。这个文件包含了一堆用 @torch.jit.script 装饰的数学函数。
-
常用函数:
-
quat_rotate: 四元数旋转
-
tensor_clamp: 限制数值范围
-
unscale: 将归一化数据还原
-
注意:在写奖励函数时,会大量调用这里的函数
-
4. 算法与训练 (learning/ & 外部 rl_games)
-
内容 :IsaacGymEnvs 默认深度集成了 rl_games 这个第三方库来实现 PPO 算法。
-
作用:
-
isaacgymenvs/learning 下的代码大多是用于适配 rl_games 的胶水代码。
-
真正的 PPO 更新逻辑(Policy Loss, Value Loss 计算)在 rl_games 库里,而不是在 IsaacGymEnvs 的代码里。
-
如果你想改算法(比如改 PPO 的公式),你需要去改 rl_games 库,或者像 Bi-DexHands 那样自己写一个 ppo.py
-
关键接口与数据流 (The Loop)
理解这个数据流,你就掌握了它的命脉:
-
初始化阶段:
-
train.py -> isaacgymenvs.make() -> Task.init
-
Action: 加载物理资产,创建 num_envs (例如 4096) 个环境实例。
-
Memory: 在 GPU 上申请巨大的 Tensor 显存块(用于存储 4096 个机器人的状态)。
-
-
运行循环 (Step Loop) :
这是 rl_games 调用 VecTask.step() 时发生的:
python
def step(self, actions):
# 1. 预处理动作 (Pre-Physics)
# 将神经网络输出 (Actions) -> 转化为电机目标位置 (Targets)
self.pre_physics_step(actions)
# 2. 物理仿真 (Simulation) - 耗时最长
# C++ 底层开始计算 F=ma,碰撞检测等
self.gym.simulate(self.sim)
self.gym.fetch_results(self.sim, True)
# 3. 刷新张量 (Refresh Tensors)
# 只有调用这个,GPU 里的 PyTorch Tensor 才会更新为最新的物理状态
self.gym.refresh_dof_state_tensor(self.sim)
...
# 4. 后处理 (Post-Physics)
# 计算当前的 Observation (obs_buf) 和 Reward (rew_buf)
self.post_physics_step()
# 5. 返回给 PPO
return self.obs_buf, self.rew_buf, self.reset_buf, self.extras
IsaacGymEnvs 与 Bi-DexHands 的关系
你之前使用的 Bi-DexHands 是基于 IsaacGymEnvs 的旧版本框架开发的,但做了以下改动:
-
算法层:Bi-DexHands 为了支持多智能体(MARL)和特定研究,自己实现了一套 algorithms/ 目录(包含你之前看到的 ppo.py),这比直接调 rl_games 更容易修改算法细节,但也更繁琐。
-
任务层:Bi-DexHands 专注于灵巧手,所以它的 tasks/ 目录下全是各种手部任务(ShadowHand, AllegroHand 等),而 IsaacGymEnvs 包含更广泛的通用机器人(四足、两足、四旋翼等)。
现有的灵巧手benchmark:
https://github.com/isaac-sim/IsaacGymEnvs
https://github.com/Farama-Foundation/D4RL
https://github.com/leap-hand/LEAP_Hand_Sim
https://github.com/UM-ARM-Lab/MFR_benchmark