<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://patrius.cnes.fr/index.php?action=history&amp;feed=atom&amp;title=User_Manual_4.15_Kinematics</id>
	<title>User Manual 4.15 Kinematics - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://patrius.cnes.fr/index.php?action=history&amp;feed=atom&amp;title=User_Manual_4.15_Kinematics"/>
	<link rel="alternate" type="text/html" href="https://patrius.cnes.fr/index.php?title=User_Manual_4.15_Kinematics&amp;action=history"/>
	<updated>2026-04-05T18:42:59Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://patrius.cnes.fr/index.php?title=User_Manual_4.15_Kinematics&amp;diff=3847&amp;oldid=prev</id>
		<title>Admin tsn : Page créée avec « __NOTOC__  == Introduction == === Scope === The purpose is to extend the attitude package with classes and methods to compute and process kinematics operations.  === Javad... »</title>
		<link rel="alternate" type="text/html" href="https://patrius.cnes.fr/index.php?title=User_Manual_4.15_Kinematics&amp;diff=3847&amp;oldid=prev"/>
		<updated>2024-11-21T15:19:35Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « __NOTOC__  == Introduction == === Scope === The purpose is to extend the attitude package with classes and methods to compute and process kinematics operations.  === Javad... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__NOTOC__ &lt;br /&gt;
== Introduction ==&lt;br /&gt;
=== Scope ===&lt;br /&gt;
The purpose is to extend the attitude package with classes and methods to compute and process kinematics operations.&lt;br /&gt;
&lt;br /&gt;
=== Javadoc ===&lt;br /&gt;
The kinematics objects are available in the package fr.cnes.sirius.patrius.attitudes.kinematics.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Library&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Javadoc&lt;br /&gt;
|-&lt;br /&gt;
|Orekit&lt;br /&gt;
|[{{JavaDoc4.15}}/fr/cnes/sirius/patrius/attitudes/kinematics/package-summary.html Package fr.cnes.sirius.patrius.attitudes.kinematics]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
None as of now.&lt;br /&gt;
&lt;br /&gt;
=== Useful Documents ===&lt;br /&gt;
None as of now.&lt;br /&gt;
&lt;br /&gt;
=== Package Overview ===&lt;br /&gt;
The following diagram represents the main classes of the package : &lt;br /&gt;
&amp;lt;code&amp;gt;fr.cnes.sirius.patrius.attitudes.kinematics&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Please note that not all implementations are present in the following diagram for the sake of clarity.&lt;br /&gt;
&lt;br /&gt;
[[File:kinematics.png|center]]&lt;br /&gt;
&lt;br /&gt;
== Features Description ==&lt;br /&gt;
=== Quaternions differentiation ===&lt;br /&gt;
A quaternion can be differentiated using various methods:&lt;br /&gt;
&lt;br /&gt;
* The quaternion differentiation’s formula &amp;lt;math&amp;gt;\dot{Q}_{S/R} = \frac{1}{2}Q_{S/R}\Omega_{S/R}^{[S]}&amp;lt;/math&amp;gt;.&lt;br /&gt;
This formula connects time derivative of the quaternion q(t) with the vector of angular velocity W(t).&lt;br /&gt;
&lt;br /&gt;
* When the quaternion is represented by a set of differentiable functions (Fourier series or polynomials), a direct analytic computation can be performed to get its derivative;&lt;br /&gt;
&lt;br /&gt;
* Numerical differentiation (using finite difference, Ridders differentiation method, ...)&lt;br /&gt;
&lt;br /&gt;
=== Quaternion integration ===&lt;br /&gt;
A rotation can be integrated, knowing its spin time function, using these methods:&lt;br /&gt;
* Wilcox method, with available approximations orders 1 to 4&lt;br /&gt;
* Edwards method, that corresponds to an order 3 approximation&lt;br /&gt;
&lt;br /&gt;
=== Spin computation ===&lt;br /&gt;
The spin can be represented by a vector (instantaneous spin), or by a time-dependent function. &lt;br /&gt;
The computation of the instantanous value of the spin can be made by one of the following methods:&lt;br /&gt;
&lt;br /&gt;
* estimate the spin from two rotations corresponding to two different dates;&lt;br /&gt;
* using the kinematics equation when a quaternion and its derivative are known;&lt;br /&gt;
* compute the spin from the Euler or Cardan angles and their derivatives;&lt;br /&gt;
* using a direct analytic computation (when the function representing its variation over time is available).&lt;br /&gt;
&lt;br /&gt;
=== Time-dependent orientation function===&lt;br /&gt;
The interface &amp;lt;code&amp;gt;OrientationFunction&amp;lt;/code&amp;gt; and the abstract class &amp;lt;code&amp;gt;AbstractOrientationFunction&amp;lt;/code&amp;gt; have been added to the kinematics package in order to represent a time-dependent orientation function.&lt;br /&gt;
&lt;br /&gt;
These classes provide the following functionalities:&lt;br /&gt;
&lt;br /&gt;
* return the orientation at a date, by the &amp;lt;code&amp;gt;getOrientation(AbsoluteDate)&amp;lt;/code&amp;gt; method; it is an abstract method because it is specific to the orientation (or attitude) law the user wants to implement;&lt;br /&gt;
&lt;br /&gt;
* return the function representing the derivative of the quaternion components, by the &amp;lt;code&amp;gt;derivative()&amp;lt;/code&amp;gt; method. A numerical differentiation method is used to compute the derivatives, nevertheless the classes inheriting the &amp;lt;code&amp;gt;AbstractOrientationFunction&amp;lt;/code&amp;gt; can override this method and return the analytical function representing the derivatives, when possible.&lt;br /&gt;
&lt;br /&gt;
* compute the function representing the spin using the &amp;lt;math&amp;gt;\Omega_{S/R}^{[S]} = 2Q_{S/R}\dot{Q}_{S/R}&amp;lt;/math&amp;gt; formula, by the &amp;lt;code&amp;gt;computeSpinFunction()&amp;lt;/code&amp;gt; method. The derivatives of the quaternion are computed thanks to the &amp;lt;code&amp;gt;derivative()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
* estimate the function representing the spin using two rotations corresponding to two different dates (the velocity is supposed to be constant during the time interval between the two rotations), by the &amp;lt;code&amp;gt;estimateRateFunction(dt)&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
* return the spin at a date, by the &amp;lt;code&amp;gt;computeSpin(AbsoluteDate)&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;estimateRate(AbsoluteDate, dt)&amp;lt;/code&amp;gt; methods (they call the &amp;lt;code&amp;gt;computeSpinFunction()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;estimateRateFunction(dt)&amp;lt;/code&amp;gt; methods)&lt;br /&gt;
&lt;br /&gt;
=== Time-dependent spin function===&lt;br /&gt;
The interface &amp;lt;code&amp;gt;Vector3DFunction&amp;lt;/code&amp;gt; and the abstract class &amp;lt;code&amp;gt;AbstractVector3DFunction&amp;lt;/code&amp;gt; have been added to the kinematics package in order to represent a time-dependent vector 3D function; a vector 3D function is used to represent the spin, or the n-th derivative of the spin.&lt;br /&gt;
&lt;br /&gt;
These classes provide the following functionalities:&lt;br /&gt;
&lt;br /&gt;
* return the vector at a date, by the &amp;lt;code&amp;gt;getVector3D(AbsoluteDate)&amp;lt;/code&amp;gt; method; it is an abstract method because it is specific to the spin (or derivative of the spin) the user wants to implement;&lt;br /&gt;
&lt;br /&gt;
* return the function representing the n-th derivative of the vector, by the &amp;lt;code&amp;gt;nthDerivative(order)&amp;lt;/code&amp;gt; method. A numerical differentiation method is used to compute the derivatives, nevertheless the classes inheriting the &amp;lt;code&amp;gt;AbstractVector3DFunction&amp;lt;/code&amp;gt; can override this method and return the analytical function representing the derivatives, when possible. &lt;br /&gt;
This method uses the classes contained in the differentiation package, in particular the &amp;lt;code&amp;gt;DerivativeStructure&amp;lt;/code&amp;gt; class, which allows to compute the n-th derivatives of a function at a point;&lt;br /&gt;
&lt;br /&gt;
* return the integral of the function by the &amp;lt;code&amp;gt;integral(x0, xf)&amp;lt;/code&amp;gt; method. A numerical integration method is used to compute the integral, nevertheless the classes inheriting the &amp;lt;code&amp;gt;AbstractVector3DFunction&amp;lt;/code&amp;gt; can override this method and return the analytical function representing the integral, when possible.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;DynamicsElements&amp;lt;/code&amp;gt; object is created from a spin function and it gathers the n-th derivatives of spin at a given date; an attribute of this class is contained in the &amp;lt;code&amp;gt;Attitude&amp;lt;/code&amp;gt; class.&lt;br /&gt;
&lt;br /&gt;
=== Differentiate a quaternion ===&lt;br /&gt;
As a time-dependent quaternion can be represented by the &amp;lt;code&amp;gt;OrientationFunction&amp;lt;/code&amp;gt; interface, the derivative of the quaternion can be computed using the &amp;lt;code&amp;gt;derivative()&amp;lt;/code&amp;gt; method. As this method is implemented by the user, he can choose to use a numerical differentiation method or to compute the exact derivative, when possible. &lt;br /&gt;
&lt;br /&gt;
The derivative of a quaternion can be also computed using the kinematics equation: &amp;lt;math&amp;gt;\dot{Q}_{S/R} = \frac{1}{2}Q_{S/R}\Omega_{S/R}^{[S]}&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
This equation is implemented by the following method in the kinematics toolkit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public static Quaternion differentiateQuaternion(final Quaternion q, final Vector3D spin)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Integrate a quaternion ===&lt;br /&gt;
The rotation integration is to be made by the class &amp;lt;code&amp;gt;AngularVelocitiesPolynomialProfileLeg&amp;lt;/code&amp;gt;. This class requires to provide the integration method (Wilcox  up to order 4 or Edwards) as well as the angular rate on each component.&lt;br /&gt;
&lt;br /&gt;
=== Differentiate and integrate a vector ===&lt;br /&gt;
In a similar way to the orientation function, a new class has been added in order to represent a time-dependent 3-D vector function. This class implements the &amp;lt;code&amp;gt;Vector3DFunction&amp;lt;/code&amp;gt; interface, and it contains the methods to compute the derivative of the vector or its integral over a time period. The computation can be done using a numerical method or it can be analytical, when possible.&lt;br /&gt;
&lt;br /&gt;
=== Compute the spin ===&lt;br /&gt;
The Kinematics package contains some methods aiming to compute the instantaneous spin. These methods are listed hereafter:&lt;br /&gt;
&lt;br /&gt;
* Estimation: two rotations corresponding to two different dates are used to compute the spin (the velocity is supposed to be constant during the time interval between the two rotations).&lt;br /&gt;
This function is implemented by the following method in the kinematics toolkit:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public static Vector3D estimateSpin(final Rotation start, final Rotation end, final double dt)&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;\Omega_{S/R}^{[S]} = 2Q_{S/R}\dot{Q}_{S/R}&amp;lt;/math&amp;gt;, when knowing the derivative of the quaternion.&lt;br /&gt;
This equation is implemented by the following kinematics toolkit method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public static Vector3D computeSpin(final Quaternion q, final Quaternion qd)&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Using the derivative of the Euler or Cardan angles:&lt;br /&gt;
** Euler (not to be used when the angles are small):  &lt;br /&gt;
&amp;lt;math&amp;gt;\Omega_{S/R}^{[S]} = \left[ \begin{array}{c} \dot{\psi}\sin(\theta)\sin(\phi) + \dot{\theta}\cos(\phi) \\ \dot{\psi}\sin(\theta)\cos(\phi)- \dot{\theta}\sin(\phi) \\ \dot{\psi}\cos(\theta) + \dot{\phi} \end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
** Cardan (only to be used when the angles are small):&lt;br /&gt;
&amp;lt;math&amp;gt;\Omega_{S/R}^{[S]} = \left[ \begin{array}{c}-\dot{\psi}\sin(\theta)+\dot{\phi} \\ \dot{\psi}\cos(\theta)\sin(\phi) + \dot{\theta}\cos(\phi) \\ \dot{\psi}\cos(\theta)\cos(\phi) - \dot{\theta}\sin(\phi) \end{array} \right]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These formula are implemented by the following kinematics toolkit method:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;public static Vector3D computeSpin(final double[] ang, final double[] angd, final RotationOrder order)&amp;lt;/syntaxhighlight&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Analytic computation: if the spin is represented by a function, its instantaneous value must be obtained by direct analytic computation (the &amp;lt;code&amp;gt;IVector3DFunction&amp;lt;/code&amp;gt; classes have been created for this purpose)&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
== Contents ==&lt;br /&gt;
=== Interfaces ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Interface&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Summary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Javadoc&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;OrientationFunction&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|This interface represents a generic univariate orientation function.&lt;br /&gt;
|[{{JavaDoc4.15}}/fr/cnes/sirius/patrius/attitudes/kinematics/OrientationFunction.html ...]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Vector3DFunction&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|This interface represents a generic univariate 3-D vector function.&lt;br /&gt;
|[{{JavaDoc4.15}}/fr/cnes/sirius/patrius/attitudes/kinematics/Vector3DFunction.html ...]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Classes ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Class&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Summary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| Javadoc&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;AbstractOrientationFunction&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|This class represents an orientation function.&lt;br /&gt;
|[{{JavaDoc4.15}}/fr/cnes/sirius/patrius/attitudes/kinematics/AbstractOrientationFunction.html ...]&lt;br /&gt;
|-&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;AbstractVector3DFunction&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|This class represents a spin function, or a spin n-th derivative function.&lt;br /&gt;
|[{{JavaDoc4.15}}/fr/cnes/sirius/patrius/attitudes/kinematics/AbstractVector3DFunction.html ...]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:User_Manual_4.15_Attitude]]&lt;/div&gt;</summary>
		<author><name>Admin tsn</name></author>
	</entry>
</feed>