🤖 roboto_origin_03 Wiki
首页 / URDF / MuJoCo 仿真环境配置

本页面向已具备基础机器人学知识的中级开发者,说明如何在 MuJoCo 物理引擎中加载并运行 Atom01 双足人形机器人的仿真模型。内容涵盖 MJCF 文件结构、平地与地形两种仿真场景的差异、Python 加载流程,以及核心物理参数的含义与调整边界。阅读前建议先了解 仓库结构与文件组织三维网格资源说明,以便快速定位网格与配置文件之间的引用关系。

Sources: README.md, atom01.xml

MJCF 模型架构概览

Atom01 的 MuJoCo 模型采用原生 MJCF(MuJoCo XML)格式描述,未依赖 URDF 转换,从而直接利用了 MuJoCo 的高级特性,例如隐式网格碰撞、层级化的 default 参数类以及丰富的传感器接口。整个 MJCF 文件按功能划分为六大区块:编译器配置物理选项可视化资产世界刚体树执行器定义传感器系统。这种分层结构使得物理参数、几何外观与控制接口相互解耦,便于独立维护。

graph TD
    A[MJCF 根节点<br/>mujoco model='atom01'] --> B[compiler<br/>编译器选项]
    A --> C[option / size / visual<br/>全局物理与渲染参数]
    A --> D[default<br/>参数默认值与类]
    A --> E[asset<br/>纹理/材质/网格/高程场]
    A --> F[worldbody<br/>世界体与机器人运动链]
    A --> G[actuator<br/>23 组力矩电机]
    A --> H[sensor<br/>69 路传感信号]

    D --> D1[geom 默认碰撞属性]
    D --> D2[leg_joint_param<br/>腿部关节动力学]
    D --> D3[arm_joint_param<br/>臂部关节动力学]
    D --> D4[waist_joint_param<br/>腰部关节动力学]

    F --> F1[灯光与地面]
    F --> F2[base_link<br/>浮动基座 + IMU Site]
    F --> F3[左/右腿运动链]
    F --> F4[躯干 + 左/右臂运动链]

    H --> H1[actuatorpos / actuatorvel<br/>关节位置/速度]
    H --> H2[actuatorfrc<br/>关节力矩]
    H --> H3[framequat / framepos / gyro<br/>IMU 姿态/位置/角速度]
    H --> H4[velocimeter / accelerometer<br/>线速度/线加速度]

Sources: atom01.xml

双场景配置文件对比

仓库提供了两套功能完整且结构高度一致的 MJCF 文件,分别对应平地行走复杂地形穿越两种研发需求。两者的机器人本体定义、执行器和传感器配置完全相同,仅在环境地面与机器人初始高度上存在差异,这种设计允许你在两种场景间无缝切换,而无需修改控制代码。

对比维度 mjcf/atom01.xml(平地场景) mjcf/atom01_terrain.xml(地形场景)
地面类型 无限平面 plane 高程场 hfield
地面几何定义 <geom name="ground" type="plane" .../> <geom name="ground" type="hfield" hfield="terrain_hfield" .../>
高程场资产 内建空 hfield 占位(hf0,未使用) 外部 PNG 纹理驱动(terrain_assets/terrain_hfield.png
机器人初始高度 base_link 位于 z = 0.75 m base_link 位于 z = 2.75 m
典型用途 步态生成、平衡控制、强化学习基线训练 崎岖地形适应性、视觉-地形联合策略验证

高程场的尺寸参数为 size="10.0 10.0 3.4 2.0",表示水平范围 10 m × 10 m,最大高度 3.4 m,基础偏移 2.0 m;配合初始高度 2.75 m 可确保机器人足端不会直接插入地面以下。平地场景则采用棋盘格纹理地面,便于直观观察足端滑动与落点。

Sources: atom01.xml, atom01_terrain.xml

加载仿真模型的标准流程

以下流程适用于已安装 mujoco Python 包(≥ 3.0)的环境。整个过程无需编译 C++ 源码,也无需额外下载 MuJoCo 二进制库,因为现代 Python 绑定已内置渲染与物理引擎。

flowchart LR
    A[安装依赖<br/>pip install mujoco] --> B[克隆仓库]
    B --> C{选择场景}
    C -->|平地| D[加载 mjcf/atom01.xml]
    C -->|地形| E[加载 mjcf/atom01_terrain.xml]
    D --> F[实例化 MjModel + MjData]
    E --> F
    F --> G[启动被动 Viewer<br/>或接入 RL 训练循环]
    G --> H[调用 mj_step<br/>推进仿真]

最小可运行的 Python 示例代码如下。该脚本以被动模式启动交互式 Viewer,物理步进与渲染解耦,适合在仿真循环中插入自定义控制器:

import mujoco
import mujoco.viewer
import time

# 根据场景需要切换路径
MODEL_PATH = "mjcf/atom01.xml"          # 平地
# MODEL_PATH = "mjcf/atom01_terrain.xml"  # 地形

model = mujoco.MjModel.from_xml_path(MODEL_PATH)
data = mujoco.MjData(model)

with mujoco.viewer.launch_passive(model, data) as viewer:
    while viewer.is_running():
        # 在此处插入控制指令,例如:
        # data.ctrl[:] = policy(obs)
        
        mujoco.mj_step(model, data)
        viewer.sync()
        time.sleep(model.opt.timestep)

关键注意事项:MJCF 中网格目录以相对路径 ../meshes/ 声明,因此运行脚本的工作目录必须是仓库根目录,否则会导致网格加载失败。若需在其它目录运行,请通过 meshdir 的绝对路径或软链接修正资源定位。

Sources: atom01.xml, README.md

核心物理参数解析

理解以下参数是保障仿真稳定与控制迁移成功的先决条件。它们集中在 <compiler><option><size><default> 区块中,决定了积分精度、接触求解质量以及关节动力学特性。

参数 取值 含义与影响
timestep 0.001 s 仿真步长,对应 1 kHz 控制频率;与真实机器人控制周期对齐
solver PGS Projected Gauss-Seidel 接触求解器,收敛稳定且计算开销低
iterations 100 每步接触求解迭代次数,影响穿透恢复精度
gravity 0 0 -9.81 标准地球重力,Z 轴向下
njmax / nconmax 5000 / 1000 最大约束数与最大接触数,为 23 关节 + 多足接触预留余量
eulerseq zyx 欧拉角旋转顺序,与常见航空航天约定一致
angle radian 所有角度量均以弧度制存储与解析

<default> 层级中,项目定义了三类关节参数类,分别对应不同躯段的动力学特征:

参数类 适用关节 damping frictionloss armature
leg_joint_param 髋、膝、踝(共 12 个) 0.01 0.01(踝部覆写为 0.05) 0.01
arm_joint_param 肩、肘(共 10 个) 0.01 0.01 0.01
waist_joint_param 躯干偏航 torso_joint 0.01 0.01 0.01

踝部关节的 frictionloss 被显式提升至 0.05,用于增强站立阶段的静态稳定性,模拟真实关节减速器在低速时的粘滞阻力。armature 代表电机转子等效惯量,设置为 0.01 可在不显著增加总质量的前提下抑制高速指令下的数值振荡。

Sources: atom01.xml, atom01.xml

执行器与传感器配置

Atom01 的 MuJoCo 模型配备了 23 个力矩控制电机69 路传感器,构成了完整的本体感知接口,可直接用于强化学习或模型预测控制(MPC)的状态反馈。

执行器模型

所有关节均采用 <motor> 类型执行器,表示理想力矩源,其输出被限制在 ±200 N·m 范围内。gear="1" 表明电机减速比为 1:1,力矩指令直接映射为关节力矩,不包含额外的传动模型。这种简化适用于算法验证阶段;若需模拟真实电机的电流环动态或减速器间隙,可在 执行器与控制接口 中进一步了解进阶配置。

graph LR
    subgraph 执行器层级
        M1[motor<br/>ctrlrange="-200 200"] --> J1[joint]
        M2[motor<br/>ctrlrange="-200 200"] --> J2[joint]
        M3[motor<br/>ctrlrange="-200 200"] --> J3[joint]
    end
    subgraph 传感器反馈
        J1 --> S1[actuatorpos<br/>关节位置]
        J1 --> S2[actuatorvel<br/>关节速度]
        J1 --> S3[actuatorfrc<br/>关节力矩<br/>noise=1e-3]
    end

传感器清单

传感器分为关节级和机体级两类:

传感器类型 数量 用途 噪声配置
actuatorpos 23 各关节位置反馈 无显式噪声
actuatorvel 23 各关节速度反馈 无显式噪声
actuatorfrc 23 各关节输出力矩 noise="1e-3"
framequat 1 基座姿态四元数 noise="0.001"
framepos 1 基座位置 noise="0.001"
gyro 1 角速度 noise="0.005", cutoff="34.9"
velocimeter 1 线速度 noise="0.001", cutoff="30"
accelerometer 1 线加速度 noise="0.005", cutoff="157"
magnetometer 1 磁场方向 无噪声

所有 IMU 传感器均绑定在 base_link 上的 imu Site(尺寸 0.01 m,位于基座几何中心),该 Site 同时作为浮动基座的局部坐标参考点。cutoff 参数定义了传感器输出的低通截止频率(单位 Hz),用于抑制高频数值噪声,其中加速度计的 157 Hz 截止频率保留了冲击与足地碰撞的高频信息,而角速度的 34.9 Hz 更适合姿态估计算法。

Sources: atom01.xml

几何与碰撞默认策略

MJCF 中的 <geom> 默认属性对仿真行为有全局影响。项目将默认几何体的 condim 设为 4,表示使用摩擦锥的完整三维接触模型(法向 + 两个切向),contype="1"conaffinity="0" 的组合意味着机器人连杆默认可与其他物体产生接触,但连杆之间不会发生自碰撞——这是人形机器人仿真的常见权衡,可避免膝盖弯曲时大腿与小腿因网格近似而产生虚假碰撞。若需要启用自碰撞进行精细干涉检查,请参阅 碰撞几何配置策略

属性 默认值 说明
condim 4 完整摩擦接触;地面单独降级为 1(无摩擦切向)
friction 0.9 0.2 0.2 滑动摩擦 0.9,扭转与滚动摩擦 0.2
solref 0.001 2 接触约束的阻尼比与时间常数,决定接触“软硬”
group 1 默认渲染组,区别于环境组 0

Sources: atom01.xml

常见问题排查

在首次加载或训练过程中,开发者可能遇到以下典型问题:

现象 可能原因 排查方法
Error: mesh file not found 工作目录错误,导致 ../meshes/ 解析失败 确保运行路径为仓库根目录,或修改 meshdir 为绝对路径
机器人瞬间发散/穿透地面 初始高度与地面不匹配 平地场景使用 z=0.75,地形场景使用 z=2.75,不可混用
仿真运行极慢 未开启 GPU 渲染或 Viewer 同步阻塞 使用 launch_passive 并在 mj_step 后手动 sync
关节力矩读数恒为零 未正确调用 mj_step,传感器未更新 确认在 mj_step 之后读取 data.sensordata
站立时足端持续滑动 地面 condim="1" 导致无摩擦 这是平地场景的预期行为;若需摩擦,将地面 condim 改为 3 或 4

Sources: atom01.xml, atom01_terrain.xml

阅读延伸

完成 MuJoCo 环境配置并成功运行仿真后,建议按以下路径深入: