- 参考:
- MuJoCo 文档
- mujoco建模与仿真教程
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-nmujocopython=3.12-y# 2. 激活环境conda activate mujoco# 3. 升级 pippython-mpipinstall--upgradepip# 4. 安装 MuJoCopipinstallmujoco==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 快捷键
| key | function |
|---|---|
| F1 | help |
| F2 | info |
| F3 | profiler |
| F4 | sensors |
| F5 | 全屏 |
| F6 | 切换可视化坐标系 |
| F7 | 实体名字标签 |
| TAB | 隐藏左侧工具栏 |
| Delete | 重置世界 |
| ` | geom最小外界矩形和碰撞状态 |
| Q | Camera可视化 |
| W | 世界网格化 |
| E | Equality |
| R | 开关光线反射 |
| T | 几何体透明化 |
| Y | 测距可视化 |
| U | 驱动器方向可视化 |
| I | 转动惯量可视化 |
| O | 调整物体位姿可视化 |
| P | Contact可视化 |
| [ / ] | 切换相机视角 |
| \ | Mesh Tree |
| A | auto Connect |
| D | 只显示body |
| S | 画面亮度调整 |
| F | 接触力大小及方向可视化(配合接触点C) |
| G | 迷雾 |
| J | 关节方向可视化 |
| H | 凸包可视化 |
| J | 关节选装方向可视化 |
| K | 关闭天空盒 |
| ; | Skin可视化 |
| ’ | 缩放转动惯量 |
| Z | 灯光 |
| X | Texture关闭 |
| C | 接触点可视化(配合接触力F) |
| V | 肌腱可视化 |
| B | 扰动力大小及方向可视化 |
| M | 质心可视化 |
| , | Activation |
| / | haze 地平线 |
3.3 MJCF 和 URDF 文件
- URDF和MJCF都是用 XML 描述机器人模型的格式,但侧重点不同:
URDF:主要描述机器人的结构关系,核心是
link + joint,常用于 ROS、MoveIt 和 CAD 导出。一个很简化的 URDF 大概长这样:<robotname="duck"><linkname="body">...</link><linkname="thigh">...</link><jointname="hip"type="revolute"><parentlink="body"/><childlink="thigh"/></joint></robot>核心概念就是:
Robot ├── link 刚体 ├── joint 关节 ├── visual 外观 ├── collision 碰撞几何 └── inertial 质量和惯量它非常适合描述机械结构拓扑,所以 ROS、MoveIt、Gazebo,以及各种 CAD→机器人转换工具,都大量使用 URDF
MJCF:MuJoCo 原生格式,除了结构,还能描述actuator、sensor、contact、friction、tendon、equality等,更适合动力学仿真和强化学习。它不只是描述“机器人长什么样”,还直接面向物理仿真:
<mujocomodel="duck"><worldbody><bodyname="body"><geomtype="box"/><bodyname="thigh"><jointname="hip"type="hinge"/><geomtype="capsule"/></body></body></worldbody><actuator><motorjoint="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 更像“机器人 + 控制器 + 传感器 + 物理世界的仿真工程文件”
URDF MJCF 出身 ROS MuJoCo 主要目标 描述机器人结构 描述物理仿真模型 刚体 linkbody关节 jointjoint碰撞 collisiongeom外观 visualgeom/ assetactuator 很弱,通常靠 ROS 扩展 原生支持 sensor 通常靠插件/扩展 原生支持 tendon 不擅长 原生支持 闭环机构 比较麻烦 equality 等原生支持 参数继承 弱 default很强接触/摩擦 相对基础 非常详细 MuJoCo 适配 可导入 原生格式