Index of Functions: A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X 
Index Page
eul2xf

Table of contents
Procedure
Abstract
Required_Reading
Keywords
Declarations
Brief_I/O
Detailed_Input
Detailed_Output
Parameters
Exceptions
Files
Particulars
Examples
Restrictions
Literature_References
Author_and_Institution
Version

Procedure

     EUL2XF ( Euler angles and derivative to transformation )

     ENTRY      EUL2XF ( EULANG, AXISA, AXISB, AXISC, XFORM )

Abstract

     Compute a state transformation from an Euler angle factorization
     of a rotation and the derivatives of those Euler angles.

Required_Reading

     ROTATION

Keywords

     ANGLES
     DERIVATIVES
     STATE

Declarations

    DOUBLE PRECISION      EULANG ( 6 )
    INTEGER               AXISA
    INTEGER               AXISB
    INTEGER               AXISC
    DOUBLE PRECISION      XFORM  ( 6, 6 )

Brief_I/O

     VARIABLE  I/O  DESCRIPTION
     --------  ---  --------------------------------------------------
     EULANG     I   An array of Euler angles and their derivatives.
     AXISA      I   Axis A of the Euler angle factorization.
     AXISB      I   Axis B of the Euler angle factorization.
     AXISC      I   Axis C of the Euler angle factorization.
     XFORM      O   A state transformation matrix.

Detailed_Input

     EULANG   is the set of Euler angles corresponding to the
              specified factorization.

              If we represent R as shown here:

                 R =  [ ALPHA ]      [ BETA ]      [ GAMMA ]
                               AXISA         AXISB          AXISC

              then

                 EULANG(1) = ALPHA
                 EULANG(2) = BETA
                 EULANG(3) = GAMMA
                 EULANG(4) = dALPHA/dt
                 EULANG(5) = dBETA/dt
                 EULANG(6) = dGAMMA/dt


     AXISA,
     AXISB,
     AXISC    are the axes desired for the factorization of R.

              All must be in the range from 1 to 3. Moreover
              it must be the case that AXISA and AXISB are distinct
              and that AXISB and AXISC are distinct.

              Every rotation matrix can be represented as a product
              of three rotation matrices about the principal axes
              of a reference frame.

                 R =  [ ALPHA ]      [ BETA ]      [ GAMMA ]
                               AXISA         AXISB          AXISC

              The value 1 corresponds to the X axis.
              The value 2 corresponds to the Y axis.
              The value 3 corresponds to the Z axis.

Detailed_Output

     XFORM    is the state transformation matrix corresponding to R
              and dR/dt as described above. Pictorially,

                 .-             -.
                 |       |       |
                 |   R   |   0   |
                 |       |       |
                 |-------+-------|
                 |       |       |
                 | dR/dt |   R   |
                 |       |       |
                 `-             -'

              where R is a rotation matrix that varies with respect to
              time and dR/dt is its time derivative.

Parameters

     None.

Exceptions

     1)  If any of AXISA, AXISB, or AXISC do not have values in

            { 1, 2, 3 }

         an error is signaled by a routine in the call tree of this
         routine.

Files

     None.

Particulars

     A word about notation: the symbol

        [ x ]
             i

     indicates a coordinate system rotation of x radians about the
     ith coordinate axis. To be specific, the symbol

        [ x ]
             1

     indicates a coordinate system rotation of x radians about the
     first, or x-, axis; the corresponding matrix is

        .-                    -.
        |  1      0       0    |
        |                      |
        |  0    cos(x)  sin(x) |
        |                      |
        |  0   -sin(x)  cos(x) |
        `-                    -'

     Remember, this is a COORDINATE SYSTEM rotation by x radians; this
     matrix, when applied to a vector, rotates the vector by -x
     radians, not x radians. Applying the matrix to a vector yields
     the vector's representation relative to the rotated coordinate
     system.

     The analogous rotation about the second, or y-, axis is
     represented by

        [ x ]
             2

     which symbolizes the matrix

        .-                    -.
        | cos(x)   0   -sin(x) |
        |                      |
        |  0       1      0    |
        |                      |
        | sin(x)   0    cos(x) |
        `-                    -'

     and the analogous rotation about the third, or z-, axis is
     represented by

        [ x ]
             3

     which symbolizes the matrix

        .-                    -.
        |  cos(x)  sin(x)   0  |
        |                      |
        | -sin(x)  cos(x)   0  |
        |                      |
        |  0        0       1  |
        `-                    -'

     The input matrix is assumed to be the product of three
     rotation matrices, each one of the form

        .-                    -.
        |  1      0       0    |
        |                      |
        |  0    cos(r)  sin(r) |     (rotation of r radians about the
        |                      |      x-axis),
        |  0   -sin(r)  cos(r) |
        `-                    -'


        .-                    -.
        | cos(s)   0   -sin(s) |
        |                      |
        |  0       1      0    |     (rotation of s radians about the
        |                      |      y-axis),
        | sin(s)   0    cos(s) |
        `-                    -'

     or

        .-                    -.
        |  cos(t)  sin(t)   0  |
        |                      |
        | -sin(t)  cos(t)   0  |     (rotation of t radians about the
        |                      |      z-axis),
        |  0        0       1  |
        `-                    -'

     where the second rotation axis is not equal to the first or
     third. Any rotation matrix can be factored as a sequence of
     three such rotations, provided that this last criterion is met.

     This routine is intended to provide an inverse for XF2EUL.

     The two subroutine calls shown here will not change
     XFORM except for round off errors.

        CALL XF2EUL ( XFORM,  AXISA, AXISB, AXISC, EULANG, UNIQUE )
        CALL EUL2XF ( EULANG, AXISA, AXISB, AXISC, XFORM          )

     On the other hand the two calls

        CALL EUL2XF ( EULANG, AXISA, AXISB, AXISC, XFORM          )
        CALL XF2EUL ( XFORM,  AXISA, AXISB, AXISC, EULANG, UNIQUE )

     will leave EULANG unchanged only if the components of EULANG
     are in the range produced by XF2EUL and the Euler representation
     of the rotation component of XFORM is unique within that range.

Examples

     The numerical results shown for this example may differ across
     platforms. The results depend on the SPICE kernels used as
     input, the compiler and supporting libraries, and the machine
     specific arithmetic implementation.

     1) Suppose you have a set of Euler angles and their derivatives
        for a 3 1 3 rotation, and that you would like to determine
        the equivalent angles and derivatives for a 1 2 3 rotation.

           R = [ALPHA]  [BETA]  [GAMMA]
                      3       1        3

           R = [ROLL]  [PITCH]  [YAW]
                     1        2      3

        The following code example will perform the desired
        computation.


        Example code begins here.


              PROGRAM EUL2XF_EX1
              IMPLICIT NONE

        C
        C     Local variables.
        C
              DOUBLE PRECISION      ABGANG ( 6    )
              DOUBLE PRECISION      RPYANG ( 6    )
              DOUBLE PRECISION      XFORM  ( 6, 6 )

              LOGICAL               UNIQUE

        C
        C     Define the initial set of Euler angles.
        C
              ABGANG(1) =  0.01D0
              ABGANG(2) =  0.03D0
              ABGANG(3) =  0.09D0
              ABGANG(4) = -0.001D0
              ABGANG(5) = -0.003D0
              ABGANG(6) = -0.009D0

        C
        C     Compute the equivalent angles and derivatives for a
        C     1-2-3 rotation.
        C
              CALL EUL2XF ( ABGANG, 3, 1, 3, XFORM  )
              CALL XF2EUL ( XFORM,  1, 2, 3, RPYANG, UNIQUE )

              IF ( UNIQUE )  THEN

                 WRITE(*,'(A)') '1-2-3 equivalent rotation to input '
             .               // '(radians):'
                 WRITE(*,'(2(A,F13.9))') 'Roll  ', RPYANG(1),
             .                           ', dRoll/dt  ', RPYANG(4)
                 WRITE(*,'(2(A,F13.9))') 'Pitch ', RPYANG(2),
             .                           ', dPitch/dt ', RPYANG(5)
                 WRITE(*,'(2(A,F13.9))') 'Yaw   ', RPYANG(3),
             .                           ', dYaw/dt   ', RPYANG(6)

              ELSE

                 WRITE(*,*) 'The values in RPYANG are not uniquely '
             .          //  'determined.'

              END IF

              END


        When this program was executed on a Mac/Intel/gfortran/64-bit
        platform, the output was:


        1-2-3 equivalent rotation to input (radians):
        Roll    0.029998501, dRoll/dt   -0.002999550
        Pitch  -0.000299950, dPitch/dt   0.000059980
        Yaw     0.099995501, dYaw/dt    -0.009998650

Restrictions

     None.

Literature_References

     None.

Author_and_Institution

     N.J. Bachman       (JPL)
     J. Diaz del Rio    (ODC Space)
     W.L. Taber         (JPL)
     E.D. Wright        (JPL)

Version

    SPICELIB Version 2.1.0, 26-OCT-2021 (JDR)

        Added IMPLICIT NONE statement.

        Edited the header to comply with NAIF standard. Added complete
        code example based on existing fragment.

    SPICELIB Version 2.0.1, 25-APR-2007 (EDW)

        Corrected code in $Examples section, example showed
        a XF2EUL call:

           CALL XF2EUL ( XFORM,  1, 2, 3, RPYANG )

        The proper form of the call:

           CALL XF2EUL ( XFORM,  1, 2, 3, RPYANG, UNIQUE )

    SPICELIB Version 2.0.0, 31-OCT-2005 (NJB)

        Restriction that second axis must differ from both the first
        and third axes was removed.

    SPICELIB Version 1.0.0, 31-JUL-1995 (WLT)
Fri Dec 31 18:36:21 2021