I'm having a bit of trouble understanding how axis-angle rotation vectors are used when rotating a vector in 3D space. Why are these used and how do these relate to rotation matrices?
I also found a function called vrrotvec2mat
that seems to do what I want but I can't understand the documentation. Specifically, can someone give a more clear explanation (with some example) of the input arguments r
and options
?
MathWorks explanations are very limited, as follows:
Convert rotation from axis-angle to matrix representation
m = vrrotvec2mat(r)
returns a matrix representation of the rotation defined by the axis-angle rotation vector,r
.
m = vrrotvec2mat(r,options)
returns a matrix representation of rotation defined by the axis-angle rotation vector r, with the default algorithm parameters replaced by values defined in options.The options structure contains the parameter epsilon that represents the value below which a number will be treated as zero (default value is
1e-12
).The rotation vector,
r
, is a row vector of four elements, where the first three elements specify the rotation axis, and the last element defines the angle.To rotate a column vector of three elements, multiply it by the rotation matrix. >To rotate a row vector of three elements, multiply it by the transposed rotation matrix.
If you want to understand the
vrrotvec2mat
function, you need to know how axis-angle representations of rotations work before we delve into this function. Specifically, you're looking at understanding the Rodrigues Rotation formula, which is also known as the axis-angle rotation formula. I'll explain this to you with some introduction first.In Linear Algebra, the most standard way to rotate a point, whether it's 2D or 3D is to use a rotation matrix where you pre-multiply (i.e.
y = A*x
wherex
is your point represented in a column vector) the 2D or 3D coordinate with this rotation matrix. This rotates the point around the origin of the coordinate system. You can also think of this as rotating a vectorv
where the tail is at the origin and the head is at the point in 2D or 3D space.However, another way to do this is to provide what is known as the axis-angle representation which is only valid in 3D space. The axis is described by a unit vector
k
that describes an axis of rotation about which the vectorv
rotates by an angle around this axis by the right-hand rule.Here's a pictorial example I got from Wikipedia:
Source: Rodrigues' Rotation formula
The vector
k
in our case is pointing straight up and the vectorv
is pointing on a 45 degree angle northwest. We wish to rotate this vector by an angle of 180 degrees around the axis defined by the vectork
, and so if you do this,vrot
is the resulting vector.v||
andv_|_
are the parallel and perpendicular projections ofv
with respect to the vectork
. These are shown to derive the Rodrigues formula, which I won't go through here. I'll refer you to the article if you want a full derivation.The reason why the Rodrigues rotation formula was proposed to rotate things is because very frequently, there are applications where you are rotating about an axis that is not centred at the origin, nor are you rotating with respect to a standard
x
,y
andz
axis.In fact, if you look at the Wikipedia article, you don't need to convert to the matrix form to rotate things. You can use the unit vector and rotation angle directly to rotate your vector, which leads us to his rotation formula:
Source: Rodrigues' Rotation formula
The reason why
vrrotvec2mat
exists is because you can convert between the axis-angle representation of rotating a vector and a rotation matrix with a rotation with respect to the origin in Linear Algebra. You can then apply the same Linear Algebra theory to rotate a vector/point in 3D space given this rotation matrix. You can convert back and forth between a normal rotation matrix and the Rodrigues formula representation by usingvrrotvec2mat
andvrrotmat2vec
respectively.The axis-angle representation is essentially a 4 element vector where the first three elements are the
x
,y
andz
components of the unit vectork
that defines your rotation axis and the last element is the rotation angletheta
that rotates your vector with respect to this axis.vrrotvec2mat
is no different here and requires a 4 element vector in the order that I just talked about. However, having a quick look at the source,theta
is defined in radians.If you want a concrete example of seeing this work, let's use the above diagram as an example. The unit vector
k
is pointing upwards on thez
axis, and so the first three components are(0,0,1)
. We wish to rotate by 180 degrees, and so the fourth argument ispi
... and so:This exactly defines a rotation of 180 degrees around the
z
-axis if you take a look at the standard rotation matrix in Cartesian space around thez
axis. If you recall the rotation matrix for this, it's:If you substitute
theta = pi
in the above matrix, you will get the same thing asM
as seen in thevrrot2vec2mat
function. However, ignore the sign of the first row, second column as it's due to numerical precision... which leads us to the second parameteroptions
. Basically, when computing the rotation matrix values using the Rodrigues Rotation formula, there will be times where values in the matrix will be quite small. Theoptions
structure has a field calledepsilon
, where you can specify anything smaller than this threshold is considered zero after the matrix has been calculated. The default of1e-12
is quite suitable IMHO.If you'd like to change the default
epsilon
, simply create a structure that has a single elementepsilon
that changes this threshold and call the function with this additional second argument... so something like:In any case, going back to what we were talking about, let's say our given vector
v
is with respect to the above figure and that it's pointing northwest - specifically at(x,y,z) = (1,0,1)
. If we use this rotation matrix and rotate this point, we should get it to be parallel to thexz
plane and pointing in the opposite direction, and so we should get(x,y,z) = (-1,0,1)
:You can also get the same result by using the Rodrigues Rotation formula:
All in all, it's just another way of rotating a vector around an arbitrary axis, not just limited to the standard
x
,y
orz
.