PaceDynamics Documentation Open the app
Contents

Suspension

Forces in the links

What each link of a corner carries when the tyre pushes on it, and the most it has to carry.

Model as of 0.338Figures from the Formula Student single-car templateOctave check Exact

Everything the tyre does reaches the body through the links. A wishbone corner has six: the two legs of each wishbone, the tie rod and the pushrod. The Forces tool works out what each one carries in a load case, and over a set of cases the most each must carry, which is what the links are sized for. This page follows that calculation.

Two-force members

A link with a ball joint or rod end at each end can carry no moment at either. Loaded only at its ends, it can only push or pull along the line between them: it is a two-force member, and one number says what it carries. The Forces tool gives that number in newtons, positive in tension.

A wishbone leg is two-force only in part. The two legs meet at the ball joint and are welded there, so a wishbone is one rigid arm, and an arm can bend. The app reads its load as two leg forces all the same, the share the legs can carry along their lengths, and reports what is left over, which the arm carries in bending.

The upright's balance

Six unknowns hold the upright: the two legs of the upper wishbone and the tie rod, each along its own line, and the lower ball joint, which can push any way and so counts for three. The pushrod stands on the lower wishbone, not on the upright. Force and moment balance about the wheel centre give six equations, and they settle the six:

โˆ‘ifi๐ห†i+๐‹=โˆ’๐…(1)
โˆ‘i(๐iโˆ’๐‚)ร—fi๐ห†i+(๐lbjโˆ’๐‚)ร—๐‹=โˆ’(๐Šโˆ’๐‚)ร—๐…โˆ’๐Œ(2)
fi,๐ห†i
the force in the upper legs and the tie rod, positive in tension, and the unit vector from each one's upright end to its chassis end
๐i
each one's upright end; ๐lbj the lower ball joint
๐‹
the lower wishbone's force on the upright, through its ball joint
๐…,๐Œ
what the wheel puts on the upright, as a force at the contact patch ๐Š and a moment (below)
๐‚
the wheel centre

The lower wishbone turns on its two chassis pivots. Its hinge can take a force in any direction but no moment about its own axis, so the pushrod has to balance ๐‹ about that axis:

๐šห†โ‹…[(๐lbjโˆ’๐F)ร—(โˆ’๐‹)]+frod๐šห†โ‹…[(๐rodโˆ’๐F)ร—๐ฎห†]=0(3)
๐šห†
the unit vector along the hinge, from the front pivot ๐F to the rear one
๐rod,๐ฎห†
the pushrod's end on the wishbone, and the unit vector from it to the rocker

What the hinge takes, ๐‘, is what is left: the ball joint's force and the pushrod's together. The app splits it into the two legs' forces by least squares, the nearest two forces along the legs can come:

๐‘โ‰ˆfF๐ห†F+fR๐ห†R,r=|๐‘โˆ’fF๐ห†Fโˆ’fR๐ห†R|(4)
r
the residual, the part the arm carries in bending ("Lower arm, residual" below)

A pushrod may stand on the upper wishbone instead, or on the upright itself; the tool balances whichever part carries it the same way. On a strut the strut carries a side load as well, and the tool reports it.

The front-left corner in the live case, to scale in front view: each link in its colour for tension or compression, with the force it carries, and the tyreโ€™s force at the contact patchupper legs โˆ’182 front, โˆ’165 rearlower legs +561 front, +461 reartie rod +114pushrod โˆ’561to the rockerside 426 Nload 426 NFront-left corner in the live case, 1 g left, to scale in front view; N, + = tension
TensionCompression
Fig. 1
The inside front wheel in the live case: the pushrod pushes, the lower wishboneโ€™s legs pull, and the upper wishbone is short of work.
Measured

What reaches the upright

The tyre's force at the contact patch is not all the links carry. Two things change it on its way to the upright.

The tyre makes its side force behind the middle of its patch, by its pneumatic trail; that is its aligning torque. The app moves the side force that far back along the wheel's heading. And the wheel itself has a weight and, in a corner or under braking, an inertia: the tyre's force pushes the whole car, the wheel included, and the links carry what is left once the wheel has had its share. That share acts at the wheel centre, so it brings back the moment a force at the patch would add:

Show the equations with
๐…=๐…K+๐…w,๐Œ=(โˆ’tp๐กห†)ร—๐…sideโˆ’(๐Šโˆ’๐‚)ร—๐…w(5)
๐…K=(0,ย โˆ’426,ย 426)ย N,tp=8.06ย mm,๐…w=(0.0,ย 78.5,ย โˆ’78.5)ย N(5)
๐…K
the road's force on the tyre, at the patch
tp,๐กห†
the pneumatic trail, and the wheel's heading on the road
๐…side
the part of ๐…K along the road square to the heading
๐…w
the wheel's weight less its mass times its acceleration: what the wheel itself takes

The second line is the front-left wheel in the Forces tool's live case, 1 g to the left at 60 km/h. The script reads its points and forces as the Forces tool holds them, in the frame the hardpoints are drawn in: x forward, y to the right, z up. It is the inside wheel, lightly loaded, and its side force points into the turn, which for a left wheel is outboard.

A brake on the upright keeps its torque inside the upright. A brake or a motor on the chassis works the wheel through a shaft, and the shaft takes the moment the tyre's force makes about the spin axis to the body; the tool takes that part out of ๐Œ. Neither case here has one.

Two cases

The front-left wheel in the live case, and in the built-in "3 g bump, front", in which the road pushes that wheel up with three times its static load:

member live: 1 g left, 60 km/h 3 g bump, front
upper wishbone, front leg [N] โˆ’182 โˆ’246
upper wishbone, rear leg [N] โˆ’165 โˆ’152
lower wishbone, front leg [N] 561 1398
lower wishbone, rear leg [N] 461 1119
tie rod [N] 114 54
pushrod [N] โˆ’561 โˆ’2701
lower arm, residual [N] 33 177

The pushrod takes the vertical load, in compression, and the lower legs hold its foot in tension. The upper wishbone is short of work in both: the lower ball joint is near the road, so it takes most of what the tyre does. The bump puts 2075 N on the patch, more than the template's springs can hold with that wheel pushed alone: they give out at 48.0 mm of travel (Kinematics and compliance). The tool stands the car there and lets a packer in the damper unit take the rest, so the links carry the whole case at that pose.

On a decoupled axle the pushrod turns a rocker, and the two rockers of the axle work the heave and the roll element between them (Ride and roll rates). Each rocker balances its pushrod against the elements, so the two pushrods together say what each element carries. In the live case the front heave element carries โˆ’1208 N and the roll element โˆ’649 N. The check below leaves the rockers out.

Loaded geometry

A link's force depends on its direction, and a load case moves every link. The car rolls, pitches and sinks under it, and in a corner it steers. The tool solves each case where the case puts the car, as the Kinematics load case does, with the tyre on its spring and the steer the corner needs: 4.73 mm of rack in the live case. The points the script reads are the ones it stood at.

Design loads

A link is sized for the most it ever carries, in tension and in compression. The tool runs a set of load cases and keeps, for each member and each sign, the largest force any of them puts on it, times the case's factor. The built-in set is the car's grip envelope, every limit it has: at each speed from 20 km/h to near its top speed, its g-g diagram walked to the edge in every direction, cornering, braking, driving and each mix of them. Wheel events such as the bump join it. Each case is solved as stated and mirrored, which on the template makes 200 states.

The largest tension and compression in each member of the front-left and rear-left corners over the built-in load set, each tagged with the state that set itUCA frontUCA rearLCA frontLCA rearTie rodPushrodHeave elementRoll elementFront+542 Fโˆ’1767 B+1520 Aโˆ’260 D+6270 Bโˆ’870 F+1119 Hโˆ’3162 B+208 Dโˆ’1321 A+104 Kโˆ’2943 Aโˆ’3712 B+1771 Gโˆ’1531 GRear+1121 Cโˆ’1145 B+979 Aโˆ’1208 C+2989 Bโˆ’2977 C+4296 Iโˆ’2443 A+855 Aโˆ’830 Jโˆ’3209 Cโˆ’3453 D+1920 Eโˆ’1561 EN, at the left wheels; 200 states
TensionCompression
A Grip envelope: 109 km/h, 1.5 g lat, โˆ’1.5 g longB Grip envelope: 127 km/h, 0.0 g lat, โˆ’2.7 g longC Grip envelope: 109 km/h, 1.8 g lat, +0.5 g longD Grip envelope: 145 km/h, 0.7 g lat, +0.2 g longE 3 g bump, rear, on a stopF Grip envelope: 38 km/h, 1.7 g lat, +0.0 g longG Grip envelope: 92 km/h, 2.2 g lat, +0.0 g longH 3 g bump, front, on a stopI Grip envelope: 109 km/h, 1.0 g lat, +0.6 g longJ Grip envelope: 127 km/h, 1.2 g lat, +0.3 g longK Grip envelope: 20 km/h, 1.3 g lat, +0.7 g long
Fig. 2
The most each member carries over the built-in set, in tension and in compression, and the state that set it.
Measured

Most peaks are set at the edge of the envelope, where the tyres are working hardest. The front's largest come from the hardest stop at speed, where downforce and the pitch transfer stack: the lower front leg's tension, the upper front leg's compression and the heave element's. The rear's largest, its lower rear leg's tension and its pushrod's compression, come from cornering under drive. A peak set on a stop is marked so: the bump's is one.

What the model assumes

  • Every link is a two-force member, with joints at its ends that carry no moment; a wishbone's bending shows only as the residual.
  • The forces are static: the members have no mass, and the wheel's own inertia is taken at its centre.
  • The tyre's aligning torque is its side force acting behind the patch, by the pneumatic trail the tyre model gives at the slip angle the case needs. A wheel event has no slip, so no trail.
  • Each case is solved at its own pose, steady state. Dampers carry nothing in a steady case; a packer takes what the springs cannot hold.

In the app

Forces, the Case view: one state at one corner, the members drawn on the corner in 3-D and listed under "Rod forces". The left rail's first row, "Live", is the sliders: lateral and longitudinal acceleration and speed, with "Steer to the trim".

Forces, the Design loads view: the table of peaks by member and sign, each tagged with the state that set it, and "Peaks" draws them on the corner. Export CSV writes every corner's peaks.

Check it yourself

The script takes the live case and the bump at the front-left wheel as the tool stood them, adds the trail and the wheel's share, and solves the corner with pd_members.m, the same solve in the same order.

link_forces.mwith example_suspension.m, pd_members.m, pd_compare.mExact: agrees to machine precision
>> link_forces

  Live case, 1 g left at 60 km/h

  Quantity                                This script   PaceDynamics       Diff
  -----------------------------------------------------------------------------
  upper front leg [N]                         -182.19        -182.19   4.7e-14% 
  upper rear leg [N]                         -164.873       -164.873   3.4e-14% 
  lower front leg [N]                         561.357        561.357   8.1e-14% 
  lower rear leg [N]                          460.802        460.802   1.4e-13% 
  tie rod [N]                                 114.295        114.295   7.5e-14% 
  pushrod [N]                                -560.843       -560.843     2e-14% 
  lower arm, residual [N]                     32.6404        32.6404         0% 

  3 g bump, front
  upper front leg [N]                        -245.502       -245.502   2.3e-14% 
  upper rear leg [N]                         -151.556       -151.556   1.9e-14% 
  lower front leg [N]                         1398.02        1398.02   1.5e-13% 
  lower rear leg [N]                          1118.78        1118.78     1e-13% 
  tie rod [N]                                 53.5063        53.5063   1.3e-14% 
  pushrod [N]                                -2700.78       -2700.78         0% 
  lower arm, residual [N]                      176.76         176.76   1.6e-14% 

  All 14 quantities agree with PaceDynamics (largest difference 1.5e-13 %).
The script
%% Forces in the links: what each link of a corner carries under a load case
%
% Companion to the documentation page "Forces in the links". Runs unchanged in GNU
% Octave (7 or later) and MATLAB. Edit the cases in example_suspension.m, or type your
% own from the Forces tool, and run:
%
%   >> link_forces
%
% Two of the Forces tool's cases, at the front-left wheel: the live case it opens on
% (1 g of cornering at 60 km/h) and the 3 g bump. Each gives the corner's points where
% the car stood under that case, the tyre's force at the contact patch, and the rest of
% what acts on the upright. The statics are in pd_members.
%
% Before the links see it, the tyre's force is joined by two more things:
%
% 1. The aligning torque. A tyre making side force makes it behind the middle of its
%    patch, by the pneumatic trail. The script moves the force's sideways part that far
%    back along the wheel's heading, which is the same moment.
% 2. The wheel's own weight and inertia, at the wheel centre: the patch force pushes the
%    whole car, the wheel included, and the links carry what is left once the wheel has
%    had its share. Added to the patch force it would bring a moment about the wheel
%    centre that a force AT the centre does not have, so that moment is taken back off.
%
% The script agrees with the app to its last digits: it is the same solve, in the
% same order.
%
% Part of the PaceDynamics documentation, https://pacedyn.dev/docs
% SPDX-License-Identifier: MIT

[car, app] = example_suspension();
cases = {'live', 'bump'};
titles = {'Live case, 1 g left at 60 km/h', '3 g bump, front'};
members = {'ucaFront', 'ucaRear', 'lcaFront', 'lcaRear', 'tieRod', 'pushRod', 'armResidual'};
labels  = {'upper front leg', 'upper rear leg', 'lower front leg', 'lower rear leg', 'tie rod', 'pushrod', 'lower arm, residual'};

for c = 1:numel(cases)
  k = app.forces.(cases{c});
  g = k.geometry;
  F = k.force;

  % The wheel's heading on the road: square to its spin axis, level, forward.
  s = g.spinAxis;
  h = [-s(2), s(1), 0] / hypot(s(1), s(2));
  if h(1) < 0, h = -h; end
  % 1. The trail: the force's sideways part, moved `trail` behind the patch.
  flat = [F(1), F(2), 0];
  sideways = flat - h * (flat * h');
  M = cross(-k.trail * h, sideways);
  % 2. The wheel's weight and inertia at its centre, moved to the patch.
  M = M - cross(g.contactPatch - g.wheelCenter, k.hub);
  F = F + k.hub;
  if k.shaft
    error('This script does not model a drive or brake shaft; the cases here have none.');
  end

  f = pd_members(g, F, M);
  fprintf('\n  %s\n', titles{c});
  for i = 1:numel(members)
    pd_compare(sprintf('%s [N]', labels{i}), f.(members{i}), k.members.(members{i}));
  end
end
pd_compare();

Download: link_forces.m ยท example_suspension.m ยท pd_members.m ยท pd_compare.m. The scripts are MIT licensed.

Further reading

  • J. C. Dixon, Suspension Geometry and Computation (Wiley, 2009), on suspension forces and the free body.
  • J. Reimpell, H. Stoll and J. W. Betzler, The Automotive Chassis: Engineering Principles (Butterworth-Heinemann, 2001), on design loads.
ChapterForces in the links
PartSuspension
Model as of0.338
Example carthe Formula Student single-car template