Rodrigues’ Rotation
Understanding the rotation of a 3D vector.
A vector \(\vec{v}\) can be decomposed into parallel and perpendicular components.
In 3D, the parallel component (\(v_{\parallel}\)) is the vector that is projected onto the direction vector. The perpendicular component (\(v_{\perp}\)) is what’s left over, and it lies in the plane orthogonal to the axis of rotation. To generalize 2D or 3D:
\[{v} = {v}_{\parallel} + {v}_{\perp}\]The vector form:
\[\vec{v} = \vec{v}_{\parallel} + \vec{v}_{\perp}\]The parallel component will be on the axis of rotation, hence there is no change to this vector during rotation.
The Intuition (The Water Gun)
To build an intuition, let’s use a simple analogy: an L-shaped water gun.
Imagine holding the water gun by its handle and pointing it forward. If you rotate your wrist, what happens?
-
The Handle (Parallel Component): The handle represents the axis of rotation (\(\vec{\omega}\)). As you rotate it, the handle itself just spins in place. Its direction doesn’t change. This is analogous to the parallel component (\(\vec{v}_{\parallel}\)) of our vector, which is unaffected by the rotation.
-
The Barrel (Perpendicular Component): The barrel of the gun, which sticks out from the handle, sweeps through space. This represents the perpendicular component (\(\vec{v}_{\perp}\)), which is the part that actually changes its orientation.
If you look straight down the axis of rotation (the handle), you’ll see the tip of the barrel traces a perfect circle. This observation is key: it reduces the complex 3D rotation into a simple 2D planar rotation of just the perpendicular component.
This analogy shows that to understand the rotation of any vector \(\vec{v}\), we only need to analyze how its perpendicular component, \(\vec{v}_{\perp}\), rotates in its plane.
Decomposing the Vector
Now, the projection of vectors. In general, to find a parallel component, we use the dot product.
We have a direction vector \(\vec{\omega}_{\text{direction}} = [\omega_x, \omega_y, \omega_z]\). We normalize it to get a unit vector:
\[\vec{\omega} = \frac{\vec{\omega}_{\text{direction}}}{|\vec{\omega}_{\text{direction}}|}\]To find the parallel component, we perform a dot product (projection):
\[\vec{v}_{\parallel} = (\vec{v} \cdot \vec{\omega}) \vec{\omega}\]The leftover perpendicular part is just a subtraction:
\[\vec{v}_{\perp} = \vec{v} - \vec{v}_{\parallel}\]Now that we can decompose our vector, we can manipulate it.
Deriving the Rotated Vector
The rotated vector, \(\vec{v'}\), should have the same properties:
\[\vec{v'} = \vec{v'}_{\parallel} + \vec{v'}_{\perp}\]To recap from our premise: \(\vec{v'}_{\parallel}\) is along the axis of rotation, so this component will not change.
\[\vec{v'}_{\parallel} = \vec{v}_{\parallel}\]So the rotation problem simplifies to:
\[\vec{v'} = \vec{v}_{\parallel} + \vec{v'}_{\perp}\]The perpendicular component vector is orthogonal to the axis of rotation. This problem is a simple planar rotation. We know that we have cosine and sine components.
\[\vec{v'}_{\perp} = \vec{v}_{\perp} \cos(\theta) +( \vec{\omega} \times \vec{v}_{\perp}) \sin(\theta)\]This is the vector equivalent of a 2D rotation. The vector \(\vec{v}_{\perp}\) and the vector \(\vec{\omega} \times \vec{v}_{\perp}\) form an orthogonal basis in the plane of rotation. The \(\cos(\theta)\) and \(\sin(\theta)\) terms are the familiar components that scale these basis vectors to produce the rotated vector.
Bringing Pieces Together
\[\vec{v'} = \vec{v}_{\parallel} + \vec{v}_{\perp} \cos(\theta) + ( \vec{\omega} \times \vec{v}_{\perp}) \sin(\theta)\]We just need to substitute \(\vec{v}_{\perp} = \vec{v} - \vec{v}_{\parallel}\):
\[\begin{align} \vec{v'} &= \vec{v}_{\parallel} + (\vec{v} - \vec{v}_{\parallel}) \cos(\theta) + (\vec{\omega} \times (\vec{v} - \vec{v}_{\parallel})) \sin(\theta) \\ &= \vec{v}_{\parallel} + (\vec{v} - \vec{v}_{\parallel}) \cos(\theta) + (\vec{\omega} \times \vec{v})\sin(\theta) - \cancel{(\vec{\omega} \times \vec{v}_{\parallel}) \sin(\theta)} \\ &= \vec{v}_{\parallel} (1- \cos(\theta)) + \vec{v}\cos(\theta) + (\vec{\omega} \times \vec{v})\sin(\theta) \end{align}\](Known fact: The parallel component \(\vec{v}_{\parallel}\) is along the axis of rotation \(\vec{\omega}\). The angle between them is 0, so \(\sin(0) = 0\). Therefore, their cross product \(\vec{\omega} \times \vec{v}_{\parallel} = \vec{0}\) because its magnitude is\(\|\vec{\omega} \times \vec{v}_{\parallel}\| = \|\vec{\omega}\| \|\vec{v}_{\parallel}\| \sin(0) = 0\).)
By substituting \(\vec{v}_{\parallel} = (\vec{v} \cdot \vec{\omega}) \vec{\omega}\), we get the full (vector/axis–angle form):
\[\vec{v'} = ((\vec{v} \cdot \vec{\omega}) \vec{\omega})(1- \cos(\theta)) + \vec{v}\cos(\theta) + (\vec{\omega} \times \vec{v})\sin(\theta)\]Matrix Operator Representation
Our goal here is to represent our vector/axis–angle form to a matrix operation form, such that we have the shape \(\mathbf{R}\vec{v}\)
Refresher on Matrix Multiplication Rules
We have another way of representing this. Let’s interpret each of the three sub-items as a matrix operator acting on \(\vec{v}\).
Term 1: \(((\vec{v} \cdot \vec{\omega}) \vec{\omega})(1- \cos(\theta))\)
To get a \(3 \times 3\) matrix shape, we can use the outer product \(\vec{\omega}\vec{\omega}^T\).
\[\rightarrow (1- \cos(\theta) )(\vec{\omega}\vec{\omega}^T)\vec{v}\]Term 2: \(\vec{v}\cos(\theta)\)
This is a vector scaled by a scalar. To put it in operator form, we can use the Identity matrix \(I\) as a “wildcard”.
\[\rightarrow (I \cos(\theta))\vec{v}\]Term 3: \((\vec{\omega} \times \vec{v})\sin(\theta)\)
The cross product \(\vec{\omega} \times \vec{v}\) can be replaced by the skew-symmetric matrix \([\vec{\omega}]\).
\[\vec{\omega} \times \vec{v} = [\vec{\omega}] \vec{v}\]So, the full term is:
\[([\vec{\omega}]\vec{v}) \sin(\theta)\]Since \(\sin(\theta)\) is a scalar, we can move it:
\[\rightarrow ([\vec{\omega}]\sin(\theta)) \vec{v}\]Final Assembly:
Now, we add all the operators together, we have the shape \(R\vec{v}\).:
\[\vec{v'} = \left[ (1- \cos(\theta) )(\vec{\omega}\vec{\omega}^T) + \cos(\theta)I + ([\vec{\omega}]\sin(\theta)) \right] \vec{v}\]where:
\[R = (1- \cos(\theta) )(\vec{\omega}\vec{\omega}^T) + \cos(\theta)I + \sin(\theta)[\vec{\omega}]\]Proving the Rodrigues’ Matrix Identity
We have two main ways to find the perpendicular component (\(\vec{v}_{\perp}\)) of a vector \(\vec{v}\) relative to a unit axis \(\vec{\omega}\). By proving these two methods are identical, we can derive a very useful matrix identity.
Method 1: The Geometric (“First Principles”) Definition
We know that any vector \(\vec{v}\) can be decomposed into its parallel and perpendicular parts:
\[\vec{v} = \vec{v}_{\parallel} + \vec{v}_{\perp}\]By rearranging, we can define the perpendicular component as the original vector minus its parallel projection:
\[\vec{v}_{\perp} = \vec{v} - \vec{v}_{\parallel}\]And since the parallel projection is \(\vec{v}_{\parallel} = (\vec{v} \cdot \vec{\omega}) \vec{\omega}\), our full geometric definition is:
\[\vec{v}_{\perp} = \vec{v} - ((\vec{v} \cdot \vec{\omega}) \vec{\omega})\]Method 2: The Algebraic (“Vector Triple Product”) Identity
Leveraging the Vector Triple Product, we can find an alternative expression for the perpendicular component that naturally leads to a matrix multiplication form.
By applying the vector triple product identity to the expression \(\vec{\omega} \times (\vec{\omega} \times \vec{v})\), we get:
\[\begin{align} \vec{\omega} \times (\vec{\omega} \times \vec{v}) &= \vec{\omega}(\vec{\omega} \cdot \vec{v}) - \vec{v}(\vec{\omega} \cdot \vec{\omega}) \end{align}\]Analyzing the Terms
Now let’s look at the two terms on the right side.
-
First Term: \(\vec{\omega}(\vec{\omega} \cdot \vec{v})\) Since the dot product is commutative (\(\vec{\omega} \cdot \vec{v} = \vec{v} \cdot \vec{\omega}\)), this is the same as \((\vec{v} \cdot \vec{\omega})\vec{\omega}\). This is exactly our definition of the parallel component, \(\vec{v}_{\parallel}\).
-
Second Term: \(\vec{v}(\vec{\omega} \cdot \vec{\omega})\) We established that \(\vec{\omega}\) is a unit vector, so its magnitude is 1. The dot product of a vector with itself is its magnitude squared: \(\vec{\omega} \cdot \vec{\omega} = \|\vec{\omega}\|^2 = 1^2 = 1\) This term simplifies to \(\vec{v}(1)\), which is just \(\vec{v}\).
Conclusion
By substituting these back, we find the result of the algebraic formula:
\[\vec{\omega} \times (\vec{\omega} \times \vec{v}) = \vec{v}_{\parallel} - \vec{v}\]Now, let’s compare this to our geometric definition of the perpendicular component:
\[\vec{v}_{\perp} = \vec{v} - \vec{v}_{\parallel}\]By factoring out a -1, we can see the double cross product is the negative of the previously established perpendicular component:
\[\vec{\omega} \times (\vec{\omega} \times \vec{v}) = \vec{v}_{\parallel} - \vec{v} = -(\vec{v} - \vec{v}_{\parallel}) = -\vec{v}_{\perp}\]The Final Matrix Identity
Now we can express both definitions of \(\vec{v}_{\perp}\) in their matrix operator forms to derive the identity.
1. Geometric Method (Matrix Form):
We start with our geometric definition:
\[\vec{v}_{\perp} = \vec{v} - \vec{v}_{\parallel}\]We can rewrite this using matrix operators:
\[\vec{v}_{\perp} = \mathbf{I}\vec{v} - (\vec{\omega}\vec{\omega}^T)\vec{v}\]Factoring out \(\vec{v}\), we get:
\[\vec{v}_{\perp} = (\mathbf{I} - \vec{\omega}\vec{\omega}^T)\vec{v}\]2. Algebraic Method (Matrix Form):
We start with our algebraic identity:
\[\vec{v}_{\perp} = -(\vec{\omega} \times (\vec{\omega} \times \vec{v}))\]We replace the cross products with their skew-symmetric matrix counterparts:
\[\vec{v}_{\perp} = -[\vec{\omega}]([\vec{\omega}]\vec{v})\]Grouping the matrices, we get:
\[\vec{v}_{\perp} = -([\vec{\omega}][\vec{\omega}])\vec{v}\] \[\vec{v}_{\perp} = -[\vec{\omega}]^2 \vec{v}\]3. The Identity: Since both matrix operators produce the exact same vector \(\vec{v}_{\perp}\), the operators themselves must be equal.
\[(\mathbf{I} - \vec{\omega}\vec{\omega}^T)\cancel{\vec{v}} = -[\vec{\omega}]^2 \cancel{\vec{v}}\] \[\mathbf{I} - \vec{\omega}\vec{\omega}^T = -[\vec{\omega}]^2\] \[\vec{\omega}\vec{\omega}^T = \mathbf{I} + [\vec{\omega}]^2\]This identity is fundamental for simplifying the Rodrigues’ formula and proves that the different matrix forms are equivalent.
The Rodrigues rotation representations are as follows:
-
Matrix operator form:
-
Geometric Form (using the Outer Product):
\[R = (1- \cos(\theta) )(\vec{\omega}\vec{\omega}^T) + \cos(\theta)I + \sin(\theta)[\vec{\omega}]\] -
Using the Skew-Symmetric Identity: (by substituting \(\vec{\omega}\vec{\omega}^T = \mathbf{I} + [\vec{\omega}]^2\)):
\[R = \mathbf{I} + \sin(\theta)[\vec{\omega}] + (1- \cos(\theta) )[\vec{\omega}]^2\]
-