LESSON

# Rotation angle sequences in 3D

#### Transcript

Consider these two coordinate frames, frame A and frame B. They are both right-handed coordinate frames. And the problem we’re trying to solve is how do we describe the rotation of frame B with respect to frame A. Imagine we could pick up frame A and rotate it in space so that its axes were parallel to those of frame B. How do we do that? Well, a very famous Swiss mathematician, Leonhard Euler, came up with what’s called the Rotation Theorem. It states that two three-dimensional coordinate frames are related by a sequence of elementary rotations such as those about the x-axis, the y-axis, the z-axis. We need to apply no more than three of those, but the rotations in this sequence need to be about different axes; that is we’d rotate about x-axis, then the y-axis, then maybe the x-axis again or maybe about the z-axis. So any rotation can be expressed in terms of no more than three rotations as long as those three rotations are consecutively about different axes.

Let’s demonstrate this Rotation Theorem. Here, I have my world reference frame and here I have a coordinate frame that has got an arbitrary orientation in space. And so, the Rotation Theorem says that I should be able to take this coordinate frame and with simply three elementary rotations achieve an orientation like this. So, I’m going to take a copy of that world reference frame. And, first thing I’m going to do is to rotate it a little bit around the x-axis. Then, I’m going to rotate it a little bit around the y-axis, and then I’m going to rotate it a bit around the z-axis. And if I pick this axis up and put it in here, we’ll see that it now has a roughly the same orientation as the blue frame that I started with.

So, let’s write down all the possible sequences of rotation, where we apply this caveat that no two successive rotations are about the same axis. In fact, there are two of them and I’ve written them all down here. These rotations fall into two groups and the group shown here are referred to as Euler angles. And, they are the ones where there are two rotations about the same axis. The first one is rotation about X, then Y, then X again. Well, this one over here is Y, then Z, then Y again. So, in the Euler angle group, a particular axis will appear twice, but not twice consecutively.

This particular group; rotation around Z, then around Y, and then around Z is quite commonly called Euler angles, but in fact there are six Euler angles. So, we need to be very, very careful when we talk about an angle sequence. It’s in fact not good enough just to say Euler angles. We should be very specific and say ZYZ Euler angles. Different engineering communities use different conventions, and the ZYZ convention is pretty common in robotics and in aerospace, but there are other engineering disciplines where they use different conventions. Be very, very careful when you just talk about Euler angles.

Let’s experiment and here we’re talking about ZYZ sequence Euler angles. I’m going to use the Toolbox function eul2r, which takes three angular arguments, the three Euler angles. And, I’m just going to give them simple values: 0.1, 0. 2 and 0.3 radians respectively. And, here is the resulting rotation matrix that corresponds to the three Euler angles.

So you can think of this as two alternative representations for orientation of the coordinate frame. We can represent it as a 3 by 3 orthogonal matrix or we can represent it by three numbers which are the Euler angles. I can perform the inverse operation. I can convert a rotation matrix to Euler angles. To do that, I use the function tr2eul and I pass in the rotation matrix which we’ve just computed. And here we have the Euler angles. So I can convert Euler angles to a rotation matrix, a rotation matrix back to Euler angles.

Let’s have a look at a slightly different case where the middle Euler angle is a negative number and the result is rotation matrix. It’s a different rotation matrix to the one we had before because it’s a different set of Euler angles. Now I’ll convert this rotation matrix back to Euler angles. And we’ll see that the Euler angles that we end up with are not the Euler angles that we started with. So this is another important consideration when we look at representing orientation in terms of these three-angle sequences: that they are not unique, but they are two different sets of Euler angles which result in exactly the same rotation matrix. And just to verify that that is the case, I’m going to convert this different set of Euler angles to a rotation matrix. I’m going to parse that answer in and we can see the resulting rotation matrix. And we can see that it is exactly the same as this one here. So there are two sets of Euler angles which result in exactly the same orientation in space, the same rotation matrix.

The other group of rotation sequences are commonly called Cardan angles. These are named after a very famous, or infamous, Italian character who was a doctor, an astrologer and a gambler and spent some time in jail for heresy. But a very, very inventive person, he invented the combination lock and he invented the universal joint, the thing that transmits torque from an engine in the front of the car to the wheels at the back of the car. He also published widely on probability and was one of the first people to solve cubic and quartic polynomial equations. So a very, very bright person. The Cardan angles involve rotations around different axes. So no letter is repeated in the rotation sequence. The two of them are often referred to as roll, pitch and yaw angles. That’s the sequence XYZ or the sequence ZYX. And which particular one is used as roll, pitch, yaw angles depends a bit on the context of the problem.

Roll, pitch, yaw angles are a really common convention for orientation of bodies in three-dimensional space. We have the x-axis pointing forward and so the roll angle is rotation around the x-axis. So that’s the first rotation that we do. Now we perform a rotation around the y-axis and that’s referred to as pitch. So that’s this sort of motion. And then after that rotation, we do a rotation around the z-axis and we refer to that as yaw motion. So roll, pitch, yaw description of attitude is a rotation around the x-axis, then around the y-axis, and then around the z-axis.

A way to demonstrate this principle of three consecutive rotations is with this mechanism, a thing called a Gimbal mechanism. So, there are two coordinate frames here. We have the world reference coordinate frame here, the big red frame. And, we have a smaller coordinate frame in the middle here. Now, we can make a rotation around the x-axis, which is a motion like this. We can rotate around the y-axis, which is a rotation like this. And, we can rotate around the z-axis. So, I can put this inner coordinate frame at any orientation that I like and the gimbals will find the appropriate angles to allow that to happen. So this demonstrates very clearly shows that any orientation of this inner frame can be achieved by arbitrary choice of three rotation angles around the x, y, and z-axis.

Let’s have a look at some roll, pitch, yaw angles in practice. This is a schematic diagram of NASA’s lunar module from the late ’60s and early ’70s. We can see the coordinate frames indicated on here. We can see that they define roll as rotation around the z-axis which is toward the front of the vehicle and they have defined yaw as being around the x-axis which is the vertical axis for this particular vehicle.

The MATLAB functions for roll, pitch, yaw angles are very similar to those for Euler angles. We used the function rpy2r and we parse in the roll, pitch, yaw angles. I’ve just made up some simple numbers here. The roll angle is 0.1 radians. The pitch angle is 0.2 radians. And the yaw angle is 0.3 radians. And this is the resulting orthogonal rotation matrix. Once again, there is an inverse function. So tr2rpy, and I pass in the rotation matrix and the result are roll, pitch, yaw angles, the same as those that I started with.

#### Code

There is no code in this lesson.

The orientation of a body in 3D can be described by three angles, examples of which are Euler angles and roll-pitch-yaw angles.

Note that in the MATLAB example at 8:24 note that recent versions of the Robotics Toolbox (9.11, 10.x) give a different result:

>> rpy2r(0.1,0.2,0.3)ans =  0.9363 -0.2751 0.2184  0.2896 0.9564 -0.0370 -0.1987 0.0978 0.9752

To replicate the result from the video using 10.x you must use the ‘xyz’ option like

>> rpy2r(0.1, 0.2, 0.3, 'xyz') ### Professor Peter Corke

Professor of Robotic Vision at QUT and Director of the Australian Centre for Robotic Vision (ACRV). Peter is also a Fellow of the IEEE, a senior Fellow of the Higher Education Academy, and on the editorial board of several robotics research journals.

### Skill level

This content assumes high school level mathematics and requires an understanding of undergraduate-level mathematics; for example, linear algebra - matrices, vectors, complex numbers, vector calculus and MATLAB programming.

Average

## Discussion

1. Shounak says:

The helper in Matlab says that the default input for ” eul2r ” should be radians, but in my case, Matlab takes the default input in degrees. So ” eul2r(0.1*180/pi , 0.2*180/pi , 0.3*180/pi) ” gives the same output as that in the video.

1. Mohamed Salah Moghazy says:

yeah you are right i have the same problem right here

2. PC-Ole says:

I followed your example with version 10.3 (released 19 August 2018). The rpy2r function gives me the wrong rotation matrix, but gives back the same angles when i take the inverse.

>> rpy2r(0.1, 0.2, 0.3)

ans =

0.9363 -0.2751 0.2184
0.2896 0.9564 -0.0370
-0.1987 0.0978 0.9752

>> tr2rpy(ans)

ans =

0.1000 0.2000 0.3000

If i do the rotations manually, i get the same rotation matrix as you, but when i take the inverse i get the wrong angles.

>> rpy = rotx(0.1) * roty(0.2) * rotz(0.3)

rpy =

0.9363 -0.2896 0.1987
0.3130 0.9447 -0.0978
-0.1593 0.1538 0.9752

>> tr2rpy(rpy)

ans =

0.1564 0.1600 0.3226

1. Peter Corke says:

The academy lessons were all done with RTB 9.x.There are two significant changes between 9.x and 10.x:

* the default angle order is XYZ in 9.x and ZYX in 10.x. This is the reason for the first discrepancy you have.
* in 9.x the angles were given in the order yaw, pitch, roll (but the documentation said roll, pitch, yaw) whereas for 10.x the angles are given in the order roll, pitch, yaw.

>> rpy = rotx(0.1) * roty(0.2) * rotz(0.3)

is equivalent, in RTB 10.x, to

>> rpy = rpy2r(0.3, 0.2, 0.1, ‘xyz’)
rpy =
0.9363 -0.2896 0.1987
0.3130 0.9447 -0.0978
-0.1593 0.1538 0.9752
>> tr2rpy(rpy, ‘xyz’)
ans =
0.3000 0.2000 0.1000

3. oezeadi says:

Where can I find that gimbal mechanism for purchase?

1. Peter Corke says:

We built it at the university, laser cut from wood (MDF) and some spray paint. Would the CAD files be useful to you?

4. oezeadi says:

And/or where can I find those metal-looking large coordinate frames you use in the videos?

1. Peter Corke says:

They are also laser cut wood (MDF) with some spray paint. Again, I could upload the CAD files if that was useful. The three pieces just click together.

5. Mike_eng says:

Just want to say thanks for your videos. Great quality and delivery.

6. ItachiVN says:

Superb lecture, thanks Prof. Peter Corke

7. Mohammad says:

I just absolutely love how a brief biography of each scientist is represented below his picture.
Didn’t know Euler was blind during the last 17 years of his carrier.
Really enjoying these lecture videos.

8. ammar karkour says:

Thanks for the amazing lecture and for the effort. I have a question about question number 10:

why the first two answers are ( Incorrectroll angle is rotation about the y-axis, Incorrectpitch angle is such that the nose of the plane moves left and right) I chose the opposite answers for these two and I searched for an explanation but I couldn’t find it.

1. Peter Corke says:

This is simply a matter of definition: roll is rotation about the forward pointing axis, and pitch is about a transverse axis. I describe this from 6:099 in the video.

9. SirClems says:

Peter Corke, you are simply amazing.
I usually end up frustrated when i want to apply want i learnt from text books in Matlab because of the variations in results and no one to ask about it.

THANKS A LOT!!!

10. Ghofran AL-NABELSI says:

Summary:
12 valid rotations around X, Y, Z axis.
a/ 6 of them are Euler angles: a particular axis will appear twice, but not twice consecutively
>>>> ZYZ Euler angles >>> eul2r(Zangle,Yangle,Zangle) == rotz(angle)*roty(angle)*rotz(angle) opposite to : tr2eul(rotation_matrix).
#important consideration when we look at representing orientation in terms of three-angle sequences: that they are not unique, but they are two different sets of Euler angles which result in exactly the same rotation matrix
>>> there are two different sets of Euler angles which result in exactly the same orientation in space, the same rotation matrix.
b/ The other 6 are Cardan angles: rotations around different axes. So no letter is repeated in the rotation sequence.
>>> two of them are often referred to as roll, pitch and yaw angles. That’s the sequence XYZ or the sequence ZYX.
>>> ZYX Cardan angles >>> rpy2r(Zangle,Yangle,Xangle) == rotz(angle)*roty(angle)*rotx(angle) opposite to : tr2rpy(rotation_matrix).

1. Ghofran AL-NABELSI says:

CORRECTION:
THESE TWO LINES ARE NOT NECESSARILY true and I hope Dr. Corke would explain why :

1. rpy2r(Zangle,Yangle,Xangle) == rotz(angle)*roty(angle)*rotx(angle) >>> there is a slight difference between the output matrices.
2. rpy2r(Xangle,Yangle,Zangle,’xyz’) == rotx(angle)*roty(angle)*rotz(angle) opposite to tr2rpy(rotation_matrix,’xyz’) >>> there is a slight difference between the output matrices.

Example (1):
A= rpy2r(0.1,0.2,0.3)

A =

0.9363 -0.2751 0.2184
0.2896 0.9564 -0.0370
-0.1987 0.0978 0.9752

>> AA=tr2rpy(A)

AA =

0.1000 0.2000 0.3000

>> B= rotz(0.1)*roty(0.2)*rotx(0.3)

B =

0.9752 -0.0370 0.2184
0.0978 0.9564 -0.2751
-0.1987 0.2896 0.9363

>> BB= tr2rpy(B)

BB =

0.3000 0.2000 0.1000
>>>>>> A not equal to B >>> AA is different from BB >>> WHY?

Example (2):
>> C= rpy2r(0.1,0.2,0.3,’xyz’)

C =

0.9752 -0.0978 0.1987
0.1538 0.9447 -0.2896
-0.1593 0.3130 0.9363

>> CC= tr2rpy(C,’xyz’)

CC =

0.1000 0.2000 0.3000

>> D= rotx(0.1)*roty(0.2)*rotz(0.3)

D =

0.9363 -0.2896 0.1987
0.3130 0.9447 -0.0978
-0.1593 0.1538 0.9752

>> DD= tr2rpy(D,’xyz’)

DD =

0.3000 0.2000 0.1000
>>>> C not equal to D >>> CC is different from DD >>> WHY?

1. Peter Corke says:

Example 1. rpy2tr() and tr2rp()y are using the default ZYX angle order, so I guess you are using RTB10. B is constructed using ZYX angle order, but the RPY angles have been reversed. Yaw appears in the first transform, roll in the last one.

Example 2. Same as above, for D you have reversed the RPY angles, ie. YPR angles.

2. Peter Corke says:

I beg to differ about b/ All of them can be considered as RPY angle, it just depends on how you attach the coordinate frame to the 3D body (vehicle or robot gripper). For example X forward, Z up; X forward, Y up; Y forward, Z up; Y forward, X up; Z forward, X up; Z forward, Y up. The two you point out are most common, but for cameras the sequence ZYX makes sense (Z forward, Y down, X to the right).

11. Daniel Onofre says:

Hello teacher I have a question, when do you prefer to use euler angles instead of roll-pitch-yaw angles? Thank you very much teacher for teaching.

1. Peter Corke says:

It’s a personal thing but I never use Euler angles, they are not intuitive to me.

12. Amer says:

I took this lesson from the book, watched this video, and other videos and unfortunately Gimble Lock is still mysterious to me.