其代码框架主要可以分为以下几个核心板块:入口与配置、环境定义 (Tasks)、算法实现 (Algorithms) 和 工具类 (Utils) 

代码结构框架

Bi-DexHands/
├── assets/                 # [关键] 存放机器人和物体的模型文件 (URDF, MJCF, Meshes)
├── bidexhands/
│   ├── algorithms/         # 存放RL/MARL算法的实现 (如 ma_ppo, happo 等)
│   ├── tasks/              # [核心] 环境定义的源代码
│   │   ├── shadow_hand_over.py  # 具体任务:例如双手交接
│   │   ├── shadow_hand_catch.py # 具体任务:例如接球
│   │   ├── base/           # 基础类,定义了通用的仿真接口
│   │   └── ...
│   └── utils/              # 工具脚本 (解析配置、处理数据等)
├── cfg/                    # [关键] 配置文件目录
│   ├── config.yaml         # 总入口配置
│   ├── task/               # 环境的具体参数 (重力、物理参数、奖励权重)
│   │   ├── ShadowHandOver.yaml
│   │   └── ...
│   └── train/              # 训练算法的超参数 (学习率、Batch size等)
│       ├── ShadowHandOverPPO.yaml
│       └── ...
├── train.py                # 训练入口脚本
└── ...

核心模块详解

A. 入口脚本 (train.py)

这是整个项目的启动点。它的主要职责是:

  1. 解析参数:利用 Hydra 读取 cfg/ 目录下的配置文件(包括任务配置、算法配置、训练参数)。

  2. 初始化环境:根据配置名称调用 tasks/ 中的对应环境类。

  3. 初始化算法/Runner:实例化 PPO 或 MAPPO 等算法的 Runner。

  4. 启动循环:开始训练(Training)或评估(Evaluation)循环。

B. 环境定义 (bi-dexhands/tasks/) —— 最核心部分

这里定义了物理仿真的具体逻辑。所有的任务类通常继承自一个基类(如 BaseTask 或 Isaac Gym 的 VecTask)。

  • 基类 (base/vec_task.py):处理与 Isaac Gym 引擎的底层交互,如创建仿真场景、分配 GPU 缓冲区。

  • 具体任务 (e.g., shadow_hand_over.py, shadow_hand_catch.py)
    每个任务文件包含一个类(例如 ShadowHandOver),必须实现以下关键方法:

    • create_sim(): 加载资产(Shadow Hand, 物体),设置物理属性,创建数千个并行的环境实例 (Envs)。

    • reset_idx(env_ids): 重置指定环境的状态(当任务失败或超时时)。

    • pre_physics_step(actions): 在物理引擎步进前,将神经网络输出的动作应用到电机上。

    • post_physics_step(): 物理引擎步进后,计算观测 (Observation)、奖励 (Reward) 和 结束信号 (Done)。

    • compute_reward(): 这是设计的难点。定义了引导机器人完成任务的奖励函数(如距离惩罚、姿态奖励等)。

    • compute_observations(): 收集传感器数据(关节角度、物体位置)并填充到 Tensor 中。

C. 算法实现 (bi-dexhands/algorithms/)

Bi-DexHands 的一大特色是原生支持 MARL(多智能体强化学习)。

  • r_mappo/ (Recurrent MAPPO): 这是一个主要使用的算法目录。

    • r_mappo.py: 实现 PPO 更新逻辑(计算 Loss,Clip,反向传播)。

    • algorithm/rMAPPOPolicy.py: 定义 Actor 和 Critic 网络结构。

  • utils/ (Algorithm Utils):

    • act.py: 动作分布采样(Gaussian, Beta 等)。

    • buffer.py: 经验回放池 (Replay Buffer),用于存储 (obs, act, reward, done)。

D. 配置文件 (bi-dexhands/cfg/)

项目使用 Hydra 进行配置管理,结构非常灵活:

  • config.yaml: 总入口,指定默认的任务和算法。

  • task/: 存放具体任务的参数(如 ShadowHandOver.yaml),包括:

    • 物理参数(重力、摩擦力)。

    • 环境参数(最大步数、重置阈值)。

    • 观测空间和动作空间的维度。

  • train/: 存放算法超参数(如 ShadowHandOverPPO.yaml),包括:

    • 学习率 (lr)、Batch Size、Gamma、Clip range。

    • 网络层数 (Hidden layers)。

数据流与执行逻辑 (Execution Flow)

当你运行 python train.py task=ShadowHandOver 时,系统内部流程如下:

  1. 环境构建 (Environment Build):

    • Isaac Gym 创建物理场景。

    • PyTorch 张量被绑定到仿真器的GPU显存上(实现 Zero-copy 高效数据传输)。

  2. 交互循环 (Rollout Loop):

    • Get Action: Agent 网络根据当前的 obs_buf 计算 action。

    • Step: 动作传入环境,物理引擎运行一步。

    • Get Data: 环境返回新的 obs, reward, done。

    • Store: 数据存入 ReplayBuffer。

  3. 训练更新 (Training Update):

    • 当 Buffer 存满一定步数后,计算优势函数 (GAE)。

    • 从 Buffer 中采样 Batch,计算 Policy Loss 和 Value Loss。

    • 更新神经网络权重。

项目地址

PKU-MARL/DexterousHands: This is a library that provides dual dexterous hand manipulation tasks through Isaac Gym

后续大概率会继续更新的

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐