本章要回答的三个问题:ODE、Bullet、DART 这些物理引擎在 Gazebo 里如何被同一个抽象层接管,换引擎到底换了什么?惯性张量、步长、接触参数这些数值是怎么进入每一步求解的,为什么"单位错误一个零"的后果是机器人抖成筛子?关节和约束的求解为什么是数值仿真的最大误差源,调参的手感从哪来?
物理是三本账里最"硬"的一本——它的记账规则就是牛顿力学加上一堆数值近似。这本账的三个特点决定它值得单独一章:
| 节 | 回答哪个问题 | 关键产出 |
|---|---|---|
| 3.1 物理引擎抽象层 | 换引擎换了什么 | 引擎对比表 + 切换示例 |
| 3.2 刚体动力学核心概念 | 每步求解在算什么 | 惯性核对方法 + 步长准则 |
| 3.3 约束与关节 | 误差为何集中在这里 | 关节类型对照 + 四类症状病因表 |
3.1 是壳,3.2 与 3.3 是每步求解方程的两大项(自由动力学 + 约束力),最后汇到数值积分的稳定性问题——四类物理症状都从这条链上诊断。
高中力学 + 第 2 章的迭代流水线概念。3.2 会用到一点矩阵记号,但以"量级核对"为落地目标,不做推导。
物理账记好之后,机器人脚下还得有世界可踩——第 4 章讲 SDF 如何把场景、地形、资源这些"环境账"写成机器可校验的语义。
把本章方法压成一张可以在评审时逐项打钩的体检单。模型侧四项:惯性张量逐 link 过 mL²/12 量级核对(3.2,最好脚本化进 CI);所有关节的 effort/velocity 填真实规格而非 1e16(3.3,无限上限是仿真通过、真机堵转的头号配方);fixed 关节数量清点,固定结构回 CAD 合并(3.3);碰撞体全部为基本几何体或凸包,无一例高面数网格(3.3)。世界侧三项:步长对照系统最快动态周期的十分之一准则(3.2);接触 kp/kd 有调参记录而不是默认值裸奔(3.3);引擎选择写明理由,换引擎后接触参数重新核对过(3.1)。这七项过关的物理配置才具备"结论可迁移到真机"的资格——任何一项空缺,仿真报告里都应标注对应的可信度折扣,而不是让读者自己猜哪本账没记。体检单的最后一栏留给记录本身:每次调参后的参数值、症状变化与结论写成一行日志,随模型文件一起进版本管理。物理调参最贵的成本不是时间,而是重复踩同一个坑——一份两行的调参记录,能让半年后的你或接手的同事直接跳过整个试错循环。
体检单还有一个团队层面的用法:把七项检查做成 merge request 模板里的勾选框,让每一次涉及物理配置的合人都自带一份体检记录。物理参数的评审从"凭印象看一眼"变成"对着清单逐项确认",新人也能按单执行——这比口口相传的"调参手感"可靠得多。