Quaternions representation of rotation in 3D


In high school or Engineering Maths, you’ve probably come across the concept of a complex number. A number has got two components, a real component and an imaginary component. The imaginary component is a real scalar B multiplied by the imaginary number i, i being the square root of -1. We can extend this concept to what’s called a hypercomplex number. Now, instead of having just one imaginary number i, we have imaginary numbers i, j, and k. They are each the square root of -1 and their product is equal to -1. So, the hypercomplex number has got one real part and three imaginary parts. Hypercomplex numbers are typically written as a scalar plus a vector, s plus v.

The concept of hypercomplex numbers can be traced back to the Irish mathematician, William Hamilton. The story goes that one day, he was walking along the Canal in Dublin and the key equation, i2 = j2 = k2 = ijk = -1 came in to his brain. And, he carved the equation in to a stone on the wall of the bridge. And, there is today a plaque on this particular bridge which commemorates this flash of genius and inspiration.

The hypercomplex number is the basis of a mathematical object that we call a quaternion. I denote a quaternion as a Q with a little circle above it. So, we write it at s + v. S is a real scalar and v is a vector representing the complex part of this number.

Quaternions are often written in this form as well where we have s and then inside angle brackets, we have the three elements of the vector part, the three imaginary parts of the quaternion. There are quite a few different ways of writing quaternions. This is the way that I will use in this lecture and also the way that the robotics Toolbox represents a quaternion in MATLAB. Just as we can determine the magnitude or length of a vector, we can determine the magnitude or length of a quaternion and it’s the square root of the sum of the four numeric elements of the quaternion, it’s real part and the three imaginary parts.

Now, we get to what’s called a unit quaternion and this is a quaternion whose magnitude is equal to 1. Unit quaternions are particularly useful because we can use them to encode rotation in three dimensional space. A unit quaternion has a lot of similarities to the angle and axis representation that we discussed in the last section. The real part of the unit quaternion is equal to the cosine of half the rotation angle and the rotation axis which I have denoted here by n-hat is related to the vector part of the quaternion by this relationship which involve sine of half the rotation angle. I can compound two unit quaternions. Just as we can compound two rotation matrices, I can compound two quaternions and it’s done by using this, what’s called the Hamiltonian product rule.

So, quaternion 1 rotates me from frame A to frame B. Quaternion 2 rotates me from frame B to frame C, then, the product is the rotation from frame A to frame C. And, I can compute the inverse of a quaternion. So if I use a quaternion to rotate me from frame A to frame B, the inverse is quite simple. It’s just the negation of the vector part of the quaternion.

Once again, I’m going to create a fairly arbitrary rotation matrix. Going to start with some Euler angles, convert them to rotation matrix 0.1, 0.2, 0.3, just for the purpose of illustration. Here we have a rotation matrix.

Now, I’m going to create a quaternion and I use the quaternion class and I parse in as an argument a rotation matrix. And, the result is a quaternion object which we can see in our workspace. Now, the quaternion has got a real part and an imaginary part, which is indicated inside the angle brackets. I’m going to park the quaternion into a permanent variable called Q and let’s look at what we can do with this quaternion object in MATLAB.

One of the things that I can do is I can plot this quaternion and look at the orientation and it behaves just like the trplot function that we looked at earlier. I can compute the inverse of the quaternion, and here it is here, and we can see that the real part of the quaternion remains unchanged, but the vector part is negated. If I multiply the quaternion by its inverse, the result is the null quaternion. This has got a vector component equal to 0. So this indicates a 0 rotation. I can also compute that using the division operator in MATLAB. So, if I take a quaternion and effectively divide it by the quaternion, it’s the same as multiplying by its inverse. I once again get the zero rotation.
If I have a quaternion and I multiply it by a vector, let’s say a vector is a unit vector in the x direction and I turn it to a column vector by transposing it, then what this notation in MATLAB does is to multiply the vector by the quaternion. Effectively, it rotates the vector. Finally, I can do an example to illustrate interpolation. If I call quaternion with no arguments, it returns a quaternion corresponding to the null rotation. So, if I use MATLAB syntax like this, I take my null quaternion, interpolate it with the other quaternion I have, Q, and I parse in an argument which tells me the interpolation fraction. So, this is interpolating between the quaternion Q0, the null rotation, and the quaternion Q.

The last argument is the interpolation distance. 0 corresponds to the initial quaternion. 1 corresponds to the final quaternion. If I parse in 0, the result should be our initial quaternion. Make it 1, the result will be our final quaternion. And if I put in something like 0.5, this is an interpolation halfway between the initial quaternion and the final quaternion. So this is a way to interpolate rotations that are represented as quaternions.

The orientation of a body in 3D can also be described by a unit-Quaternion, an unusual but very useful mathematical object.


In the MATLAB example starting at 3:48 I use the Quaternion class.  For Toolbox version 10 (2017) please use UnitQuaternion instead.

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.

More information...

Rate this lesson


Check your understanding


  1. Jerry K says:

    It’s not entirely clear the MATLAB code suggested in the answer to Question 1 works with the current version of the toolbox.

    >> R=rpy2r([20, -10, 30], ‘deg’)

    followed by:

    >> Quaternion(R)

    gives me:

    Error using Quaternion (line 122)
    bad argument to quaternion constructor

    It’s not clear looking at the code and docs that there’s a constructor supporting this usage?

    1. Peter Corke says:

      Use the UnitQuaternion constructor instead, there is a note under the video which says this, I just made it bold to be hopefully more noticeable. The old Quaternion class was a mishmash of regular and unit quaternion functionality, now split into a Quaternion and UnitQuaternion classes. Only UnitQuaternions are useful for representing rotations.

  2. prasadmadhale says:

    For Q1 I used the exact formulas mentioned in the answer but I get option C as the answer. Is there a specific reason? I am using UnitQuaternion constructor as suggest in the note.

    Here’s the output:

    >> R = rpy2r([20,-10,30],’deg’)

    R =

    0.8529 -0.5213 0.0297
    0.4924 0.7841 -0.3778
    0.1736 0.3368 0.9254

    >> q = UnitQuaternion(R)

    q =


    1. kaogula says:

      The video is made by RTB 9.x, whose rpy2r function is in order of yaw, pitch, roll (but the documentation said roll, pitch, yaw) ,in RTB10.X the order is changed along with the documentation, roll, pitch, yaw. so I guess the right answer should be C.

      1. Peter Corke says:

        The angles are always given in the order roll, pitch then yaw. In RTB9 the default angle sequences is yaw about X, pitch about Y then finally roll about Z. In RTB10 that default sequence is different. If you are using RTB10 then you need to add the option ‘xyz’ to make it compatible with RTB9.

    2. Peter Corke says:

      In RTB9 the default angle sequences is yaw about X, pitch about Y then finally roll about Z. In RTB10 that default sequence is different. If you are using RTB10 then you need to add the option ‘xyz’ to make it compatible with RTB9.

Leave a comment