function
LieGroups.SO3.Quat.left_jacobian_exact
Left Jacobian J_l(v) of SO(3), closed form down to the exp_map branch radius
The same matrix as left_jacobian, evaluated with the branch
radius and the coefficient forms of
right_jacobian_exact. Both coefficients depend on the rotation
vector only through t^2, so J_l(v) = J_r(-v) is exact rather than an
approximation, and reflecting is the whole implementation.
No rule returns a left-trivialized derivative, so no rule calls this
today; Tests.RuleChecks.so3JacobianFamilyResiduals does, against
the transpose of right_jacobian_exact. It exists because the
reflection is the definition of the left Jacobian and a left-trivialized
rule added later must not reach for left_jacobian, whose
0.1 rad radius would put the same |v|^5/720 series truncation back into a
derivative.
Public declarations
Explicit source declarations; dimensions, modifications and defaults are shown as written, without evaluation.
| Role | Name | Type | Dimensions / attributes / default | Description |
|---|---|---|---|---|
| input | v | Real | [3] | Rotation vector |
| output | J | Real | [3, 3] | I + ((1-cos t)/t^2)[v]x + ((t-sin t)/t^3)[v]x^2, t = |v| |
Modelica declarations and implementation
Show parameters, interfaces and source
Parameters, inputs, outputs, defaults and equations from the source file.
function left_jacobian_exact
"Left Jacobian J_l(v) of SO(3), closed form down to the exp_map branch radius"
input Real v[3] "Rotation vector";
output Real J[3, 3] "I + ((1-cos t)/t^2)[v]x + ((t-sin t)/t^3)[v]x^2, t = |v|";
algorithm
J := LieGroups.SO3.Quat.right_jacobian_exact(-v);
annotation(Documentation(info="<html>
<p>The same matrix as <code>left_jacobian</code>, evaluated with the branch
radius and the coefficient forms of
<code>right_jacobian_exact</code>. Both coefficients depend on the rotation
vector only through t^2, so J_l(v) = J_r(-v) is exact rather than an
approximation, and reflecting is the whole implementation.</p>
<p>No rule returns a left-trivialized derivative, so no rule calls this
today; <code>Tests.RuleChecks.so3JacobianFamilyResiduals</code> does, against
the transpose of <code>right_jacobian_exact</code>. It exists because the
reflection is the definition of the left Jacobian and a left-trivialized
rule added later must not reach for <code>left_jacobian</code>, whose
0.1 rad radius would put the same |v|^5/720 series truncation back into a
derivative.</p>
</html>"));
end left_jacobian_exact;