2. 物理引擎选型与调参:Gazebo、MuJoCo、PyBullet、Isaac Sim 四大引擎的优缺点对比,以及摩擦系数、阻尼、刚度的调参避坑指南
做机器人仿真这些年,我换过不下五个物理引擎。每次迁移项目,最头疼的不是算法,而是引擎本身。说白了,物理引擎就是仿真世界的「底层物理定律」。选错了,后面全是坑。
今天我把四个主流引擎的底裤扒干净,再聊聊摩擦系数、阻尼、刚度这三个参数的调参玄学。嗯,都是血泪换来的经验。
2.1 四大引擎优缺点对比
先上一张对比表,方便你快速决策。我个人习惯是:做移动机器人用 Gazebo,做机械臂抓取用 MuJoCo,做强化学习用 PyBullet,做高保真视觉仿真用 Isaac Sim。
| 引擎 | 开源/免费 | 物理精度 | 渲染能力 | ROS集成 | 强化学习支持 | 我最痛的点 |
|---|---|---|---|---|---|---|
| Gazebo | 开源免费 | 中等 | OGRE(够用) | 原生支持 | 弱(需插件) | ODE引擎容易崩 |
| MuJoCo | 开源免费(2021后) | 高 | 内置(简洁) | 需桥接 | 强(原生API) | 文档像天书 |
| PyBullet | 开源免费 | 中等偏高 | OpenGL(够用) | 需桥接 | 强(Python原生) | 多关节仿真偶尔飘 |
| Isaac Sim | 免费(需NVIDIA GPU) | 高 | RTX(顶级) | 支持 | 强(Omniverse) | 吃显卡,启动慢 |
我的建议:如果你刚入门,从 PyBullet 开始。Python 接口友好,社区活跃,踩坑了也有人救。别一上来就上 Isaac Sim,你可能会被它的启动时间劝退。
2.2 摩擦系数调参避坑指南
摩擦系数,我愿称之为「仿真翻车第一杀手」。你想想看,真实世界里一个轮子在地上转,摩擦系数是0.8还是0.6,差别巨大。但在仿真里,你设了0.8,它可能直接原地打滑。
为什么会这样?因为物理引擎的摩擦模型是简化的。Gazebo 用的库伦摩擦模型,MuJoCo 用的椭圆摩擦锥,PyBullet 用的近似模型。同一个摩擦系数,在不同引擎里表现完全不同。
我曾经踩过的坑:在 Gazebo 里给四足机器人设了摩擦系数0.9,结果它走路像踩在冰面上。后来发现是 ODE 引擎的摩擦方向默认只支持两个方向,第三个方向是0。解决方案:手动设置 <ode><mu>0.9</mu><mu2>0.9</mu2></ode>。
调参口诀:
- 轮式机器人:摩擦系数设 0.7~1.0,低于0.5会打滑
- 足式机器人:摩擦系数设 0.8~1.2,低于0.6会滑倒
- 抓取场景:摩擦系数设 0.5~0.8,太高会导致物体「粘手」
小技巧:先在真实场景测一下摩擦系数(用拉力计拉一下),再在仿真里调。别凭感觉设,你会被现实打脸的。
2.3 阻尼调参避坑指南
阻尼,说白了就是「物体有多愿意停下来」。阻尼设大了,机器人像在泥浆里走路;设小了,它像在蹦床上弹跳。
我记得有一次做机械臂仿真,末端执行器一直抖。我调了PID、改了步长、换了求解器,都没用。最后发现是关节阻尼设成了0.01,太小了。改成0.1后,世界安静了。
各引擎的阻尼参数位置:
- Gazebo:在 URDF/SDF 的
<dynamics>标签里,damping属性 - MuJoCo:在 XML 的
<joint>标签里,damping属性 - PyBullet:用
changeDynamics()函数设置 - Isaac Sim:在 Articulation 的物理属性里设置
# PyBullet 示例:设置关节阻尼
import pybullet as p
p.connect(p.GUI)
robot = p.loadURDF("robot.urdf")
# 设置关节0的阻尼为0.1
p.changeDynamics(robot, 0, jointDamping=0.1)
注意:阻尼不是越大越好。设太大,关节响应变慢,控制频率跟不上。我一般从0.05开始调,步长0.01,直到不抖为止。
2.4 刚度调参避坑指南
刚度,决定了物体「硬不硬」。刚度设高了,碰撞像撞墙,仿真容易崩;设低了,物体像果冻,一碰就变形。
你想想看,真实世界的金属刚度是 200 GPa 左右。但在仿真里,你设这么高,求解器直接炸了。为什么?因为仿真用的是隐式积分,刚度越高,矩阵条件数越大,求解越不稳定。
我的经验值:
- 刚体碰撞:刚度设 1e6 ~ 1e8(N/m)
- 软体/抓取:刚度设 1e3 ~ 1e5(N/m)
- 关节刚度:设 1e3 ~ 1e6(Nm/rad)
核心原则:刚度只要能保证物体不穿透,就别再往上加了。加得越高,仿真越慢,越容易崩。我见过有人把刚度设到1e12,然后问我为什么仿真卡成PPT。
2.5 知识体系结构图
下面这张图,是我自己总结的物理引擎选型与调参决策树。你照着走,基本不会迷路。
2.6 总结:我的调参心法
说了这么多,其实就三句话:
- 先选对引擎,再调参数。引擎选错了,参数调出花来也没用。
- 参数从低往高调。摩擦、阻尼、刚度,都从小开始加。加过头了,仿真就崩了。
- 一定要跟真实数据对标。没有真实数据,你调的参数就是自嗨。我在项目里吃过这个亏,调了三天参数,结果跟真实机器人对不上,全白干了。
最后送你一个工具:用 pybullet.setPhysicsEngineParameter() 可以一次性调整多个物理参数。我习惯写一个调参脚本,跑一次仿真,记录一次数据,画成曲线。哪个参数敏感,一目了然。
嗯,物理引擎选型与调参,就聊到这儿。记住,仿真只是工具,真实世界才是裁判。别在仿真里自嗨,多跟真实机器人对一对,你会有惊喜的。