🔗 刚体碰撞解析#

Genesis 遵循与 MuJoCo 非常相似的二次惩罚公式来强制执行刚体约束。本文档总结了该模型的数学原理和物理解释。


1. 一般公式#

  • \(q\) – 关节配置(广义位置)

  • \dot q – 广义速度

  • \(a = \ddot q\) – 每个子步要求解的未知广义加速度

  • \(M(q)\) – 关节空间质量矩阵(正定)

  • \(\tau_{ext}\) – 所有已知的外部关节力(驱动、重力、流体动力学…)

  • \(J \) – 在加速度空间中线性化的运动约束堆栈

  • \(D\) – 每个约束的柔软度 / 阻抗参数对角矩阵

  • \(a_{ref}\) – 试图恢复穿透或满足电机的参考加速度

我们寻求最小化二次成本的加速度

\[ \frac12 (M a \,{-}\, \tau_{ext})^{\!T} (a \,{-}\, a^{\text{prev}}) \;{+}\; \frac12 (J a \,{-}\, a_{ref})^{\!T} D (J a \,{-}\, a_{ref}) \]

2. 接触与摩擦模型#

对于每个接触对,Genesis 创建四个约束,它们是摩擦金字塔的基础。数学上每个方向 tᵢ

\[ \mathbf t\_i = \pm d_1\,\mu - \mathbf n \quad\text{或}\quad \pm d_2\,\mu - \mathbf n , \]

因此 tᵢ 上的正乘数产生位于锥体 \(|\mathbf f_t| \le \mu f_n\) 内部的力。与组合逆质量成比例的对角项 Dᵢ 给出了熟悉的软约束行为,其中较大的 imp(隐式性)值导致更硬的接触。


3. 关节限制(不等式约束)#

旋转和平移关节可选地带有下限上限位置限制。每当到限制的带符号距离变为负数时

\[ \phi = q - q_{min} < 0 \quad\text{或}\quad \phi = q_{max} - q < 0 \]

生成一个单一的 1-DOF 约束,其雅可比为

\[ J = \pm 1 \]

和参考加速度

\[ a_{ref} = k\,\phi + c \,\dot q, \]

从标量 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。

  • 摩擦各向异性 – 用金字塔替换锥体会引入轻微的各向异性。增加方向数量会减少这一点但成本更高。

  • 柔软度 – 调整 imptimeconst 可以让您在约束刚度与数值条件之间进行权衡。接近 1 的值较硬但可能减慢收敛。

  • 选择求解器 – 对具有数千个自由度的场景或内存紧张时使用 CG;当需要非常高的精度或自由度计数适中(<100)时切换到 Newton