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:
An annoyance worth fixing
That mapping mixes two different operations:
Rotation
= multiply by a matrix \(R(\theta)\).
Translation
= add a vector \(\mathbf{d}\).
The trick: add a 1
Write each point with an extra entry equal to \(1\) — these are homogeneous coordinates:
The homogeneous transform \(T\)
| Block | Meaning |
|---|---|
| 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\)) |
One matrix does both
Multiply the homogeneous point by \(T\):
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.
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:
Why chaining is the whole game
✏️ 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.
Common mistakes to avoid
| Mistake | Fix |
|---|---|
| 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 order | Chain 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 row | The bottom row is always \([0\ 0\ 1]\); the shift goes in the right column. |
Recap — the whole topic on one screen
| Idea | What you own now |
|---|---|
| Rotation + shift | \(\mathbf{p}_{\text{ground}}=\mathbf{d}+R(\theta)\mathbf{p}_{\text{link}}\) |
| The trick | Add a \(1\) → homogeneous coordinates |
| The transform | \(T\) does rotation and shift in one multiply |
| Chaining | Multiply one transform per joint — that is forward kinematics |