🤖 roboto_origin_03 Wiki
首页 / 项目根 / MuJoCo与Isaac Sim模型配置

本文档聚焦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_paramarm_joint_paramwaist_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段配置了丰富的测量单元以支撑观测空间构建:每个关节配备actuatorposactuatorvelactuatorfrc(带$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.1knee=0.3ankle_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.01min_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.pngbase_velocities.png)。--terrain标志切换至atom01_terrain.xml,用于验证策略在非平坦地形上的鲁棒性。该验证流程的详细实践与参数调优将在Sim2Sim迁移与MuJoCo验证中展开。

Sources: sim2sim_atom01.py

配置调优建议

对于希望修改模型参数的中级开发者,以下几点需特别注意:

  1. 质量属性随机化:IsaacLab通过EventCfg在启动阶段对连杆质量、质心位置、执行器增益进行随机化,而MuJoCo MJCF中这些值为固定常数。若需严格Sim2Sim对齐,应在MuJoCo侧通过model.body_mass等字段手动注入相同分布的扰动。
  2. 关节限位一致性:URDF中left_thigh_yaw_joint限位为[-1, 0.2],而右侧为[-0.2, 1],体现人体工学的左右非对称设计。任何URDF修改必须同步至MJCF,否则Sim2Sim会出现行为漂移。
  3. 接触传感器命名:Isaac Sim中足端检测依赖正则表达式.*ankle_roll.*,MuJoCo中则通过sitegeom的显式命名对应。确保两侧命名空间一致是避免接触奖励异常的前提。

Sources: base_config.py; atom01.xml

阅读导航

完成本章后,建议按以下顺序继续深入: