ATOM01 是由 Roboparty 开发的一款全尺寸双足人形机器人,本项目将其作为核心训练平台,支持从 Isaac Lab 仿真训练到 MuJoCo Sim2Sim 验证的完整管线。本文档系统梳理 ATOM01 的运动学架构、多格式模型文件(URDF / MJCF)以及 Isaac Lab 中的 ArticulationCfg 配置对象,帮助开发者在复现、调参或迁移至新机体时建立清晰的修改边界。理解这些配置是与后续 训练你的第一个策略 和 MuJoCo Sim2Sim 部署与真机迁移 衔接的前提。
Sources: roboparty.py, README.md
运动学架构与连杆拓扑
ATOM01 采用开链浮动基座(floating base)结构,全身共 23 个连杆(含基座)和 22 个驱动关节,可细分为下肢、躯干与上肢三大子系统。下肢每侧 6 个自由度,覆盖从髋关节偏航(yaw)到踝关节横滚(roll)的完整运动链;躯干提供腰部偏航关节;上肢每侧 5 个自由度,实现肩部和肘部的多轴运动。这种布局在保持双足平衡所需最小自由度的同时,为上肢策略学习保留了足够表达空间。
graph TD
A[base_link<br/>浮动基座 6DOF] --> B[left_thigh_yaw_link]
A --> C[right_thigh_yaw_link]
A --> D[torso_link]
B --> B1[left_thigh_roll_link]
B1 --> B2[left_thigh_pitch_link]
B2 --> B3[left_knee_link]
B3 --> B4[left_ankle_pitch_link]
B4 --> B5[left_ankle_roll_link]
C --> C1[right_thigh_roll_link]
C1 --> C2[right_thigh_pitch_link]
C2 --> C3[right_knee_link]
C3 --> C4[right_ankle_pitch_link]
C4 --> C5[right_ankle_roll_link]
D --> D1[left_arm_pitch_link]
D1 --> D2[left_arm_roll_link]
D2 --> D3[left_arm_yaw_link]
D3 --> D4[left_elbow_pitch_link]
D4 --> D5[left_elbow_yaw_link]
D --> E1[right_arm_pitch_link]
E1 --> E2[right_arm_roll_link]
E2 --> E3[right_arm_yaw_link]
E3 --> E4[right_elbow_pitch_link]
E4 --> E5[right_elbow_yaw_link]
Sources: atom01.urdf, atom01.xml
模型文件组织与资产目录
ATOM01 的物理资产集中在 robolab/data/robots/roboparty/atom01/ 目录下,采用“一机多格式”的存储策略,分别服务 Isaac Lab 训练流和 MuJoCo 部署流。其中 meshes/ 包含 23 个 STL 可视化/碰撞网格;urdf/ 提供 Isaac Sim 的导入描述;mjcf/ 提供 MuJoCo 的仿真描述;terrain_assets/ 则存放高度场纹理,用于带地形的 Sim2Sim 验证。在代码侧,robolab.assets.robots.roboparty 模块将上述文件路径封装为可复用的配置对象,训练任务通过 from robolab.assets.robots import ATOM01_CFG 完成机器人挂载。
robolab/data/robots/roboparty/atom01/
├── meshes/ # 23 个 STL 网格文件
├── urdf/
│ └── atom01.urdf # Isaac Lab / Isaac Sim 导入
├── mjcf/
│ ├── atom01.xml # MuJoCo 标准场景
│ └── atom01_terrain.xml # MuJoCo 地形场景
└── terrain_assets/
└── terrain_hfield.png # 高度场地形纹理
Sources: roboparty.py, ISAAC_DATA_DIR
Isaac Lab 机器人配置解析
ATOM01_CFG 是 Isaac Lab 中 ArticulationCfg 的实例化对象,由 Spawn 配置、初始状态配置 和 执行器配置 三个核心部分构成。Spawn 配置指定了 URDF 路径、物理属性与导入选项;初始状态定义了环境重置时的根体位姿与关节角度;执行器配置则将 22 个关节按动力学特性分组管理,每组应用不同的 PD 增益与力矩/速度限幅。这种分层设计允许在不改动 URDF 的前提下,通过 Python 代码快速迭代控制参数。
在 Spawn 配置中,fix_base=False 使机器人以浮动基座形式存在;activate_contact_sensors=True 开启足底接触检测,这是足式机器人奖励计算与终止判据的数据来源;replace_cylinders_with_capsules=True 将 URDF 中的圆柱碰撞体替换为胶囊体,以降低接触求解的抖动。物理迭代参数设置为位置迭代 8 次、速度迭代 4 次,在计算开销与接触稳定性之间取得平衡。
Sources: roboparty.py
初始状态与关节限位
初始状态 init_state 决定了每次环境重置时机器人的位姿。ATOM01 的根体被置于 (0.0, 0.0, 0.75) 米高度,并赋予一组预定义的站立关节角:大腿俯仰约 -0.1 rad、膝关节 0.3 rad、踝关节俯仰 -0.2 rad,形成略微弯曲的稳定的准备姿态。soft_joint_pos_limit_factor=0.90 表示在仿真中将关节硬限位的 90% 作为软限位使用,保留 10% 的缓冲区间,避免策略在边界处因刚度突变而产生震荡。所有关节的初始速度通过正则表达式 ".*": 0.0 统一置零。
Sources: roboparty.py
执行器分组与动力学参数
ATOM01 的 22 个驱动关节被划分为 4 个执行器组:legs(腿部与躯干)、feet(足部踝关节)、shoulders(肩关节三轴)与 arms(肘关节)。该分组基于各关节的动力学尺度差异:髋关节与膝关节需要输出上百牛米级力矩以支撑全身重量,而腕部与踝关节仅需数十牛米即可。本项目采用 DelayedPDActuatorCfg,它在标准 PD 控制基础上引入了 0~2 步的随机延迟,用于模拟真实电机通信与响应的时滞效应。
| 执行器组 | 包含关节 | 力矩限幅 (Nm) | 速度限幅 (rad/s) | 刚度 Kp | 阻尼 Kd |
|---|---|---|---|---|---|
| legs | .*_thigh_yaw/roll/pitch, .*_knee, .*torso |
120.0 | 25.0 | 100~150 | 3.3~5.0 |
| feet | .*_ankle_pitch/roll |
27.0 | 8.0 | 40.0 | 2.0 |
| shoulders | .*_arm_pitch/roll/yaw |
27.0 | 8.0 | 40.0 | 2.0 |
| arms | .*_elbow_pitch/yaw |
27.0 | 8.0 | 30/20 | 1.5/1.0 |
所有执行器均设置 armature=0.01,该值反映电机转子的等效惯量,对高频响应有抑制作用;min_delay=0, max_delay=2 则使不同环境实例中的控制延迟在 0 到 2 个仿真步之间随机抽取,增强策略的鲁棒性。
Sources: roboparty.py
URDF 物理模型参数详解
URDF 文件是 ATOM01 在 Isaac Lab 中的“黄金源”模型,定义了连杆惯性、关节轴系、限位以及碰撞几何。全机 23 个连杆均配置了从 CAD 导出的精确惯性张量与质心位置,其中 base_link 质量 5.51 kg、torso_link 质量 7.58 kg,二者合计超过全机总质量的三分之一,体现了躯干集中惯量的设计特征。为兼顾仿真精度与性能,碰撞几何并未完全复用可视化网格:大腿与小腿采用简化长方体包围盒,肩臂部位采用圆柱体近似,而足部与部分连杆保留原始网格碰撞。
关节限位在 URDF 中左右对称设计,但部分关节的符号区间存在镜像关系,以匹配人体解剖学运动方向。例如左侧 thigh_roll 限位为 [-0.2, 1.0],右侧则为 [-1.0, 0.2];左侧 arm_roll 为 [-0.25, 3.14],右侧则为 [-3.14, 0.25]。这种非对称限位在编写基于镜像对称性的奖励或正则项时需要特别注意,相关内容可参考 RND 好奇心探索与对称性增强。
Sources: atom01.urdf
关键关节限位对照
| 关节名称 | 类型 | 运动轴 | 下限 (rad) | 上限 (rad) | 力矩限幅 | 速度限幅 |
|---|---|---|---|---|---|---|
| thigh_yaw | 偏航 | (-0.5, 0, -0.866) | -1.0 / -0.2 | 0.2 / 1.0 | 120 | 25 |
| thigh_roll | 横滚 | (0.866, 0, -0.5) | -0.2 / -1.0 | 1.0 / 0.2 | 120 | 25 |
| thigh_pitch | 俯仰 | (0, 1, 0) | -1.57 | 1.57 | 120 | 25 |
| knee | 俯仰 | (0, 1, 0) | -0.2 | 2.5 | 120 | 25 |
| ankle_pitch | 俯仰 | (0, 1, 0) | -0.6 | 0.6 | 27 | 8 |
| ankle_roll | 横滚 | (1, 0, 0) | -0.5 | 0.5 | 27 | 8 |
| torso | 偏航 | (0, 0, 1) | -3.14 | 3.14 | 120 | 25 |
| arm_pitch | 俯仰 | (0, 1, 0) | -3.14 | 1.57 | 27 | 8 |
| arm_roll | 横滚 | (1, 0, 0) | -0.25 / -3.14 | 3.14 / 0.25 | 27 | 8 |
| arm_yaw | 偏航 | (0, 0, -1) | -1.57 | 1.57 | 27 | 8 |
| elbow_pitch | 俯仰 | (0, 1, 0) | -0.6 | 1.57 | 27 | 8 |
| elbow_yaw | 横滚 | (1, 0, 0) | -1.57 | 1.57 | 27 | 8 |
注:左右关节限位不同时,以“左 / 右”形式标注。
Sources: atom01.urdf
MuJoCo MJCF 部署模型配置
MJCF 模型服务于 Sim2Sim 验证与真机迁移前的算法测试,包含 atom01.xml(平地场景)与 atom01_terrain.xml(高度场地形场景)两个变体。二者共享相同的运动学与惯性参数,但地形场景中通过 <hfield> 引用外部 PNG 高度图,并将地面几何体从平面替换为高度场。在 MJCF 中,基座通过显式的 floating_base_joint(free joint)与 world 连接,其初始高度在平地场景中设为 0.75 m,在地形场景中提升至 2.75 m 以避免与起伏地面初始穿透。
MJCF 的另一显著特征是集成了完整的传感器阵列,这是 URDF 中所不具备的。<sensor> 段落定义了全部 22 个关节的位置、速度与力矩反馈(actuatorpos / actuatorvel / actuatorfrc),并在 base_link 的质心处放置了 IMU 站点,输出四元数姿态、角速度、线加速度与线速度。这些传感器配置直接决定了 MuJoCo 侧状态观测的维度与噪声模型,需与 Isaac Lab 中的观测定义保持一致。当需要修改 IMU 位置或增加额外传感器时,应同步调整 atom01.xml 与 atom01_terrain.xml 两处文件。
Sources: atom01.xml, atom01_terrain.xml
URDF 与 MJCF 核心差异
| 维度 | URDF (Isaac Lab) | MJCF (MuJoCo) |
|---|---|---|
| 基座处理 | 隐式浮动基座 | 显式 floating_base_joint (free) |
| 碰撞几何 | 部分简化(box / cylinder) | 全部使用原始 mesh |
| 传感器定义 | 由 Isaac Lab 环境代码动态创建 | 内建于 <sensor> 段落 |
| 执行器模型 | 由 ArticulationCfg 中 DelayedPDActuatorCfg 定义 |
内建于 <actuator> 中的 <motor> |
| 关节限位 | 部分较窄 | 部分更宽(如 knee 下限为 0) |
| 初始高度 | Python 配置中 pos=(0,0,0.75) |
XML 中 body pos="0 0 0.75" |
Sources: roboparty.py, atom01.xml
在训练环境中的集成方式
ATOM01 并非直接实例化,而是通过 ATOM01_CFG.replace(prim_path="{ENV_REGEX_NS}/Robot") 注入到环境配置中。以 Direct RL 环境为例,atom01_env_cfg.py 在 __post_init__ 中将 self.scene_context.robot 绑定到 ATOM01 配置;Manager-based 环境(如 AMP、BeyondMimic)则在场景配置的 __post_init__ 中执行相同的替换操作。这种延迟绑定机制允许同一机器人配置被多个任务共享,而无需复制物理模型文件。
在环境奖励设计中,undesired_contacts 项通过正则表达式 (?!.*ankle_roll.*).* 排除 ankle_roll 连杆的接触,意味着只有足底(ankle_roll 子链末端)的接触被视为期望接触,其余体部触地将受到惩罚。该正则的准确性高度依赖于 URDF 中的连杆命名规范,若日后修改连杆名,必须同步更新环境配置中的 body_names 过滤表达式。
Sources: atom01_env_cfg.py, atom01_amp_env_cfg.py
配置调整建议与注意事项
当需要对 ATOM01 进行参数微调或机体迁移时,建议遵循“从代码到模型”的修改优先级:首先尝试在 roboparty.py 的 ATOM01_CFG 中调整 PD 增益与力矩限幅,这无需重启仿真器即可生效;若涉及质量分布或连杆几何变更,则需重新导出 URDF 与 STL,并同步验证 MJCF 中的惯性参数是否一致。特别需要注意的是,Isaac Lab 的 URDF 导入器会将 <cylinder> 碰撞体自动替换为胶囊体(replace_cylinders_with_capsules=True),而 MuJoCo 侧保留网格或原始几何,这可能导致同一控制策略在两种仿真器中的接触动力学存在细微差异,应在 Sim2Sim 阶段予以关注。
若计划为 ATOM01 引入新的末端执行器或修改自由度数量,除调整 URDF/MJCF 外,还必须检查环境配置中的观测空间维度、执行器字典的 joint_names_expr 正则表达式,以及任何硬编码的关节索引。完成模型配置后,下一步可阅读 运动数据重定向与数据集准备 了解如何将参考运动与当前关节命名体系对齐,或直接前往 Direct RL 环境架构 深入理解环境代码如何消费这些机器人配置。