Omnidirectional drive and mecanum wheels
Three-wheel and four-wheel omni kinematics. When you need holonomic motion, when you don't, and the mechanical price you pay for sliding sideways.
Diff-drive can't slide sideways. Ackermann can't pivot. Both have constraints baked into their geometry. Omnidirectional drives have neither — they translate in any direction, rotate in place, do both at once. The catch: complicated wheels, rolling efficiency loss, and limited load capacity. Here's when omni is right, when it isn't, and the math that drives it.
Two flavors of omni wheel
Mecanum wheel
A wheel with rollers mounted at 45° around its rim. As the wheel spins, the rollers contact the ground at the angle. Combine four mecanum wheels (two pairs facing opposite 45° directions) and you can decompose any planar velocity into wheel speeds.
Swedish (omni) wheel
Like mecanum but with rollers at 90° to the wheel axis. The wheel rolls forward normally; the rollers slide laterally. Three or four arranged in a triangle/square.
Both achieve holonomic motion. Differences: mecanum requires four wheels; Swedish needs at least three. Mecanum has slightly better load capacity; Swedish has cleaner kinematics.
The 4-wheel mecanum kinematics
Body twist (v_x, v_y, \omega) → per-wheel angular velocities \omega_{FL}, \omega_{FR}, \omega_{RL}, \omega_{RR}:
ω_FL = (v_x − v_y − (L_x + L_y) ω) / r
ω_FR = (v_x + v_y + (L_x + L_y) ω) / r
ω_RL = (v_x + v_y − (L_x + L_y) ω) / r
ω_RR = (v_x − v_y + (L_x + L_y) ω) / r
Where L_x, L_y are half the wheel separation in each direction; r is wheel radius. Three control inputs (v_x, v_y, \omega); three world DOF — holonomic.
The matrix form maps cleanly to ROS twists; ros2_control's mecanum drive plugin implements this directly.
The 3-wheel Swedish kinematics
Three wheels at 120° around a center. Each wheel's contribution:
ω_i = (1 / r) · (−sin(θ_i) v_x + cos(θ_i) v_y + L ω)
where \theta_i is the wheel's mounting angle and L is the radius from center to wheel.
Cleaner than mecanum (no extra L_x, L_y parameters); slightly less stable mechanically (only three contact points).
The mechanical reality
- Roller wear: the small rollers on mecanum / Swedish wheels carry the same loads as the main wheel but with much smaller contact patches. They wear faster than tires; replace periodically.
- Vibration: each roller transition causes a small bump. Robot rides like a bumpy cart at speed.
- Slip-prone: lateral motion is achieved by the rollers slipping sideways. Each wheel always has some slip; odometry drift is worse than diff-drive.
- Load capacity: contact patches are small; load capacity per wheel is much less than a solid pneumatic tire.
When omni shines
- Tight spaces: warehouse aisles, cluttered indoor spaces. The robot can re-orient without backing up.
- Precise positioning: align with a pallet, dock with a charging station. Omni does it with a single coordinated move.
- Robot soccer: the canonical omni use case. RoboCup teams almost universally use omni.
- Mobile manipulator bases: the arm wants the base to position freely without re-orienting. Omni delivers.
When omni is the wrong tool
- Outdoor terrain: rollers don't handle dirt, gravel, or grass. Mecanum is indoor-only for production.
- Heavy loads: small contact patches mean load is concentrated; floors get scratched, rollers fail.
- High speeds: vibration becomes uncomfortable; wheel-roller slip explodes.
- Long distances: rolling resistance is higher than for solid wheels; battery life suffers.
Production examples
- KUKA omniMove: industrial mecanum AGV; carries multi-ton loads at low speed.
- Husarion ROSbot OmniDrive: research-grade indoor mobile platform.
- TurtleBot 4 with mecanum: educational; covers omni kinematics out of the box.
- RoboCup small-size and middle-size league: every team's robot is omni.
Compared to diff-drive on the same task
For a 10×10 m workspace with 50 cm corridors:
- Diff-drive: pivot in place, drive forward, pivot, etc. Multi-step paths through tight spots.
- Omni: smooth diagonal motion through the same space; no pivots needed. ~20% shorter total path length on average; ~40% smoother control profile.
For a 100 m hallway with no turns:
- Diff-drive: drives straight; uses ~80% of battery for 1 km.
- Omni: drives straight; uses ~120% of battery for 1 km (rolling resistance loss).
Trade-offs are real. Pick by the workspace.
Implementation in 30 lines
class MecanumDrive:
def __init__(self, wheel_radius, lx, ly):
self.r = wheel_radius
self.lx = lx # half wheel base, x
self.ly = ly # half wheel base, y
def twist_to_wheels(self, vx, vy, w):
L = self.lx + self.ly
return [
(vx - vy - L * w) / self.r, # FL
(vx + vy + L * w) / self.r, # FR
(vx + vy - L * w) / self.r, # RL
(vx - vy + L * w) / self.r, # RR
]
def wheels_to_twist(self, omegas):
wFL, wFR, wRL, wRR = omegas
L = self.lx + self.ly
vx = (wFL + wFR + wRL + wRR) * self.r / 4
vy = (-wFL + wFR + wRL - wRR) * self.r / 4
w = (-wFL + wFR - wRL + wRR) * self.r / (4 * L)
return vx, vy, w
Exercise
In a sim, build a 4-wheel mecanum platform. Drive a 1m × 1m square pattern without rotating: only v_x, v_y commands, no \omega. Confirm the robot translates without changing orientation. Try the same on a diff-drive — impossible without combining pivot + drive segments.
Next
ZMP and capture point — the classical tools that keep humanoids upright, still useful in the era of learned gaits.
Comments
Sign in to post a comment.