2. 刚体动力学参数调试
刚体动力学参数,说白了就是决定物体“怎么动”的那几个数字。质量、惯性张量、质心位置——这三个参数要是设不对,仿真跑起来要么飘得像气球,要么抖得像筛子。我刚开始用Isaac Sim那会儿,就吃过这个亏。
2.1 质量(Mass)——最直观但最容易翻车的参数
质量决定物体受重力时的表现,也影响碰撞响应。但很多人以为“设成真实值就行”,其实没那么简单。
核心原则:质量不是越大越好,也不是越小越好。它要和场景中的其他物体保持同一量级。
举个例子。我在做一个物流仿真项目时,把一个小零件的质量设成了0.001 kg,结果它一碰到传送带就飞出去了。为什么?因为PhysX的求解器在极端质量比下会失去精度。
| 质量设置 | 典型问题 | 我的建议 |
|---|---|---|
| 过小(< 0.01 kg) | 碰撞后弹飞、穿透、抖动 | 尽量不低于0.01,除非是粒子级物体 |
| 过大(> 10000 kg) | 推不动、穿透地面、求解器卡顿 | 超过1000 kg时检查是否合理 |
| 质量比悬殊(> 100:1) | 小物体被“吞掉”或乱弹 | 尽量控制在10:1以内 |
调试技巧:在Isaac Sim的Physics Inspector里打开“Show Mass”可视化,每个物体会显示质量数值。我习惯先跑一帧,看看有没有质量异常大的物体——通常那是忘了改默认值。
2.2 惯性张量(Inertia Tensor)——旋转的“手感”
质量管平移,惯性张量管旋转。这个参数很多人直接跳过,用自动计算。但自动计算出来的值,有时候会让物体转起来“不对劲”。
惯性张量是一个3x3矩阵,描述物体绕各轴旋转的难易程度。对于刚体来说,对角线上的三个值(Ixx, Iyy, Izz)最重要。
// 一个长方体的惯性张量示例(质量1 kg,尺寸0.5x0.2x0.1 m)
// 自动计算值:
Ixx = (1/12) * 1 * (0.2² + 0.1²) = 0.00417
Iyy = (1/12) * 1 * (0.5² + 0.1²) = 0.02167
Izz = (1/12) * 1 * (0.5² + 0.2²) = 0.02417
但自动计算有个坑:它假设物体密度均匀。如果你的物体是空心壳、或者内部有配重,自动算出来的惯性张量就不准了。
我曾经踩过的坑:做一个机械臂抓取仿真,末端执行器是空心的。自动计算的惯性张量让它在旋转时“感觉”很重,实际上应该轻很多。后来我手动算了空心壳的惯性张量,替换进去,仿真就正常了。
手动设置惯性张量的方法:
# 在Python脚本中设置
import omni.physics.tensors as physx
# 获取刚体接口
rigid_body = physx.get_rigid_body_interface("/World/object")
# 设置惯性张量(相对于质心坐标系)
inertia = [0.00417, 0.0, 0.0, 0.0, 0.02167, 0.0, 0.0, 0.0, 0.02417]
rigid_body.set_inertia_tensor(inertia)
2.3 质心偏移(Center of Mass Offset)——稳定性的隐形杀手
质心位置不对,物体就会“站不稳”。你想想看,一个立方体如果质心偏到角落,它放在平面上就会自己翻倒——这在物理上没错,但如果你想要它稳定站立,就得把质心调回几何中心。
质心偏移在Isaac Sim里通过comOffset参数控制。默认是(0,0,0),即质心在物体的局部坐标系原点。
| 质心位置 | 仿真表现 | 适用场景 |
|---|---|---|
| 几何中心 | 稳定,不易翻倒 | 大多数规则物体 |
| 偏下(如-0.1 m在Z轴) | 更稳定,像不倒翁 | 车辆、机器人底盘 |
| 偏上(如+0.1 m在Z轴) | 容易翻倒,晃动大 | 模拟不稳定物体、测试 |
| 水平偏移 | 倾斜、偏向一侧 | 模拟负载不均 |
关键点:质心偏移会影响惯性张量的计算。如果你手动设置了质心偏移,惯性张量必须相对于新的质心位置重新计算。很多人忘了这一步,结果物体转起来“歪歪扭扭”。
2.4 三个参数的联动效应
这三个参数不是独立的。质量影响惯性张量的量级,质心偏移改变惯性张量的参考系。我画了一张图来说明它们的关系:
2.5 实战调试流程
我在项目中总结了一套调试流程,分享给你:
- 第一步:检查质量量级
- 打开Physics Inspector,看所有刚体的质量
- 确保最大质量与最小质量之比不超过100:1
- 如果超出,考虑用
set_mass()调整
- 第二步:可视化质心
- 在Viewport中开启“Show Center of Mass”
- 观察质心是否在合理位置
- 如果偏移过大,用
set_center_of_mass_offset()修正
- 第三步:验证惯性张量
- 用自动计算值作为起点
- 如果物体旋转异常,手动计算并替换
- 可以用
get_inertia_tensor()读取当前值对比
- 第四步:跑一个简单测试
- 让物体自由落体到平面上
- 观察是否稳定停下,有没有穿透或弹跳
- 用手推一下,看旋转是否自然
我的习惯:每次改完参数,我都会录一段仿真视频,对比前后差异。肉眼观察比看数据更直观——尤其是旋转的“手感”问题,数据上可能看不出,但一看视频就知道不对劲。
2.6 常见问题速查表
| 现象 | 最可能的原因 | 快速修复 |
|---|---|---|
| 物体穿透地面 | 质量过大或质心过低 | 减小质量或抬高质心 |
| 碰撞后飞走 | 质量过小或质量比过大 | 增大质量或减小碰撞速度 |
| 旋转抖动 | 惯性张量不匹配 | 手动计算并设置正确的惯性张量 |
| 物体倾斜站立 | 质心水平偏移 | 将质心偏移归零或调整到几何中心 |
| 推不动物体 | 质量过大或摩擦力设置不当 | 减小质量或检查摩擦系数 |
嗯,这三个参数调好了,你的刚体仿真就稳了一大半。剩下的就是碰撞形状、约束、阻尼这些细节了。记住一个原则:每次只改一个参数,观察变化,再决定下一步。别想着一步到位,调试是个迭代的过程。