Constraints 简化问题分析

💡 为什么先学小球? 接下来要介绍关节约束的求解。在讲解角色的关节约束之前,先用小球的简单例子来理解约束求解的核心思想。 小球约束与关节约束的数学形式完全相同,只是场景更简单、更容易理解。


问题描述

✅ 假设有一约束:小球必须按轨道行进。

小球速度分析

✅ 根据已知条件,可以进行以下分析:由于每一时刻都满足,对时间求导,导数为零。

其中第一项为 \(g(x)\) 的雅克比矩阵,记作 \(J\) 或 \([\nabla g]^{T}\), 第二项为 \(x\) 的速度。 因此得到约束为:如果要求小球按照轨道运行,其速度必须满足以下公式。

小球的约束力分析

✅ 为了让小球满足约束,需给小球一个约束力。

\(^\ast \) Constraint is passive No energy gain or loss!!!

$$ f_c\cdot v=0 $$

✅ 约束力不应产生能量,即力与运动方向垂直。

✅ \(J\) 本是一个矩阵,但在这个场景中 \(C\) 是常数,所以 \(J\) 是向量。 ✅ 结合是一页的结论可知:\(f_c\) 与 \(J\) 同方向,但大小未知。\(\lambda \)代表一个未知的 scale。 ✅ \(f_c\) 大小以当前状态和外力情况计算而得。

小球的整体受力分析

✅ 对小球做受力分析,受到外力 \(f\) 和约束力 \(f_c\). ✅ 假设 \(M,x,v.f\) 已知,求 \(f_c\) ,使得小球沿轨迹移动。

$$ \begin{align*} M\dot{v} & =f+J^T\lambda \\ Jv&=0 \end{align*} $$

✅ 公式 1:\(f=am\).公式 2:前面推导得出。把两个公式离散化。 ✅ 假设当前时刻已满足 \(J_n v_n = 0\),所以只约束下一时刻。

$$ \begin{align*} M\frac{v_{n+1}-v_n}{h} & =f+J^T\lambda \\ Jv_{n+1}&=0 \end{align*} $$

✅ 得出未知数为\(\lambda\)和\(v_{n+1}\)的联立方程组,求解方程组。 ✅ 因为公式 2 只约束了速度没有约束位置。离散化后对原公式只是近似,会有误差,导到小球远离曲线。 ✅ 解方程组不难,但存在小球偏离轨道的问题。

✅ 当物体偏离轨道,要把它拉回来。因此公式 2 改为:

$$ Jv_{n+1}=\alpha \frac{C-g(x_n)}{h} $$

等式右边的非零项称为 Correction of numerical errors。 𝛼: error reduction parameter (ERP)

方程组求解

✅ 把校正项简写为 \(b\). \( n \) 时刻发现的误差由 \( n+1 \) 时刻来校正。 ✅ 为了防止矩阵不可逆,增加 \(\beta I\).(常见技巧) ✅ 解 \(\lambda\) 需要先求逆。


附录:公式推导过程

目标:求解拉格朗日乘子 \(\lambda\)

已知方程组(带误差校正):

$$ \begin{cases} \displaystyle M\frac{v_{n+1}-v_n}{h} = f + J^T\lambda \\ Jv_{n+1} = b \end{cases} $$

其中 \(b = \alpha\frac{C-g(x_n)}{h}\) 是误差校正项。


步骤 1:从运动方程解出 \(v_{n+1}\)

$$ M\frac{v_{n+1}-v_n}{h} = f + J^T\lambda $$

$$ v_{n+1}-v_n = h M^{-1}(f + J^T\lambda) $$

$$ v_{n+1} = v_n + h M^{-1}f + h M^{-1}J^T\lambda $$

令 \(v^* = v_n + h M^{-1}f\)(不含约束力的预测速度

则: $$ v_{n+1} = v^* + h M^{-1}J^T\lambda $$


步骤 2:代入约束方程

约束方程: $$ Jv_{n+1} = b $$

代入 \(v_{n+1}\): $$ J(v^* + h M^{-1}J^T\lambda) = b $$

展开: $$ Jv^* + h J M^{-1}J^T\lambda = b $$


步骤 3:解出 \(\lambda\)

$$ h J M^{-1}J^T\lambda = b - Jv^* $$

$$ \lambda = (h J M^{-1}J^T)^{-1}(b - Jv^*) $$


步骤 4:防止矩阵不可逆

\(J M^{-1}J^T\) 可能不可逆(例如约束冗余时),添加正则化项 \(\beta I\):

$$ \lambda = (J M^{-1}J^T + \beta I)^{-1}(b - Jv^*) $$


最终公式

$$ \boxed{\lambda = (J M^{-1}J^T + \beta I)^{-1}(b - Jv^*)} $$

符号含义
\(v^* = v_n + h M^{-1}f\)无约束时的预测速度
\(b = \alpha\frac{C-g(x_n)}{h}\)误差校正项(ERP)
\(\beta I\)防止矩阵不可逆的正则化项

✅ 核心思想:把约束求解转化为求解拉格朗日乘子 \(\lambda\) 的线性方程组


从小球到关节约束

小球例子的约束求解公式可以直接应用到关节约束。

概念小球例子关节约束
约束对象小球位置两个刚体的连接点
约束方程\(g(x) = 0\)(小球在轨道上)\(x_1 + R_1r_1 = x_2 + R_2r_2\)(连接点重合)
速度级约束\(Jv = 0\)\(v_1 + \omega_1 \times r_1 = v_2 + \omega_2 \times r_2\)
雅克比 J向量(\(1 \times 6\))矩阵(\(3 \times 12\))
约束力\(J^T\lambda\)(轨道支持力)\(J^T\lambda\)(关节力)
物理意义防止小球脱离轨道防止刚体分离

关节约束的约束方程推导

✅ 关节约束:两个刚体在关节处的位置必须相同。

位置级约束: $$ x_1 + R_1 r_1 = x_2 + R_2 r_2 $$

速度级约束(对时间求导): $$ v_1 + \omega_1 \times r_1 = v_2 + \omega_2 \times r_2 $$

矩阵形式: $$ \begin{bmatrix} I_3 & -[r_1]\times & -I_3 & [r_2]\times \end{bmatrix} \begin{bmatrix} v_1 \\ \omega_1 \\ v_2 \\ \omega_2 \end{bmatrix} = 0 $$

简化为: $$ Jv = 0 $$

数学形式完全相同:\(M\dot{v} + C = f + J^T\lambda\),\(Jv = b\) 只是 \(J\) 的具体形式不同(小球是向量,关节是矩阵)。

深入学习JointConstraint.md - 关节约束详细推导(各种关节的 \(J\) 矩阵构造与统一求解框架)