🤖 roboto_origin_03 Wiki
首页 / 训练 / 项目结构导读

当你第一次克隆 ATOM01-Train 仓库时,面对分布在两个顶层目录下的数十个子模块,很可能会产生一个疑问:"我应该从哪里开始阅读代码?" 本页面的目的正是为初学者建立一张清晰的代码地图。我们将从顶层仓库划分讲起,逐步拆解 robolab(环境与任务)和 rsl_rl(算法库)两大核心包的职责边界,并沿着一条典型的训练数据流梳理各组件的协作关系。阅读完本页后,你将能够根据需求快速定位到相关源码位置,为后续深入特定模块打下基础。

Sources: README_CN.md

顶层架构:双包协作设计

ATOM01-Train 采用物理环境与学习算法解耦的组织哲学。仓库根目录下有两个并列的 Python 包,分别承担截然不同的职责:

包名 核心职责 对应物理概念 初学者应关注程度
robolab 定义机器人资产、仿真环境、任务配置与训练脚本 IsaacLab 中的 World、Scene、Task ⭐⭐⭐ 首要阅读
rsl_rl 实现 PPO/AMP/Distillation 等学习算法与神经网络 Agent 的大脑(策略网络、价值网络) ⭐⭐ 需要时再深入

这种划分的直接好处是:你可以只修改 robolab 中的奖励函数或地形配置,而完全不用触碰 rsl_rl 中的算法代码。 反之,如果你想实验一种新的网络架构,也只需在 rsl_rlmodules/networks/ 中工作,环境侧不受影响。两者通过 Gymnasium 的环境注册机制与 RslRlVecEnvWrapper 完成对接。

以下 Mermaid 图展示了两个包与外部依赖(IsaacLab/IsaacSim)之间的宏观关系:

graph TB
    subgraph 外部依赖层
        ISAAC[IsaacSim / IsaacLab<br/>物理仿真与基础 API]
    end

    subgraph robolab 包
        ASSETS[assets/robots<br/>机器人 URDF 与关节配置]
        TASKS[tasks/<br/>direct & manager_based<br/>环境逻辑与 MDP]
        SCRIPTS[scripts/<br/>train.py / play.py]
        DATA[data/<br/>运动数据与地形资产]
    end

    subgraph rsl_rl 包
        NETS[networks/<br/>MLP / CNN / Attention]
        MODS[modules/<br/>ActorCritic / AMP / RND]
        ALGS[algorithms/<br/>PPO / PPOAMP / Distillation]
        RUNS[runners/<br/>OnPolicy / AMP / Distillation]
        STORE[storage/<br/>RolloutStorage]
    end

    ISAAC --> TASKS
    ASSETS --> TASKS
    DATA --> TASKS
    TASKS --> SCRIPTS
    SCRIPTS --> RUNS
    RUNS --> ALGS
    ALGS --> MODS
    MODS --> NETS
    RUNS --> STORE
    STORE --> ALGS

Sources: robolab/setup.py, rsl_rl/pyproject.toml

robolab:环境与任务定义

robolab 是你日常开发中最频繁接触的包。它的内部结构围绕**"资产 → 环境 → 脚本 → 数据"**这一链条展开。

1. 机器人资产(robolab/assets/

assets/robots/roboparty.py 中定义了 ATOM01_CFG,它是一个 ArticulationCfg 对象,封装了 URDF 文件路径、碰撞属性、关节驱动参数等。所有任务共享这同一份机器人配置,因此如果你需要调整关节刚度或自碰撞设置,只需修改此处即可全局生效。

Sources: robolab/assets/robots/roboparty.py

2. 任务环境(robolab/tasks/

这是代码量最大、层次最丰富的目录。IsaacLab 支持两种环境编写范式,本项目同时保留了两者:

范式 目录 基类 适合场景 初学者建议
Direct RL tasks/direct/ DirectRLEnv 需要精细控制环境逻辑、奖励计算、观测拼接 建议从这里入手,代码更透明
Manager-based tasks/manager_based/ ManagerBasedRLEnv 利用 IsaacLab 管理器解耦观测、奖励、终止条件 适合熟悉 IsaacLab 后进阶使用

direct/ 目录下,你又能看到三个子模块,它们对应不同的感知或控制增强:

manager_based/ 目录下:

每个任务目录下的 agents/ 子文件夹存放着 RSL-RL 算法配置(如 atom01_agent_cfg.py),它们通过 Hydra 配置系统与训练脚本对接,定义了学习率、网络结构、PPO 超参数等。这其实是算法侧的配置,但放在环境目录中是为了遵循 IsaacLab 的注册惯例。

Sources: robolab/tasks/direct/base/base_env.py, robolab/tasks/manager_based/amp/amp_env.py, robolab/tasks/direct/base/agents/atom01_agent_cfg.py

3. 训练与部署脚本(robolab/scripts/

脚本按用途被清晰地划分为三组:

目录 脚本示例 用途
scripts/rsl_rl/ train.pyplay.py 使用 RSL-RL 进行策略训练与测试
scripts/mujoco/ sim2sim_atom01.py 将训练好的策略导出到 MuJoCo 进行 Sim2Sim 验证
scripts/tools/ list_envs.pyretarget/ 列出已注册环境、运动重定向、地形导出等辅助工具

初学者应重点关注 scripts/rsl_rl/train.py。它的执行逻辑非常清晰:解析命令行参数 → 启动 Isaac Sim → 通过 gym.make() 创建环境 → 包装为 RslRlVecEnvWrapper → 实例化 Runner → 调用 runner.learn() 开始训练。如果你想修改日志路径、添加视频录制或调整并行环境数量,都可以从这里入手。

Sources: robolab/scripts/rsl_rl/train.py, robolab/scripts/tools/list_envs.py

4. 数据资产(robolab/data/

Sources: robolab/data/

rsl_rl:算法与网络实现

rsl_rl 是一个独立安装的 Python 包(rsl-rl-lib),基于 ETH Zürich 的原始 RSL-RL 库进行了扩展。它的内部按数据流方向组织:网络层 → 模块层 → 算法层 → 调度层。

1. 基础网络(rsl_rl/networks/

这里存放最底层的可复用网络组件:

Sources: rsl_rl/networks/

2. 策略-价值模块(rsl_rl/modules/

modules/ 将基础网络组装成完整的策略架构。初学者需要熟悉以下关键类:

类名 功能 对应页面
ActorCritic 标准 Actor-Critic,输出动作分布与状态价值 Actor-Critic 网络架构详解
ActorCriticAttnEnc 带注意力编码器的 Actor-Critic 注意力编码器感知机制
ActorCriticRecurrent 带记忆网络的 Actor-Critic Actor-Critic 网络架构详解
AMPDiscriminator AMP 判别器,区分策略动作与参考运动 AMP 对抗运动先验算法
RandomNetworkDistillation RND 好奇心探索模块 RND 好奇心探索与对称性增强
StudentTeacher 学生-教师蒸馏框架 学生-教师蒸馏框架

Sources: rsl_rl/modules/init.py

3. 学习算法(rsl_rl/algorithms/

目前包含三种算法实现:

算法类由 Runner 持有并调用,负责计算损失、执行梯度更新。

Sources: rsl_rl/algorithms/init.py

4. 训练调度器(rsl_rl/runners/

Runner 是连接环境与算法的"胶水层"。它负责收集 Rollout、调用算法更新、记录日志、保存检查点。三种 Runner 对应三种训练模式:

Sources: rsl_rl/runners/init.py

5. 数据存储(rsl_rl/storage/

Sources: rsl_rl/storage/

一条训练指令的数据流

为了帮助你建立端到端的结构认知,以下是一张展示从命令行到策略更新的完整数据流图。这张图涵盖了本页介绍的所有关键组件:

graph LR
    CLI[python train.py<br/>--task=Atom01-Direct-v1] --> REG[Gymnasium Registry<br/>robolab/tasks/__init__.py]
    REG --> ENV[IsaacLab Env<br/>BaseEnv / AmpEnv]
    ENV --> WRAP[RslRlVecEnvWrapper]
    WRAP --> RUNNER[Runner<br/>OnPolicy / AMP]
    RUNNER --> ALG[Algorithm<br/>PPO / PPOAMP]
    ALG --> NET[ActorCritic<br/>+ 可选 Attention/RND]
    NET --> ACT[动作输出]
    ACT --> ENV
    RUNNER --> STORE[RolloutStorage<br/>收集 trajectory]
    STORE --> ALG
    ALG --> UPD[梯度更新<br/>保存 checkpoint]

Sources: robolab/scripts/rsl_rl/train.py

环境注册机制:任务名是如何被识别的?

IsaacLab 使用 Gymnasium 的注册系统来管理环境。当你执行 python train.py --task=Atom01-Direct-v1 时,以下步骤在幕后发生:

  1. train.py 通过 import robolab.tasks 触发各子包的 __init__.py 加载。
  2. robolab/tasks/__init__.py 调用 import_packages(),自动扫描所有子目录下的配置文件。
  3. 每个环境配置类(如 atom01_env_cfg.py)通过装饰器或入口点字符串向 Gymnasium 注册一个任务 ID(如 Atom01-Direct-v1)。
  4. gym.make() 根据任务 ID 找到对应的入口点,实例化环境类与配置对象。

你可以随时运行 python robolab/scripts/tools/list_envs.py 查看当前所有已注册的环境名称、入口点和配置文件路径。

Sources: robolab/tasks/init.py, robolab/scripts/tools/list_envs.py

给初学者的代码阅读路线图

项目结构导读的目标是帮你建立"在哪里找什么"的直觉。以下是一条按优先级排序的推荐阅读路径,每个链接对应导航目录中的独立详解页面:

  1. 理解训练入口:先通读 robolab/scripts/rsl_rl/train.py,建立端到端概念。
  2. 选择你的环境范式
  3. 查看机器人配置:了解 robolab/assets/robots/roboparty.py 中的 ATOM01_CFG
  4. 运行第一个训练:跟随 训练你的第一个策略 的逐步指引。
  5. 按需深入算法:当需要调整网络结构或理解损失计算时,再进入 RSL-RL 算法库 相关章节。

记住,不要试图在第一天就读懂所有文件。ATOM01-Train 的模块化设计允许你每次只聚焦一个包、一个目录、一个文件,逐步构建对整个系统的完整认知。