Professional Documents
Culture Documents
Euler
Euler
Rotation matrices
We start o with the standard denition of the rotations about the three principle axes. A rotation of radians about the x-axis is dened as 1 0 0 Rx () = 0 cos sin 0 sin cos Similarly, a rotation of radians about cos 0 Ry () = sin the y-axis is dened as 0 sin 1 0 0 cos
Finally, a rotation of radians about the z-axis is dened as cos sin 0 Rz () = sin cos 0 0 0 1 The angles , , and are the Euler angles.
This matrix can be thought of a sequence of three rotations, one about each principle axis. Since matrix multiplication does not commute, the order of the axes which one rotates about will aect the result. For this analysis, we will rotate rst about the x-axis, then the y-axis, and nally the z-axis. Such a sequence of rotations can be represented as the matrix product,
= Rz ()Ry ()Rx () cos cos sin sin cos cos sin cos sin cos + sin sin = cos sin sin sin sin + cos cos cos sin sin sin cos sin sin cos cos cos
Given a rotation matrix R, we can compute the Euler angles, , , and by equating each element in R with the corresponding element in the matrix product Rz ()Ry ()Rx (). This results in nine equations that can be used to nd the Euler angles.
However, one must be careful in interpreting this equation. Since sin( ) = sin(), there are actually two distinct values (for R31 = 1) of that satisfy Equation 1. Therefore, both the values 1 2 = sin1 (R31 ) = 1 = + sin1 (R31 )
are valid solutions. We will handle the special case of R31 = 1 later in this report. So using the R31 element of the rotation matrix, we are able to determine two possible values for .
where atan2(y, x) is arc tangent of the two variables x and y. It is similar to calculating the arc tangent of y/x, except that the signs of both arguments are used to determine the quadrant of the result, which lies in the range [, ]. The function atan2 is available in many programming languages. One must be careful in interpreting Equation 2. If cos() > 0, then = atan2(R32 , R33 ). However, when cos() < 0, = atan2(R32 , R33 ). A simple way to handle this is to use the equation = atan2 R32 R33 , cos cos (3)
to compute . Equation 3 is valid for all cases except when cos = 0. We will deal with this special case later in this report. For each value of , we compute a corresponding value of using Equation 3, yielding 1 2 = = atan2 atan2 R32 R33 , cos 1 cos 1 R33 R32 , cos 2 cos 2 (4) (5)
Again, this equation is valid for all cases except when cos = 0. We will deal with this special case later in this report. For each value of , we compute a corresponding value of using Equation 6, 1 2 = = atan2 atan2 R21 R11 , cos 1 cos 1 R21 R11 , cos 2 cos 2 (7) (8)
What if cos = 0?
This technique described above does not work if the R31 element of the rotation matrix is 1 or 1, which corresponds to = /2 or = /2, respectively, and to cos = 0. When we try to solve for the possible values of and using the above technique, problems will occur, since the elements R11 , R21 , R32 , and R33 will all be zero, and therefore Equations 3 and 6 will become = atan2 atan2 0 0 , 0 0 0 0 , 0 0
In this case R11 , R21 , R32 , and R33 do not constrain the values of and . Therefore, we must use dierent elements of the rotation matrix to compute the values of and .
= /2 case: Consider the case when = /2. Then, R12 R13 R22 R23 = sin cos cos sin = sin( ) = cos cos + sin sin = cos( ) = sin sin + cos cos = cos( ) = R13 = cos sin sin cos = sin( ) = R12
Any and that satisfy these equations will be a valid solution. Using the equations for R12 and R13 , we nd that ( ) = atan2(R12 , R13 ) = + atan2(R12 , R13 )
= /2 case: Not surprisingly, a similar result holds for the case when = /2, for which R12 R13 R22 R23 = = = = sin cos cos sin = sin( + ) cos cos + sin sin = cos( + ) sin sin + cos cos = cos( + ) = R13 cos sin sin cos = sin( + ) = R12
Again, using the equations for R12 and R13 , we nd that ( + ) = atan2(R12 , R13 ) = + atan2(R12 , R13 )
2 = atan2 else = anything; can set to 0 if (R31 = 1) = /2 = + atan2(R12 , R13 ) else = /2 = + atan2(R12 , R13 ) end if end if Figure 1: Pseudo-code for computing Euler angles from a rotation matrix. See text for details. Either case: In both the = /2 and = /2 cases, we have found that and are linked. This phenomenon is called Gimbal lock. Although in this case, there are an innite number of solutions to the problem, in practice, one is often interested in nding one solution. For this task, it is convenient to set = 0 and compute as described above.
Pseudo-code
We now summarize the method by providing a pseudo-code implementation in Figure 1. The code is very simple.
Example
An example that demonstrates the computation of , , and from a rotation matrix is provided below. Suppose we are asked to nd the Euler angles that produce the matrix .5 .1464 .8536 .5 .8536 .1464 R= .7071 .5 .5 First, we nd the possible values for to be 1 = sin(.7071) = 5 4
= 1 =
3 4
Then, we nd the corresponding values of to be 1 2 And we nd to be 1 2 = = atan2 atan2 .5 .5 , = cos(/4) cos(/4) 4 .5 .5 3 , = cos(3/4) cos(3/4) 4 = = atan2 atan2 .5 .5 , = cos(/4) cos(/4) 4 .5 .5 3 , = cos(3/4) cos(3/4) 4
Acknowledgement
I wish to thank Sinisa Segvic, from the University of Zagreb, for providing some insights into how to reduce the number of possible solutions to two for the non-degenerate case. Also, many thanks to Tobias Ziegler from the Fraunhofer Institute for pointing out the need for negative signs on R12 and R13 in the = /2 case.
References
[1] Ken Shoemake, Animating Rotation with Quaternion Curves Proc. SIGGRAPH 1985, pp. 245 - 254.