本文档聚焦Atom01机器人在MuJoCo与Isaac Sim两大物理引擎中的模型资产配置、仿真参数对齐与跨平台迁移机制。理解这些配置是后续强化学习训练与Sim2Sim验证的基础,读者需具备URDF/MJCF语法与IsaacLab框架的入门级知识。内容边界严格限定于模型描述文件与仿真环境配置,训练流程与策略部署详见后续章节。
Sources: README.md
资产描述模块架构
atom01_description模块是仿真与训练的数据源头,采用统一网格(meshes)驱动多格式描述文件的设计策略,确保MuJoCo、Isaac Sim以及ROS2生态系统共享同一套几何与惯性数据。
atom01_description/
├── meshes/ # 26个STL网格文件,覆盖全身连杆
├── urdf/
│ └── atom01.urdf # 主URDF描述文件
├── mjcf/
│ ├── atom01.xml # MuJoCo平地场景模型
│ └── atom01_terrain.xml # MuJoCo地形场景模型
└── terrain_assets/
└── terrain_hfield.png # 高度场地形纹理
所有连杆的惯性参数、质量分布与碰撞几何均在URDF中精确定义,MJCF通过meshdir="../meshes/"直接引用相同路径下的STL资源。这种单源 truth 设计避免了不同仿真器间因模型差异导致的策略迁移失败。
Sources: get_dir_structure结果
MuJoCo MJCF模型解析
MuJoCo场景模型包含两个变体:atom01.xml用于平地验证,atom01_terrain.xml用于复杂地形测试。两者共享相同的机器人本体定义,仅在地面几何与初始高度上存在差异。
编译器与全局物理参数
MJCF头部定义了仿真器的基础行为模式。compiler将角度单位设为弧度,eulerseq="zyx"指定旋转顺序。option节点中timestep="0.001"设定1kHz的物理仿真频率,solver="PGS"选择Projected Gauss-Seidel迭代求解器,iterations="100"保证接触约束的收敛精度。全局重力沿z轴负方向设置为$9.81,\text{m/s}^2$,并显式启用frictionloss以模拟关节内部的摩擦损耗。
Sources: atom01.xml
默认关节与几何属性
default段通过三类参数模板管理全身23个自由度的物理属性。leg_joint_param、arm_joint_param与waist_joint_param均配置damping="0.01"、frictionloss="0.01"和armature="0.01",分别模拟关节粘性阻尼、干摩擦与电机转子惯量。几何默认设置condim="4"启用摩擦锥的四维接触空间,friction="0.9 0.2 0.2"依次定义静摩擦系数、滑动摩擦系数与扭转摩擦系数。
Sources: atom01.xml
本体结构执行器与传感器
worldbody内以base_link为根节点,通过嵌套body构建完整的运动学树。每个连杆均附带由CAD导出的精确惯性张量(fullinertia)。actuator段声明了23个motor执行器,统一设置ctrlrange="-200 200",对应最大200Nm的力矩输出边界。
sensor段配置了丰富的测量单元以支撑观测空间构建:每个关节配备actuatorpos、actuatorvel与actuatorfrc(带$10^{-3}$量级噪声);IMU位点imu上挂载framequat(姿态)、framepos(位置)、gyro(角速度,截止频率34.9)、velocimeter(线速度,截止频率30)、accelerometer(线加速度,截止频率157)与magnetometer(磁强计)。这些传感器输出在Sim2Sim脚本中被重组为与IsaacLab一致的观测向量。
Sources: atom01.xml
地形变体差异
atom01_terrain.xml将平地plane替换为hfield高度场,引用terrain_hfield.png作为高程数据源,尺寸覆盖$10\times10,\text{m}$,最大高差3.4m。同时机器人初始base_link高度从$0.75,\text{m}$提升至$2.75,\text{m}$,以避免生成时与地面穿透。
Sources: atom01_terrain.xml
Isaac Sim资产配置
在IsaacLab框架中,机器人资产通过Python配置类ATOM01_CFG定义,位于roboparty.py。该配置将URDF导入PhysX仿真,并叠加延迟PD执行器模型以逼近真实电机动态。
URDF导入与刚体属性
spawn字段使用UrdfFileCfg加载URDF,关键参数包括fix_base=False(浮动基座)、activate_contact_sensors=True(启用接触检测)、replace_cylinders_with_capsules=True(碰撞体优化)以及enabled_self_collisions=True(自碰撞)。求解器迭代次数设为位置8次、速度4次,刚体线性/角速度上限放宽至1000以允许高速运动。
Sources: roboparty.py
初始姿态与执行器分组
init_state定义了仿真启动时的默认关节位形,其中下肢关键关节如thigh_pitch=-0.1、knee=0.3、ankle_pitch=-0.2,构成微屈待步姿态。执行器按动力学特性分为四组:
| 分组 | 涵盖关节 | 力矩限制 | 速度限制 | 刚度$K_p$ | 阻尼$K_d$ |
|---|---|---|---|---|---|
| legs | 髋/膝/躯干 | 120 Nm | 25 rad/s | 100–150 | 3.3–5.0 |
| feet | 踝关节 | 27 Nm | 8 rad/s | 40 | 2.0 |
| shoulders | 肩三自由度 | 27 Nm | 8 rad/s | 40 | 2.0 |
| arms | 肘关节 | 27 Nm | 8 rad/s | 20–30 | 1.0–1.5 |
所有分组均配置armature=0.01与min_delay=0, max_delay=2的随机控制延迟,模拟真实伺服驱动的通信抖动。
Sources: roboparty.py
仿真环境参数对比
下表汇总了MuJoCo与Isaac Sim在关键物理与调度参数上的差异与对应关系。
| 参数 | MuJoCo (MJCF) | Isaac Sim (IsaacLab) | 说明 |
|---|---|---|---|
| 物理步长 | 0.001 s | 0.005 s | MuJoCo 1kHz,PhysX 200Hz |
| 策略控制频率 | 50 Hz (decimation=20) | 50 Hz (decimation=4) | 两者通过不同倍频对齐 |
| 重力 | (0, 0, -9.81) | (0, 0, -9.81) | 完全一致 |
| 求解器 | PGS, 100 iterations | TGS/PGS, pos=8/vel=4 | Isaac Sim为速度优先优化 |
| 接触摩擦 | 0.9 / 0.2 / 0.2 | 启动随机化 (0.3–1.6) | Isaac Sim采用域随机化 |
| 关节阻尼 | 0.01 | 由PD执行器隐式覆盖 | 仿真机制不同 |
| 电机延迟 | 无 | 0–2步随机延迟 | Isaac Sim更接近真实硬件 |
Sources: atom01.xml; base_config.py; roboparty.py
观测与动作空间架构
观测空间构成
在Isaac Sim中,策略观测向量由BaseEnv.compute_current_observations构建。Actor观测维度为78,包含:基座角速度(3D)、投影重力向量(3D)、速度指令(3D)、关节位置偏差(23D)、关节速度(23D)与上一帧动作(23D)。Critic观测在Actor基础上扩展基座线速度(3D)、足端接触标志(2D)、接触力(6D)、空中时间(2D)、足端高度(2D)、关节加速度(23D)与关节力矩(23D),平坦地形下合计139维;若启用height_scan,则追加$11\times17=187$维地形高程扫描,总计326维。
MuJoCo Sim2Sim脚本sim2sim_atom01.py通过get_obs函数从传感器提取等效信息,并利用scipy.spatial.transform.Rotation将世界坐标系速度转换到机体坐标系,保证与Isaac Sim的观测语义一致。
Sources: base_env.py; sim2sim_atom01.py
动作空间与关节映射
策略输出23维动作向量,在Isaac Sim中通过_pre_physics_step乘以action_scale=0.25后叠加默认关节位置,作为PD目标位置发送给物理引擎。MuJoCo侧则通过usd2urdf数组完成动作索引到关节控制索引的重映射:
usd2urdf = [0, 6, 12, 1, 7, 13, 18, 2, 8, 14, 19, 3, 9, 15, 20, 4, 10, 16, 21, 5, 11, 17, 22]
该映射将策略输出的标准化顺序(左右对称、下肢优先)转换为MuJoCo qpos中的物理关节声明顺序。随后Sim2Sim脚本以100–150的$K_p$与1.0–5.0的$K_d$执行底层PD控制,生成力矩并截断至$\pm200,\text{Nm}$后写入data.ctrl。
Sources: sim2sim_atom01.py; base_env.py
地形与场景配置
IsaacLab的地形生成器通过terrain_generator_cfg.py定义了三档难度。GRAVEL_TERRAINS_CFG为入门级配置,30%随机起伏与70%平地组合,无课程学习。ROUGH_TERRAINS_CFG引入倒金字塔台阶、斜坡、网格与随机粗糙面,启用课程学习(curriculum=True),机器人在完成当前难度地块后自动晋升。ROUGH_HARD_TERRAINS_CFG进一步加入深坑、星形障碍、间隙与踏脚石,用于极限泛化测试。
场景配置SceneCfg除地形外,还部署了DomeLight天空盒、DistantLight方向光、全局接触传感器以及双脚射线扫描器left_feet_scanner/right_feet_scanner。射线扫描器以0.01m分辨率在足端下方投射$0.12\times0.04,\text{m}$的网格,实时测量足地距离,支撑feet_height奖励项与Critic观测。
Sources: terrain_generator_cfg.py; scene_cfg.py
Sim2Sim迁移验证流程
Sim2Sim是连接Isaac Sim训练与MuJoCo部署的关键桥梁,其数据流如下:
flowchart LR
A[IsaacLab训练<br/>导出ONNX/JIT] --> B[加载PyTorch JIT策略]
B --> C[构建MuJoCo观测<br/>omega, gvec, cmd, q, dq, action]
C --> D[时序堆叠<br/>frame_stack=10]
D --> E[策略推理<br/>50Hz]
E --> F[usd2urdf索引映射]
F --> G[PD控制<br/>1000Hz]
G --> H[ MuJoCo mj_step ]
sim2sim_atom01.py脚本支持--headless无头模式,可将仿真渲染为MP4视频,并自动生成关节位置跟踪曲线与基座速度对比图(joint_positions.png与base_velocities.png)。--terrain标志切换至atom01_terrain.xml,用于验证策略在非平坦地形上的鲁棒性。该验证流程的详细实践与参数调优将在Sim2Sim迁移与MuJoCo验证中展开。
Sources: sim2sim_atom01.py
配置调优建议
对于希望修改模型参数的中级开发者,以下几点需特别注意:
- 质量属性随机化:IsaacLab通过
EventCfg在启动阶段对连杆质量、质心位置、执行器增益进行随机化,而MuJoCo MJCF中这些值为固定常数。若需严格Sim2Sim对齐,应在MuJoCo侧通过model.body_mass等字段手动注入相同分布的扰动。 - 关节限位一致性:URDF中
left_thigh_yaw_joint限位为[-1, 0.2],而右侧为[-0.2, 1],体现人体工学的左右非对称设计。任何URDF修改必须同步至MJCF,否则Sim2Sim会出现行为漂移。 - 接触传感器命名:Isaac Sim中足端检测依赖正则表达式
.*ankle_roll.*,MuJoCo中则通过site与geom的显式命名对应。确保两侧命名空间一致是避免接触奖励异常的前提。
Sources: base_config.py; atom01.xml
阅读导航
完成本章后,建议按以下顺序继续深入:
- 如需在IsaacLab中配置训练环境与奖励函数,请参阅 IsaacLab环境搭建与训练流程
- 如需理解Sim2Sim脚本的完整运行方法与调参技巧,请参阅 Sim2Sim迁移与MuJoCo验证
- 如需了解URDF运动学描述本身的生成逻辑与坐标系定义,请参阅 URDF运动学与动力学描述