ME3120 · Dynamic Modelling
Theme 4 · Robot geometry

Homogeneous transforms & chaining

Rotation alone is not enough — a link is also shifted from the base. One clever matrix does rotation and shift at once, and chaining them is forward kinematics.

Source: course notes, Week 3 (robot geometry); Spong, Lynch & Park.

Before you start

What you need first

  • The rotation matrix \(R(\theta)\) and how to apply it (Topic 16).
  • Matrix × vector multiplication.

What you'll be able to do

  • Combine rotation and shift into one operation.
  • Build and apply the homogeneous transform \(T\).
  • Chain transforms down an arm.

Rotation and shift together

A link frame is turned by \(\theta\) and shifted from the ground origin by a vector \(\mathbf{d}\). A point \(\mathbf{p}_{\text{link}}\) known in the link frame becomes, in the ground frame:

$$\mathbf{p}_{\text{ground}} = \mathbf{d} + R(\theta)\,\mathbf{p}_{\text{link}}$$
First rotate the point into ground directions with \(R(\theta)\), then add the shift \(\mathbf{d}\).
ground d x₁ y₁ link p
The link frame is shifted by \(\mathbf{d}\) and rotated by \(\theta\); the point \(\mathbf{p}\) rides on it.

An annoyance worth fixing

That mapping mixes two different operations:

Rotation

= multiply by a matrix \(R(\theta)\).

Translation

= add a vector \(\mathbf{d}\).

When we chain many links, mixing "multiply" and "add" gets messy and error-prone. We want one single operation that does both.

The trick: add a 1

Write each point with an extra entry equal to \(1\) — these are homogeneous coordinates:

$$\begin{bmatrix}x\\ y\end{bmatrix}\ \longrightarrow\ \begin{bmatrix}x\\ y\\ 1\end{bmatrix}$$
That harmless extra \(1\) is what lets a single matrix do rotation and translation at once.

The homogeneous transform \(T\)

$$T=\begin{bmatrix} \cos\theta & -\sin\theta & d_x\\ \sin\theta & \cos\theta & d_y\\ 0 & 0 & 1 \end{bmatrix}$$
where:
BlockMeaning
top-left \(2\times2\)the rotation \(R(\theta)\)
right column \((d_x,d_y)\)the shift \(\mathbf{d}\)
bottom row \([0\ 0\ 1]\)bookkeeping (keeps the extra \(1\))
Rotation in the corner, shift up the side — one tidy package.

One matrix does both

Multiply the homogeneous point by \(T\):

$$\begin{bmatrix}x'\\ y'\\ 1\end{bmatrix} = T\,\begin{bmatrix}x\\ y\\ 1\end{bmatrix}$$
Out comes \(x' = \cos\theta\,x - \sin\theta\,y + d_x\) and \(y' = \sin\theta\,x + \cos\theta\,y + d_y\): rotation and shift, in one multiply. The bottom row just carries the \(1\) along.
📐 Worked example

Apply a transform to a point

A link frame is rotated \(\theta = 90^\circ\) and shifted by \(\mathbf{d}=(3,1)\). A point sits at \((2,0)\) in the link frame. Find it in the ground frame.

1Build \(T\) (with \(\cos 90^\circ=0,\ \sin 90^\circ=1\)):
$$T=\begin{bmatrix}0 & -1 & 3\\ 1 & 0 & 1\\ 0 & 0 & 1\end{bmatrix}$$
2Multiply by the homogeneous point \((2,0,1)\):
$$\begin{bmatrix}x'\\ y'\\ 1\end{bmatrix}=\begin{bmatrix}0(2)-1(0)+3\\ 1(2)+0(0)+1\\ 1\end{bmatrix}=\begin{bmatrix}3\\ 3\\ 1\end{bmatrix}$$
The point lands at \((3,3)\). Check the two steps by hand: rotating \((2,0)\) by \(90^\circ\) gives \((0,2)\); adding the shift \((3,1)\) gives \((3,3)\) ✓ — exactly what the one matrix produced.

Down the arm

Chaining transforms

If \(T_0^1\) places link 1 in the ground frame, and \(T_1^2\) places link 2 in link 1's frame, then link 2 in the ground frame is just the product:

$$T_0^2 = T_0^1 \; T_1^2$$
Walk from the base outward, multiplying one transform per joint. That product chain is forward kinematics.
T₀¹ T₁² tip
Two joints, two transforms: \(T_0^2 = T_0^1 T_1^2\) carries the base frame out to the tip.

Why chaining is the whole game

🔭 Looking ahead: a 6-joint industrial arm is just six transforms multiplied in a row, \(T_0^6 = T_0^1 T_1^2 \cdots T_5^6\). The method does not change — only the number of links.
For 2–3 link arms we can skip the full matrices and read positions straight off the geometry — which is exactly what we do next, for the 2-link arm.

✏️ Try it yourself

A link frame is rotated \(\theta=90^\circ\) and shifted by \(\mathbf{d}=(1,2)\). A point sits at \((0,3)\) in the link frame. Use \(T\) to find it in the ground frame.

Step 1. \(T=\begin{bmatrix}0&-1&1\\ 1&0&2\\ 0&0&1\end{bmatrix}\) Step 2. \(\begin{bmatrix}x'\\ y'\\ 1\end{bmatrix}=\begin{bmatrix}0(0)-1(3)+1\\ 1(0)+0(3)+2\\ 1\end{bmatrix}=\begin{bmatrix}-2\\ 2\\ 1\end{bmatrix}\) Check. Rotate \((0,3)\) by \(90^\circ\) → \((-3,0)\); add \((1,2)\) → \((-2,2)\) ✓

Common mistakes to avoid

MistakeFix
Forgetting the shift \(\mathbf{d}\)Rotation alone is not enough — the right column of \(T\) carries the translation.
Dropping the extra \(1\)The point must be \((x,y,1)\); without it the shift cannot enter.
Multiplying transforms in the wrong orderChain base-outward: \(T_0^2=T_0^1 T_1^2\), not \(T_1^2 T_0^1\) (matrix order matters).
Putting \(\mathbf{d}\) in the bottom rowThe bottom row is always \([0\ 0\ 1]\); the shift goes in the right column.

Recap — the whole topic on one screen

$$T=\begin{bmatrix} \cos\theta & -\sin\theta & d_x\\ \sin\theta & \cos\theta & d_y\\ 0 & 0 & 1 \end{bmatrix}, \qquad T_0^2 = T_0^1\,T_1^2$$
IdeaWhat you own now
Rotation + shift\(\mathbf{p}_{\text{ground}}=\mathbf{d}+R(\theta)\mathbf{p}_{\text{link}}\)
The trickAdd a \(1\) → homogeneous coordinates
The transform\(T\) does rotation and shift in one multiply
ChainingMultiply one transform per joint — that is forward kinematics

Next topic

Forward kinematics of the 2-link arm

Time for the centrepiece. We chain the geometry down a 2-link planar arm and read off the elbow, the tip, and each link's centre of mass — the positions next theme's energy needs.

→ Forward kinematics of the 2-link arm