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.
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.