Ackermann steering: calculate wheel angles and turning radius

Derive the inner and outer front-wheel angles for ideal Ackermann steering. Connect bicycle steering, wheelbase, and track width to turning radius, reverse motion, and the rear axle's path.

By 14 min read

What you will learn

  • Calculate rear-path curvature from bicycle steering angle and wheelbase.
  • Derive different left and right front-wheel angles from one turning center.
  • Check the geometric branch and steering limits before using the model.
  • Predict how reverse speed changes yaw while preserving steering geometry.
  • Distinguish ideal rolling geometry from a physical steering linkage and tire dynamics.

Before you start

In a left turn, a car's left front wheel follows a tighter circle than its right front wheel. They need different steering angles to roll around the same center.

Ackermann steering geometry calculates that pair of angles. Start with a desired turn for the midpoint of the rear axle, then use the wheelbase and track width to orient each front wheel along its own circular path.

Make the four wheels share a turning center

Use a rigid vehicle with two parallel rear wheels and two steerable front wheels. Assume a flat floor, rolling without slip, and steering pivots at the modeled wheel centers. Use the same track width on both axles in this lesson.

During a nonzero turn, each wheel's velocity points along that wheel's rolling direction. A line perpendicular to the rolling direction through the wheel center points toward the instantaneous center of rotation, or ICR. All four wheel-normal lines must meet at the same ICR for this ideal rigid-body motion.

The rear wheels point straight along the body, so their common normal lies on the rear axle line. The front wheels must orient their normals to meet that line at the same point. The instantaneous center of rotation lesson derives that center from a planar velocity field and explains what happens during straight motion.

The University of Illinois steering-geometry explanation shows these linked wheel directions and the different speeds of the wheels during a turn.

Put the reference point on the rear axle

Track the rear-axle midpoint, with world pose (x, y, θ). World x points right in the path plot, world y points up, and θ increases counterclockwise from world x. Body x points forward along the vehicle; body y points left.

At the starting pose (0, 0, 0), the rear wheel centers are (0, +w/2) and (0, −w/2). The front wheel centers are (L, +w/2) and (L, −w/2). Review coordinate frames before mixing those body coordinates with a later world pose.

SymbolMeaningUnit
LWheelbase, measured between front and rear axlesm
wFull left-to-right track widthm
δSteering of the virtual front wheel in the bicycle modelrad
δL, δRActual left and right front-wheel steering anglesrad
vSigned forward speed of the rear-axle midpointm/s
κSigned rear-path curvature relative to forward travel1/m
RSigned rear-midpoint turning radiusm

Wheel radius is a separate measurement that converts wheel rotation into rolling distance. It does not replace L or w in these steering equations. The driver’s steering-wheel angle also needs its own linkage or steering-ratio mapping before it becomes a road-wheel angle.

Convert bicycle steering into curvature

Collapse each axle to a virtual wheel at its midpoint. The rear virtual wheel stays straight, and the front virtual wheel turns by δ. This kinematic bicycle model preserves the rear-midpoint motion of the ideal Ackermann geometry.

The right triangle between the rear midpoint, front midpoint, and ICR gives tan δ = L/R. Therefore:

κ = tan δ / L
R = 1/κ, when κ ≠ 0
ω = vκ

Positive δ gives positive κ and an ICR to the vehicle's left. At δ = 0, curvature and yaw rate are zero, and straight motion has its geometric turning center at infinity. The virtual front-wheel angle generally differs from the arithmetic average of δL and δR.

The ROS 2 control kinematics guide and LaValle's simple-car model give the rear-reference motion equations:

ẋ = v cos θ
ẏ = v sin θ
θ̇ = v tan δ / L

These equations assume v refers to the rear midpoint. A front-wheel speed follows a different circle and needs conversion before use as v.

Calculate the two front-wheel angles

For a left turn, the ICR is at body coordinates (0, R). The front-left wheel is only R − w/2 sideways from it; the front-right wheel is R + w/2 away. Both front wheels sit L meters forward of the rear axle.

Their wheel normals give tan δL = L/(R − w/2) and tan δR = L/(R + w/2). Expressing those relations through κ also covers straight steering without an infinite R:

δL = atan2(Lκ, 1 − wκ/2)
δR = atan2(Lκ, 1 + wκ/2)

Here atan2(y, x) returns the angle of the vector (x, y), in radians. For positive κ in the valid range below, δL is larger than δR: the inner wheel turns more. For negative κ, the right wheel becomes the inner wheel and has the larger angle magnitude.

These are the same relationships as the ROS 2 control Ackermann equations, with a sign convention that counts left steering as positive. For nonzero steering, they also imply the check cot δR − cot δL = w/L.

Keep the geometry inside its valid range

Use positive L and w, and keep the virtual steering angle strictly between −90° and +90°. This lesson also keeps the ICR outside the track:

|R| > w/2, when κ ≠ 0
|wκ/2| < 1

That condition makes both 1 − wκ/2 and 1 + wκ/2 positive, so the front-wheel angles stay on the usual branch between −90° and +90°. At the boundary, the inner front wheel would point sideways. atan2 can still return angles beyond that boundary, but this vehicle model rejects them.

Add a mechanical limit as a separate check. The experiment assumes a 50° maximum magnitude for either front wheel, then restricts bicycle steering to ±35°, wheelbase to 1.5–3 m, and track width to 0.8–1.6 m. Every available combination stays inside those limits; the largest front angle is about 48.177354°.

These bounds define this teaching model. A specific robot needs its own measured steering range and linkage calibration.

Work through a two-second left turn

Set L = 2 m, w = 1 m, δ = 30° = π/6 rad, and v = 1 m/s. Start at (0, 0, 0) and hold that command for two seconds.

  1. Rear curvature is tan(π/6)/2 = 0.288675 1/m, rounded.
  2. The signed radius is R = 2√3 = 3.464102 m.
  3. The inner front angle is atan(2/(2√3 − 0.5)) = 34.009142°.
  4. The outer front angle is atan(2/(2√3 + 0.5)) = 26.772220°.
  5. Yaw rate is vκ = 0.288675 rad/s, and final heading is vκt = 0.577350 rad.

For constant v and κ from this origin, integrate the circle to get:

x(t) = sin(vκt)/κ
y(t) = (1 − cos(vκt))/κ
θ(t) = vκt

The final rear pose is (1.890726 m, 0.561490 m, 0.577350 rad). Its travel along the arc is |v|t = 2 m. The lab uses the stable sinc pose update, which also handles κ = 0 continuously.

The rear wheels cover different distances. Their signed rolling speeds are vL = v(1 − wκ/2) = 0.855662 m/s and vR = v(1 + wκ/2) = 1.144338 m/s. A drive system must accommodate that difference if both rear wheels are to roll without slip.

Reverse speed without changing the steering geometry

Keep δ at +30° and set v to −1 m/s. The front wheels still steer to +34.009142° and +26.772220°, and the geometric ICR remains at (0, +3.464102) in the starting body frame. Reversal changes the direction of rolling around that center.

Because ω = vκ, yaw becomes −0.288675 rad/s. After two seconds from the same origin, the rear pose is (-1.890726 m, +0.561490 m, -0.577350 rad). The heading turns clockwise while the rear midpoint moves backward around the same circle.

At v = 0, yaw is zero even with nonzero steering. This car-like model cannot spin in place. An ideal differential-drive robot can produce a spin with opposite wheel speeds, so the two drive types require different motion plans.

Signed κ here describes steering geometry relative to forward travel, including while reversing. Forward-and-reverse planners such as Reeds–Shepp paths must track travel direction as well as curvature. The nonholonomic constraint still forbids an instantaneous sideways slide.

Inspect the wheels and rear-axle path

The first figure draws the starting wheel geometry. Blue front-wheel sticks show steering directions, and dashed wheel-normal lines point toward their common ICR. Small steering angles push that center beyond the close view; the radius readout still gives its location.

One steering command, two front angles

Connect wheel geometry with a car-like turn

Hold the bicycle steering angle and signed rear-midpoint speed constant. Compare the two front-wheel angles, then inspect the rear axle's motion from (0, 0, 0).

30 °
2.00 m
1.00 m
1.00 m/s
2.0 s

Positive steering points the wheels left. Negative speed reverses rolling while keeping the same steering geometry. Wheelbase measures front-to-rear axle separation; track measures the full left-to-right separation.

Wheel orientations at the starting pose

Ackermann steering: left front 34.009142 degrees, right front 26.772220 degreesA top view with body x forward to the right and body y leftward, drawn upward. The rear axle lies at x zero and the front axle at x L. FL and FR mark the front wheels; RL and RR mark the rear wheels. Blue front-wheel sticks show their steering angles. Dashed lines run perpendicular to the wheel directions toward their common turning center. Wheel sticks show orientation with schematic lengths; axle-center distances share one scale.RLRRFLFRICRxy
The dashed wheel-normal lines meet at the instantaneous center of rotation (ICR) for nonzero speed. The blue rear-center dot is the tracked origin. At zero speed, this is prospective turning geometry; the stationary vehicle has no unique ICR.

Rear-axle midpoint in world coordinates (m)

Rear midpoint ends at (1.890726, 0.561490) metersEqual scales on world x and y. The blue point marks the initial rear midpoint. An amber path follows its constant-steering motion. A black endpoint and arrow show the final rear midpoint and vehicle heading. Arrow size is schematic, and the plot has no obstacles or vehicle footprint.-2.5-2.5002.52.5xy
Each control change starts from (0, 0, 0). The exact constant-rate update follows the rear axle, and both plot axes rescale together. Heading increases counterclockwise; reverse motion can move opposite the heading arrow.
Left front steering (degrees)
34.009142
Right front steering (degrees)
26.772220
Inner front wheel
Left
Rear-path curvature (1/m)
0.288675
Signed rear turn radius (m)
3.464102
Yaw rate (rad/s)
0.288675
Rear left rolling speed (m/s)
0.855662
Rear right rolling speed (m/s)
1.144338
Final rear x (m)
1.890726
Final rear y (m)
0.561490
Final heading (rad)
0.577350
Rear midpoint travel (m)
2.000000

Front-left steering is 34.009142°; front-right steering is 26.772220°. After 2.0 s, the rear midpoint is at (1.890726, 0.561490) m with heading 0.577350 rad.

The control ranges keep the turning center outside the wheel track and each front-wheel angle below the model's 50° limit. This assumes ideal rolling, parallel rear wheels, and equal front/rear track widths. It omits steering-rate limits, tire slip, suspension, and collision checks.

The second figure traces the rear midpoint and shows its final heading. Both figures use equal scales on their axes, while the wheel sticks and heading arrows use schematic lengths for readability. Each control change starts a new motion from (0, 0, 0).

Choose Forward right turn to swap which front wheel turns more. Choose Reverse with left steering to keep the steering angles and change the sign of yaw. Set speed to zero to verify that steering alone does not rotate the chassis.

Reset and increase only the track width. The front-wheel angles spread apart, while the rear path stays fixed because κ = tan δ/L has no w term. Increasing L with δ fixed reduces curvature and makes the turn wider.

Separate the ideal geometry from the vehicle

Ackermann geometry specifies the desired angle relationship. A physical steering linkage uses steering arms and tie rods to approximate that relationship across its operating range. The Illinois linkage demonstration shows how linkage dimensions affect the match between the front wheels.

Real designs can also depart deliberately from ideal Ackermann behavior. MathWorks' kinematic steering model distinguishes ideal Ackermann, rack-and-pinion, and parallel steering, and supports adjusting the Ackermann relationship. Its vehicle-axis convention differs from this lesson's left-positive convention, so compare geometry and coordinate definitions when transferring formulas.

The rolling model omits tire slip angles, suspension motion, and steering compliance. Constant-speed integration also omits acceleration and the time required to move the steering mechanism. A valid rear-center curve needs collision checks for the full vehicle before a robot can follow it near obstacles.

When estimating motion, use measured wheel travel and steering angles, calibrated dimensions, and a stated reference point. Wheel odometry develops the distinction between accumulating motion estimates and knowing the vehicle's true position. A learned correction model needs evaluation against measured poses; the ideal equations provide a baseline for that comparison.

Reproduce Ackermann motion in Python

This standard-library example computes the front-wheel geometry and uses constant-rate integration for the rear midpoint. The angle check enforces the same 50° front-wheel limit as the lab. Geometry inputs use meters and radians; speed uses m/s and time uses seconds.

from math import atan2, cos, degrees, isfinite, pi, radians, sin, tan


def geometry(wheelbase, track, delta):
    if not all(isfinite(v) for v in (wheelbase, track, delta)):
        raise ValueError("Use finite geometry inputs")
    if wheelbase <= 0 or track <= 0 or abs(delta) >= pi / 2:
        raise ValueError("Use positive dimensions and steering inside +/-90 degrees")
    kappa = tan(delta) / wheelbase
    left_factor = 1 - track * kappa / 2
    right_factor = 1 + track * kappa / 2
    if min(left_factor, right_factor) <= 0:
        raise ValueError("Turning center must stay outside the track")
    left = atan2(wheelbase * kappa, left_factor)
    right = atan2(wheelbase * kappa, right_factor)
    if max(abs(left), abs(right)) > radians(50) + 1e-12:
        raise ValueError("Front-wheel steering exceeds 50 degrees")
    return kappa, left, right


def rear_pose(v, kappa, duration):
    if not all(isfinite(n) for n in (v, kappa, duration)) or duration < 0:
        raise ValueError("Use finite inputs and nonnegative duration")
    half_turn = v * kappa * duration / 2
    if abs(half_turn) < 1e-4:
        z = half_turn * half_turn
        sinc = 1 - z / 6 + z * z / 120 - z * z * z / 5040
    else:
        sinc = sin(half_turn) / half_turn
    chord = v * duration * sinc
    return chord * cos(half_turn), chord * sin(half_turn), 2 * half_turn


def fmt(value):
    return f"{0.0 if abs(value) < 0.5e-6 else value:.6f}"


for name, steering, speed in [
    ("left", 30, 1),
    ("straight", 0, 1),
    ("right", -30, 1),
    ("reverse", 30, -1),
    ("stopped", 30, 0),
]:
    kappa, left, right = geometry(2, 1, radians(steering))
    x, y, theta = rear_pose(speed, kappa, 2)
    print(f"{name}: front=({fmt(degrees(left))}, {fmt(degrees(right))}) deg; "
          f"yaw={fmt(speed * kappa)}; rear=({fmt(x)}, {fmt(y)}, {fmt(theta)})")

Expected output, with yaw in rad/s and rear pose in (m, m, rad):

left: front=(34.009142, 26.772220) deg; yaw=0.288675; rear=(1.890726, 0.561490, 0.577350)
straight: front=(0.000000, 0.000000) deg; yaw=0.000000; rear=(2.000000, 0.000000, 0.000000)
right: front=(-26.772220, -34.009142) deg; yaw=-0.288675; rear=(1.890726, -0.561490, -0.577350)
reverse: front=(34.009142, 26.772220) deg; yaw=-0.288675; rear=(-1.890726, 0.561490, -0.577350)
stopped: front=(34.009142, 26.772220) deg; yaw=0.000000; rear=(0.000000, 0.000000, 0.000000)

The stopped case retains its steering angles but has no chassis motion. For nonzero speed, the wheel directions and their signed rolling speeds together determine the turn.

Try it yourself

Exercise 1: choose a four-meter rear turning radius. Use L = 2 m, w = 1 m, and a left-turn radius R = 4 m. Calculate δ, δL, and δR, then predict the rear pose after two seconds at v = 1.5 m/s from (0, 0, 0).

Show the four-meter-radius calculation

Curvature is 1/4 = 0.25 1/m. The bicycle angle is atan(2/4) = 26.565051°; the front-left angle is atan(2/3.5) = 29.744881°, and the front-right angle is atan(2/4.5) = 23.962489°.

Yaw rate is 1.5 × 0.25 = 0.375 rad/s. After two seconds, θ = 0.75 rad, x = 4 sin(0.75) = 2.726555 m, and y = 4(1 − cos(0.75)) = 1.073245 m. Rear-midpoint travel is 3 m.

For a Python check, call geometry(2, 1, atan2(2, 4)) and rear_pose(1.5, 0.25, 2).

Exercise 2: widen the track. Keep the default L = 2 m, δ = 30°, v = 1 m/s, and duration 2 s, but increase w from 1 m to 1.6 m. Calculate both front angles and both rear rolling speeds. Does the rear midpoint reach a different pose?

Show the wider-track comparison

Curvature stays at tan(30°)/2, so the rear pose remains (1.890726 m, 0.561490 m, 0.577350 rad). The front-left angle increases to 36.896368° and the front-right angle decreases to 25.128079°.

The rear rolling speeds become 1 − 0.8κ = 0.769060 m/s and 1 + 0.8κ = 1.230940 m/s. The wider track places the wheels farther from the midpoint, increasing their speed difference for the same body yaw rate. The two front angles remain below the model's 50° limit.

Sources and further study

Continue with Reeds–Shepp paths to assemble forward and reverse turns into a route between two vehicle poses.