🔗 刚体碰撞解析#
Genesis 遵循与 MuJoCo 非常相似的二次惩罚公式来强制执行刚体约束。本文档总结了该模型的数学原理和物理解释。
1. 一般公式#
设
\(q\) – 关节配置(广义位置)
\dot q – 广义速度
\(a = \ddot q\) – 每个子步要求解的未知广义加速度
\(M(q)\) – 关节空间质量矩阵(正定)
\(\tau_{ext}\) – 所有已知的外部关节力(驱动、重力、流体动力学…)
\(J \) – 在加速度空间中线性化的运动约束堆栈
\(D\) – 每个约束的柔软度 / 阻抗参数对角矩阵
\(a_{ref}\) – 试图恢复穿透或满足电机的参考加速度
我们寻求最小化二次成本的加速度
2. 接触与摩擦模型#
对于每个接触对,Genesis 创建四个约束,它们是摩擦金字塔的基础。数学上每个方向 tᵢ 是
因此 tᵢ 上的正乘数产生位于锥体 \(|\mathbf f_t| \le \mu f_n\) 内部的力。与组合逆质量成比例的对角项 Dᵢ 给出了熟悉的软约束行为,其中较大的 imp(隐式性)值导致更硬的接触。
3. 关节限制(不等式约束)#
旋转和平移关节可选地带有下限和上限位置限制。每当到限制的带符号距离变为负数时
生成一个单一的 1-DOF 约束,其雅可比为
和参考加速度
从标量 sol_params(弹簧-阻尼器式柔软度)获得。D 的对角项再次随逆关节惯性缩放。
4. 等式约束#
Genesis 支持三种完整等式:
类型 |
移除的自由度 |
描述 |
|---|---|---|
Connect |
3 |
强制不同体上的两个点共享相同的世界位置。适合球窝关节。 |
Weld |
6 |
保持两个坐标系在平移和旋转上都重合(可选缩放扭矩)。 |
Polynomial joint |
1 |
将一个关节约束为另一个关节的多项式函数(对复杂机构有用)。 |
每个等式将行写入 J,使得它们的相对平移/旋转速度消失。柔软度和 Baumgarte 稳定再次来自每个约束的 sol_params。
5. 求解器#
求解器类实现两种可互换算法:
5.1 投影共轭梯度 (PCG)#
在加速度的约化空间中操作。
使用质量矩阵作为预处理器。
每个 CG 步骤后,回溯线搜索(Armijo 风格)将新的 J a 投影到可行集(法向 ≥0,摩擦锥)上。
只需要矩阵-向量乘积,使其对具有许多约束的场景内存友好且快速。
5.2 Newton–Cholesky#
构建精确 Hessian (H = M + J^T D J)。
Cholesky 分解(带增量秩-1 更新)产生搜索方向。
在非常少的步骤中收敛(通常 2-3 步),但对于大自由度计数更昂贵。
两个变体共享在 _func_linesearch 中实现的相同的线搜索逻辑,选择步长 (\alpha) 最小化二次模型同时尊重不等式激活/去激活。算法停止当
梯度范数 \(|\nabla f|\) 低于
tolerance · mean_inertia · n_dofs,或成本函数的改进低于相同的阈值。
通过从上一子步的平滑加速度 acc_smooth 初始化来支持热启动。
6. 实际影响#
稳定性 – 因为约束在加速度空间中是隐式的,该模型可以处理更大的时间步长,类似于 MuJoCo。
摩擦各向异性 – 用金字塔替换锥体会引入轻微的各向异性。增加方向数量会减少这一点但成本更高。
柔软度 – 调整
imp和timeconst可以让您在约束刚度与数值条件之间进行权衡。接近 1 的值较硬但可能减慢收敛。选择求解器 – 对具有数千个自由度的场景或内存紧张时使用 CG;当需要非常高的精度或自由度计数适中(<100)时切换到 Newton。