2. 仿真环境搭建:安装MuJoCo、配置Python接口、验证第一个仿真模型
好,咱们正式开始动手了。
上一章聊了四足机器人的运动学和动力学基础,那些公式看着可能有点枯燥。但别急,这一章我们就要把这些理论扔进仿真环境里跑起来。我个人习惯是,学机器人控制一定要先搭好仿真环境。为什么?因为真机太贵了,摔一次几千块,你心疼我也心疼。
这一章的目标很明确:装好MuJoCo,配好Python接口,然后让一个简单的模型动起来。整个过程我大概会花30分钟带你走完。
2.1 为什么选MuJoCo?
市面上仿真器不少,Gazebo、PyBullet、Webots……我为什么推荐MuJoCo?
说白了,就三个字:快、准、稳。
- 快:MuJoCo用C语言写的,计算效率极高。我在项目中跑过四足机器人的MPC控制,MuJoCo的仿真速度能比PyBullet快3-5倍。
- 准:它的物理引擎基于凸优化求解,碰撞检测和关节约束处理得非常干净。不会出现模型穿地这种尴尬事。
- 稳:DeepMind收购后一直在维护,文档和社区支持都很好。
一句话总结:MuJoCo是目前做四足机器人平衡控制仿真性价比最高的选择。没有之一。
2.2 安装MuJoCo
MuJoCo现在有两个版本:旧版2.1.x和新版3.x。我建议你直接装3.x,因为Python接口更友好,而且DeepMind官方主推。
2.2.1 下载MuJoCo二进制文件
去MuJoCo的GitHub Releases页面下载对应你操作系统的版本。Windows选win64,Linux选linux64,macOS选macos-universal。
下载后解压,放到一个你记得住的位置。我个人习惯放在 C:\mujoco 或者 ~/mujoco。
2.2.2 设置环境变量
这一步很多人会忘,然后报错说找不到库文件。嗯,这里要注意。
- Windows:把
C:\mujoco\bin加到系统Path里。 - Linux/macOS:在
.bashrc或.zshrc里加一行:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/mujoco/bin
我曾经遇到过:装完MuJoCo后运行示例,提示 mujoco.dll 找不到。折腾了半天才发现是环境变量没配好。别踩这个坑。
2.3 配置Python接口
MuJoCo的Python接口现在叫 mujoco,直接pip安装就行。
pip install mujoco
就这么简单?对,就这么简单。但有个前提——你的Python版本要在3.8以上。我建议用3.10,兼容性最好。
装完之后验证一下:
python -c "import mujoco; print(mujoco.__version__)"
如果输出版本号,比如 3.1.4,那就说明装好了。
小技巧:如果你用conda,建议新建一个虚拟环境:conda create -n mujoco python=3.10。这样不会污染你其他的Python项目。
2.4 第一个仿真模型:让一个球滚起来
好了,环境搭好了,我们来跑第一个模型。别一上来就搞四足机器人,先让一个球滚起来,感受一下MuJoCo的工作流程。
2.4.1 创建模型文件
MuJoCo的模型用XML格式描述,后缀是 .xml。新建一个文件叫 ball.xml:
<mujoco model="ball">
<worldbody>
<light name="top" pos="0 0 1"/>
<geom name="floor" type="plane" size="1 1 0.1" rgba="0.8 0.8 0.8 1"/>
<body name="ball" pos="0 0 0.5">
<freejoint/>
<geom name="sphere" type="sphere" size="0.1" rgba="0.2 0.6 1 1"/>
</body>
</worldbody>
</mujoco>
这个模型很简单:一个地面,一个球,球用 freejoint 连接,意味着它可以自由移动和旋转。
2.4.2 写Python脚本跑仿真
新建一个 run_ball.py:
import mujoco
import mujoco.viewer
import time
# 加载模型
model = mujoco.MjModel.from_xml_path('ball.xml')
data = mujoco.MjData(model)
# 用viewer可视化
with mujoco.viewer.launch_passive(model, data) as viewer:
# 给球一个初始速度
data.qvel[0] = 2.0 # x方向速度
data.qvel[1] = 1.0 # y方向速度
# 跑仿真
for _ in range(1000):
mujoco.mj_step(model, data)
viewer.sync()
time.sleep(0.01)
运行这个脚本,你会看到一个蓝色的球在灰色地面上滚动。是不是很简单?
核心逻辑:mj_step 是MuJoCo的仿真步进函数,每调用一次,物理引擎就往前推进一步。你想想看,四足机器人的平衡控制,本质上就是不断调用 mj_step,然后根据状态调整关节力矩。
2.5 理解MuJoCo的核心概念
跑完第一个模型,我们来梳理一下MuJoCo的几个核心概念。理解了这些,后面做四足机器人仿真就顺了。
| 概念 | 说明 | 对应代码 |
|---|---|---|
| MjModel | 模型定义,包含几何、关节、执行器等静态信息 | mujoco.MjModel.from_xml_path() |
| MjData | 仿真数据,包含位置、速度、力矩等动态信息 | mujoco.MjData(model) |
| mj_step | 仿真步进函数,推进物理引擎 | mujoco.mj_step(model, data) |
| freejoint | 自由关节,允许物体在6个自由度上运动 | XML中的 <freejoint/> |
我个人习惯把 MjModel 比作机器人的「设计图纸」,MjData 比作机器人的「实时状态」。图纸不变,但状态每时每刻都在变。
2.6 本章知识结构图
下面这张图帮你理清本章的脉络:
2.7 常见问题与避坑
最后,分享几个我实际项目中遇到的坑,你提前知道,能省不少时间。
我曾经遇到过:在Linux上装MuJoCo 3.x,运行时报错 libGL.so.1: cannot open shared object file。原因是系统缺少OpenGL库。解决方法:sudo apt install libgl1-mesa-glx。
小提示:如果你用WSL2跑MuJoCo,记得装一个X Server(比如VcXsrv),否则viewer打不开。或者干脆用 mujoco.renderer 做离屏渲染,不依赖图形界面。
关于模型文件:MuJoCo的XML语法很严格,标签必须闭合,属性值必须加引号。我见过有人把 type="sphere" 写成 type=sphere,结果模型加载失败。这种小错误最浪费时间。
好了,到这一步,你的MuJoCo环境应该已经跑起来了。那个蓝色的球在灰色地面上滚动的画面,就是你在四足机器人仿真世界里的第一步。后面我们会一步步把这个球换成四足机器人模型,然后让它站起来、走起来、跑起来。