1. 概述

  • MuJoCo (Multi - Joint Dynamics with Contact) 是一个通用物理引擎,旨在促进机器人、生物力学、图形和动画、机器学习以及其他需要快速、精确模拟关节结构与其环境交互的领域的研究和开发,其本质是一个 C/C++ 库,提供 C API,已开源
  • MuJoCo 基于内置 XML 解析器和编译器预分配的底层数据结构进行操作,可用于实现基于模型的计算,例如控制综合、状态估计、系统辨识、机构设计、通过逆动力学进行数据分析以及用于机器学习应用的并行采样。它也可以用作更传统的仿真器,包括用于游戏和交互式虚拟环境,在强化学习和具身智能等领域得到广泛应用。部分特性如下
    • 支持使用原生 MJCF 场景描述语言定义模型,这是一种 XML 文件格式
    • 支持加载 URDF 模型文件
    • 支持交互式可视化,其原生 GUI 使用 OpenGL 渲染
    • 提供了大量用于计算物理相关量的实用函数。

2. 安装

  • 在 conda 环境中,使用 pip 安装 mojoco 仓库
    # 1. 创建 Conda 环境
    conda create -n mujoco python=3.12 -y
    
    # 2. 激活环境
    conda activate mujoco
    
    # 3. 升级 pip
    python -m pip install --upgrade pip
    
    # 4. 安装 MuJoCo
    pip install mujoco==3.13.0
    
  • 检查版本
    python -c "import mujoco; print('MuJoCo version:', mujoco.__version__)"
    
    # 正常应输出 MuJoCo version: 3.13.0
    
  • 测试 Python 绑定能不能正常创建模型
    python - <<'PY'
    import mujoco
    
    xml = """
    <mujoco>
      <worldbody>
        <geom type="plane" size="1 1 0.1"/>
        <body pos="0 0 1">
          <joint type="free"/>
          <geom type="sphere" size="0.1"/>
        </body>
      </worldbody>
    </mujoco>
    """
    
    model = mujoco.MjModel.from_xml_string(xml)
    data = mujoco.MjData(model)
    
    for _ in range(100):
        mujoco.mj_step(model, data)
    
    print("Simulation OK")
    print("time =", data.time)
    print("qpos =", data.qpos)
    PY
    
    # 正常应看到 Simulation OK
    

3. 模拟器测试

  • 使用 python -m mujoco.viewer 启动 MuJoCo 自带的交互式可视化工具。其可用来加载 MJCF 模型、实时查看仿真过程,并检查关节、接触、力、传感器等状态,适合在建模和控制算法开发阶段快速检查模型是否正常
    在这里插入图片描述
    可以用 python -m mujoco.viewer --mjcf=/path/to/some/mjcf.xml 参数指定要展示模型,或直接把 .xml 文件拖入以上窗口

3.1 常用操作

  • 双击选中的物体并高亮
  • 双击选中物体后,按住ctrl+左键是调整姿态
  • 双击选中物体后,按住ctrl+右键是在双击选中的位置施加一个力
  • +和-(不按ctrl)是仿真世界时间流逝速度
  • ctrl+A相机视角回正

3.2 快捷键

keyfunction
F1help
F2info
F3profiler
F4sensors
F5全屏
F6切换可视化坐标系
F7实体名字标签
TAB隐藏左侧工具栏
Delete重置世界
`geom最小外界矩形和碰撞状态
QCamera可视化
W世界网格化
EEquality
R开关光线反射
T几何体透明化
Y测距可视化
U驱动器方向可视化
I转动惯量可视化
O调整物体位姿可视化
PContact可视化
[ / ]切换相机视角
\Mesh Tree
Aauto Connect
D只显示body
S画面亮度调整
F接触力大小及方向可视化(配合接触点C)
G迷雾
J关节方向可视化
H凸包可视化
J关节选装方向可视化
K关闭天空盒
;Skin可视化
’缩放转动惯量
Z灯光
XTexture关闭
C接触点可视化(配合接触力F)
V肌腱可视化
B扰动力大小及方向可视化
M质心可视化
,Activation
/haze 地平线

3.3 MJCF 和 URDF 文件

  • URDF 和 MJCF 都是用 XML 描述机器人模型的格式,但侧重点不同:
    • URDF:主要描述机器人的结构关系,核心是 link + joint,常用于 ROS、MoveIt 和 CAD 导出。一个很简化的 URDF 大概长这样:

      <robot name="duck">
          <link name="body">
              ...
          </link>
      
          <link name="thigh">
              ...
          </link>
      
          <joint name="hip" type="revolute">
              <parent link="body"/>
              <child link="thigh"/>
          </joint>
      </robot>
      

      核心概念就是:

      Robot
      ├── link      刚体
      ├── joint     关节
      ├── visual    外观
      ├── collision 碰撞几何
      └── inertial  质量和惯量
      

      它非常适合描述机械结构拓扑,所以 ROS、MoveIt、Gazebo,以及各种 CAD→机器人转换工具,都大量使用 URDF

    • MJCF:MuJoCo 原生格式,除了结构,还能描述 actuator、sensor、contact、friction、tendon、equality 等,更适合动力学仿真和强化学习。它不只是描述“机器人长什么样”,还直接面向物理仿真:

      <mujoco model="duck">
          <worldbody>
              <body name="body">
                  <geom type="box"/>
                  <body name="thigh">
                      <joint
                          name="hip"
                          type="hinge"
                      />
                      <geom type="capsule"/>
                  </body>
              </body>
          </worldbody>
      
          <actuator>
              <motor joint="hip"/>
          </actuator>
      </mujoco>
      

      可见,MJCF 的核心组织方式不是 link + joint,而是 层次化组织的 body,然后 joint 挂在 body 上。更准确地说是:

      MJCF
      │
      ├── worldbody
      │   ├── body
      │   ├── joint
      │   ├── geom
      │   ├── site
      │   └── camera
      │
      ├── actuator
      ├── sensor
      ├── tendon
      ├── equality
      ├── contact
      ├── asset
      └── default
      

      所以它天然就比 URDF 更像一个完整的物理仿真场景描述语言。

  • 一句话描述:URDF 更像“机器人机械结构说明书”,MJCF 更像“机器人 + 控制器 + 传感器 + 物理世界的仿真工程文件”
    URDFMJCF
    出身ROSMuJoCo
    主要目标描述机器人结构描述物理仿真模型
    刚体linkbody
    关节jointjoint
    碰撞collisiongeom
    外观visualgeom / asset
    actuator很弱,通常靠 ROS 扩展原生支持
    sensor通常靠插件/扩展原生支持
    tendon不擅长原生支持
    闭环机构比较麻烦equality 等原生支持
    参数继承弱default 很强
    接触/摩擦相对基础非常详细
    MuJoCo 适配可导入原生格式
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐