Add Jdot correction for connect and weld constaints

Measured reduction in constraint violations before/after this change:

| Model | Correction ON (Avg Viol) | Correction OFF (Avg Viol) | Reduction |
| :--- | :--- | :--- | :--- |
| `jdotv_connect_2d.xml` | 3.959e-4 | 1.699e-3 | **76.7%** |
| `jdotv_connect_3d.xml` | 1.399e-3 | 5.493e-3 | **74.5%** |
| `jdotv_weld_3d.xml` | 9.472e-3 | 1.148e-2 | **17.5%** |

PiperOrigin-RevId: 899137525
Change-Id: Ic3e33764ebd64239bab916289c23d80c3da0b51b
This commit is contained in:
Yuval Tassa
2026-04-13 12:47:17 -07:00
committed by Copybara-Service
parent 0c337799bd
commit 412cee2059
13 changed files with 481 additions and 43 deletions
+7 -4
View File
@@ -1296,10 +1296,13 @@ when
This key identity is essentially Newton's second law projected in constraint space. It is derived by moving the term
:math:`c` in the equations of motion :eq:`eq:motion` to the right hand side, multiplying by :math:`J M^{-1}` from the
left, adding :math:`\dot{J} v` to both sides, and substituting the above definitions of :math:`A, \au, \ac`. In terms of
implementation, we do not actually compute the acceleration term :math:`\dot{J} v`. This is because our optimization
problems depend on differences of constraint-space accelerations, and so this term would cancel out even if we were to
compute it.
left, adding :math:`\dot{J} v` to both sides, and substituting the above definitions of :math:`A, \au, \ac`. Computing
:math:`\dot{J} v` requires differentiating the constraint Jacobian with respect to time, which is nontrivial.
Although this term cancels in the identity :eq:`eq:identity` and so does not affect the forward-inverse comparison, its
omission in the forward dynamics introduces a velocity-dependent bias for any constraint whose Jacobian varies with
configuration. We compute this term for equality constraints (connect and weld) where Jacobian differentiation
is tractable. For contacts, the term remains omitted due to the complexity of differentiating the contact frame through
the collision pipeline.
Note that the quadratic term in the inverse problem is weighted by :math:`R` instead of :math:`A+R`. This is the key
structural insight: the :math:`A` matrix cancels entirely, leaving only :math:`R` in the quadratic term. Two