# The Problem

In Part 1 of this series, in which I attempt to explain the Denavit-Hartenberg convention for inverse kinematics I talked about coordinate frames and rotational transformations using matrices. This left open a pretty obvious question, though: turning coordinate frames is great and all, but how do we move them? If we want to describe the transformation from Frame 1 to Frame 0 here:

Then we need to express the rotation by the angle $$\theta$$ (which we figured out last time) and the translation by the distance $$d$$ (which we don’t know how to do yet).

To make this a little more clear, let’s look at an example of a translation by a vector $$\vec{t}$$: \begin{align} \vec{v}' &= \vec{v} + \vec{t} \\ \begin{bmatrix} v_1' \\ v_2' \\ v_3' \end{bmatrix} &= \begin{bmatrix} v_1 \\ v_2 \\ v_3 \end{bmatrix} + \begin{bmatrix} t_1 \\ t_2 \\ t_3 \end{bmatrix} \end{align}

Given how we handled rotation matrices last time, we’d really like to find a matrix such that we can write down that translation as a matrix multiplication: $\vec{v}' = \left[ T \right] \, \vec{v}$ For some magical unknown matrix $$\left[ T \right]$$. But…we can’t. You can try. In fact, go for it! It’s a useful exercise, but it’s going to be futile, and we can show that pretty easily. As an example, let’s see what happens if we set $$\vec{v}$$ to be all zeros: $\vec{v}' = \left[ T \right] \, \begin{bmatrix} 0 \\ 0 \\ 0 \end{bmatrix}$ No matter what we set $$\left[ T \right]$$ to be, $$\vec{v}'$$ will always just be zeros. So clearly this method won’t work.

# The Solution: Homogeneous Coordinates

It turns out that there’s a pretty simple fix for this, and it involves adding an extra term to each of our vectors. If we add a 1 to the end of each of our vectors $$\vec{v}$$, then they end up looking like this: $\vec{v} = \begin{bmatrix} v_1 \\ v_2 \\ v_3 \\ 1 \end{bmatrix}$ As it happens, we can now write out our translation matrix $$\left[ T \right]$$ using this coordinate system: \begin{align} \vec{v}' &= \vec{v} + \vec{t} \\ \begin{bmatrix} v_1' \\ v_2' \\ v_3' \\ 1 \end{bmatrix} &= \begin{bmatrix} 1 & 0 & 0 & t_1 \\ 0 & 1 & 0 & t_2 \\ 0 & 0 & 1 & t_3 \\ 0 & 0 & 0 & 1 \end{bmatrix}\, \begin{bmatrix} v_1 \\ v_2 \\ v_3 \\ 1 \end{bmatrix} \end{align} If we write out the matrix multiplication, then we get the following equations: \begin{align} v_1' &= v_1 + t_1 \\ v_2' &= v_2 + t_2 \\ v_3' &= v_3 + t_3 \end{align} which is exactly what we wanted! Rotations also work just fine in this coordinate system: $\vec{v}' = \begin{bmatrix} \cos{\theta_{1 1}} & \cos{\theta_{1 2}} & \cos{\theta_{1 3}} & 0 \\ \cos{\theta_{2 1}} & \cos{\theta_{2 2}} & \cos{\theta_{2 3}} & 0 \\ \cos{\theta_{3 1}} & \cos{\theta_{3 2}} & \cos{\theta_{3 3}} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \, \begin{bmatrix} v_1 \\ v_2 \\ v_3 \\ 1 \end{bmatrix}$ The real kicker is that we can now combine translation and rotation just by multiplying our matrices together. For example, performing a rotation and then a translation might look like this: $\vec{v}' = \begin{bmatrix} 1 & 0 & 0 & t_1 \\ 0 & 1 & 0 & t_2 \\ 0 & 0 & 1 & t_3 \\ 0 & 0 & 0 & 1 \end{bmatrix} \, \begin{bmatrix} \cos{\theta_{1 1}} & \cos{\theta_{1 2}} & \cos{\theta_{1 3}} & 0 \\ \cos{\theta_{2 1}} & \cos{\theta_{2 2}} & \cos{\theta_{2 3}} & 0 \\ \cos{\theta_{3 1}} & \cos{\theta_{3 2}} & \cos{\theta_{3 3}} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \, \begin{bmatrix} v_1 \\ v_2 \\ v_3 \\ 1 \end{bmatrix}$ We can use the associative property of matrix multiplication to simplify this: \begin{align} \vec{v}' &= \left( \begin{bmatrix} 1 & 0 & 0 & t_1 \\ 0 & 1 & 0 & t_2 \\ 0 & 0 & 1 & t_3 \\ 0 & 0 & 0 & 1 \end{bmatrix} \, \begin{bmatrix} \cos{\theta_{1 1}} & \cos{\theta_{1 2}} & \cos{\theta_{1 3}} & 0 \\ \cos{\theta_{2 1}} & \cos{\theta_{2 2}} & \cos{\theta_{2 3}} & 0 \\ \cos{\theta_{3 1}} & \cos{\theta_{3 2}} & \cos{\theta_{3 3}} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \right) \, \begin{bmatrix} v_1 \\ v_2 \\ v_3 \\ 1 \end{bmatrix} \\ &= \begin{bmatrix} \cos{\theta_{1 1}} & \cos{\theta_{1 2}} & \cos{\theta_{1 3}} & t_1 \\ \cos{\theta_{2 1}} & \cos{\theta_{2 2}} & \cos{\theta_{2 3}} & t_2 \\ \cos{\theta_{3 1}} & \cos{\theta_{3 2}} & \cos{\theta_{3 3}} & t_3 \\ 0 & 0 & 0 & 1 \end{bmatrix} \, \begin{bmatrix} v_1 \\ v_2 \\ v_3 \\ 1 \end{bmatrix} \end{align} Notice how the rotation and translation components of this resulting transformation stay in their own sections of the matrix. We’ll use that nice property to devise a shorthand for this kind of transformation matrix. Let: $\textbf{H} \equiv \begin{bmatrix} R & T \\ 0 & 1 \end{bmatrix} \equiv \begin{bmatrix} \cos{\theta_{1 1}} & \cos{\theta_{1 2}} & \cos{\theta_{1 3}} & t_1 \\ \cos{\theta_{2 1}} & \cos{\theta_{2 2}} & \cos{\theta_{2 3}} & t_2 \\ \cos{\theta_{3 1}} & \cos{\theta_{3 2}} & \cos{\theta_{3 3}} & t_3 \\ 0 & 0 & 0 & 1 \end{bmatrix}$ Where R represents the rotation component and T represents the translation component.

# Next time: putting it all together

In the next installment, we’ll use all of this coordinate transformation business to build a system that will let us figure out how to control our robot’s arm.

09 June 2012