Affine Body Revolute Joint Limit
#670 AffineBodyRevoluteJointLimit
Affine Body Revolute Joint Limit restricts the rotation angle of a Revolute Joint to a specified range. When the joint angle goes beyond the lower or upper bound, a cubic penalty is applied. It is an InterAffineBody extra constitution defined on revolute-joint geometry.
Energy
The limit adds an energy \(E(x)\) where \(x\) is the scalar joint angle (its exact meaning is given in Meaning of \(x\)). Let \(l,u\) be lower/upper limits and \(s\) be limit/strength.
For normal range width (\(u>l\)):
The normalized gaps are dimensionless, so changing \((l,u)\) does not require retuning \(s\) just because the interval width changed.
For degenerate limit (\(u=l\)), use fallback cubic:
Boundary points are treated as in-range.
Meaning of \(x\)
The revolute coordinate is evaluated in incremental form:
Here:
- \(\mathbf{q}\) is the current affine-body DOF.
- \(\mathbf{q}^{t}\) is the previous-time-step DOF.
- \(\mathbf{q}_{ref}\) is the reference DOF captured at initialization.
- \(\theta^t\) is the accumulated revolute angle from the previous step.
Note that \(\mathbf{q}\) is the concatenation of the DOF of the two affine bodies connected by the prismatic joint.
The Revolute Joint geometry is represented as an edge with two endpoints. The joint axis direction is defined by the order of the two endpoints giving \(+\hat{\mathbf{t}}\).
- \(x=0\): current relative revolute angle equals the reference angle.
- \(x>0\): positive rotation around \(+\hat{\mathbf{t}}\) (right-hand rule; counterclockwise when viewed along \(+\hat{\mathbf{t}}\)).
- \(x<0\): negative rotation around \(+\hat{\mathbf{t}}\) (clockwise when viewed along \(+\hat{\mathbf{t}}\)).
For Revolute Joints:
The sign of \(x\) follows the sign of \(\sin\theta\) under this convention. The angle branch is \((-\pi,\pi]\).
Requirement
This limit term is meaningful only on a geometry that already represents a Revolute Joint (UID=18). The limit augments that base relation as an extra constitution term.
Attributes
On edges:
limit/lower: \(l\) in the energy abovelimit/upper: \(u\) in the energy abovelimit/strength: \(s\) in the energy above