$LastChangedDate: 27-Juil-2011 $

# CL_rot_quat2angles

Quaternion to Euler or Cardan rotation angles

## Calling Sequence

       [angles1,angles2,Inok] = CL_rot_quat2angles(q,naxes)

## Description

- Given a quaternion, this function computes the rotation angles (Euler or Cardan) that correspond to the combination of 3 elementary rotations, each being described by an axis number (1=x-axis, 2=y-axis, 3=z-axis).

  There are 6 Cardan rotations: XYZ, XZY, YXZ, YZX, ZXY and ZYX; and 6 Euler rotations: XYX, XZX, YXY, YZY, ZXZ and ZYZ.

- Notes:

  1) There are 2 sets of solutions:

  - For Cardan angles, angles1 is the solution for which the second rotation angle is between -pi/2 and pi/2.

  - For Euler angles, angles1 is the solution for which the second rotation angle is between 0 and pi.

  2) Cardan and Euler angles have singularities.

  - For Cardan angles, singularities occur when the second angle is close to -pi/2 or +pi/2

  - For Euler angles, singularities occur when the second angle is close to 0 or pi (which implies that the identity rotation is always singular for Euler angles!)

  3) The returned angles for cases close to singularities are approximate. The corresponding indices are returned in Inok.

## Parameters

q :

  Quaternion that defines the rotation (dim N).

naxes :

  Successive axes numbers : 1=x-axis, 2=y-axis or 3=z-axis (1x3 or 3x1)

angles1 :

  First set of rotation angles [rad] (3xN)

angles2 :

  Second set of rotation angles [rad] (3xN)

Inok :

  Indices for which singularities occur (1xP)

## Authors

- CNES - DCT/SB

## See also

- CL_rot_angles2quat

- CL_rot_angles2matrix

- CL_rot_matrix2angles

## Examples

    // Cardan angles (XYZ), second rotation angle < %pi/2
    naxes = [1,2,3];
    angles = [0.1;0.4;0.5];
    q = CL_rot_angles2quat(naxes,angles);
    [angles1,angles2,Inok] = CL_rot_quat2angles(q,naxes);
    angles1 - angles  // => 0

    // Cardan angles (XYZ), second rotation angle > %pi/2
    angles = [0.1;2.4;0.5];
    q = CL_rot_angles2quat(naxes,angles);
    [angles1,angles2,Inok] = CL_rot_quat2angles(q,naxes);
    angles2 - angles // => 0

    // Euler angles (ZXZ), second rotation angle close to 0 : singularity
    naxes = [3,1,3];
    angles = [0.1;0;0.5];
    q = CL_rot_angles2quat(naxes,angles);
    [angles1,angles2,Inok] = CL_rot_quat2angles(q,naxes);
    Inok // => not empty
    q1 = CL_rot_angles2quat(naxes,angles1);
    q1*q'  // => identity