Contents
Tyres
Combined slip
What a tyre can do when it corners and drives or brakes at once, and how the app weighs one force against the other.
A tyre has one contact patch and one grip to share between directions. Brake in a corner and the side force falls; corner under braking and the brake force falls. The pure-slip curves of Slip and the Magic Formula are the two ends of that trade. This page is the middle of it: the friction ellipse, the Magic Formula's combined-slip weights, and what the vehicle models ask of them.
The friction ellipse
The plainest statement of the trade is that the patch can carry so much force and no more. With the drive force and the side force measured against the peak of each:
- the peaks of the pure-slip curves over the load, as the app reads them
- the load, here the template tyre's nominal load
A simple tyre in the app couples its two forces by exactly this rule. It works out each force from its own slip as if the other were zero, and when the pair lands outside the ellipse it scales both back onto it:
- the pure-slip forces at the tyre's slip ratio and slip angle
Fig. 1 shows something else: the template's Magic Formula tyre, at every combination of slip angle and slip ratio. Each solid line holds one slip angle and sweeps the slip ratio from braking to driving; the dashed ellipse runs through the two peaks.
The Magic Formula's weights
The Magic Formula keeps the pure-slip curves and multiplies each by a weight: 1 when the other slip is zero, falling as it grows. Each weight is itself a short formula, the cosine of an arctangent:
- the file's combined-slip coefficients
- the weights' shape factors, and : 1 for this tyre
- a side force the drive force itself makes, from the coefficients: zero for this tyre
The worked lines are the template's tyre at its nominal load, at 5° of slip angle and a slip ratio of 0.1: it keeps 78 % of its drive force and 77 % of its side force. The full forms add a shift and a curvature inside each arctangent, as the pure-slip formula has, and a camber term in each . All of those are zero on this tyre; pd_mf.m carries them.
and make each weight fall more slowly the more the tyre already slips the other way. A tyre already sliding fore and aft has less of its grip left in reserve, so a little slip angle on top of it costs it less; the same holds the other way round.
Not an ellipse
The weights are fitted to tests with both slips at once, not derived from the ellipse, and nothing makes them agree with it. On the template's tyre they put the envelope's corners outside the ellipse: at 5° and a slip ratio of −0.1 the tyre makes 1.05 times what equation (1) allows. The ellipse is a convenient bound, not a law of the rubber.
What the vehicle models ask
A car in a corner asks a different question from the one the formula answers. It is not "what force at this slip angle and slip ratio", but "holding this much side force, how much brake or drive force is left?" The grip envelope a lap is solved on asks it of every wheel. The app answers it on the tyre itself. At each slip ratio it finds the slip angle that still makes the side force asked, and then takes the largest drive or brake force over the slip ratio. At half its peak side force the template's tyre can still brake with 1444 N, where the ellipse through its peaks would allow 1399 N.
The transient car reads the same coupling from a table per wheel. The optimal lap's reduced car uses a friction ellipse.
Which way the forces point
Forces here are in the app's sense: positive slip angle makes positive side force, and positive slip ratio is driving. On the template's tyre braking and driving cost the same side force, since its weights have no shift and are even in . A file with a shift or an induced side force would make the two sides differ.
What the model assumes
- Steady state: the forces follow the slips at once. The transient car adds a lag on the slip angle (Relaxation length).
- Zero camber and the nominal pressure. and add camber to the weights; the template's tyre has none.
- The weights are only as good as the tests behind them. A tyre fitted from cornering and drive runs alone has no data for them. The app then fills in one measured 10-inch tyre's weights, rounded, and marks the tyre as assuming them, with how much its envelope moves when they move by a quarter.
- No turn slip: the patch is not itself turning about the vertical, which matters for tight turns at walking pace and little else.
In the app
Tyres draws "Friction ellipse (combined slip)" at the analysis load: the tyre's forces over a grid of slip angle and slip ratio, as Fig. 1 does. For a tyre fitted in the app, the Fit tab adds "Fitted data — side force kept while driving or braking" and "Fitted data — combined-slip envelope, per unit load", the weights over the rig data they came from.
Laptime › Replay draws, under "Friction circles and slip curves", each tyre's own combined-slip edge at its load at that moment, the boundary of Fig. 3, and the force it is making. A simple tyre's edge is its ellipse. The tyre capacity ring fills against the same edge, so a wheel at its limit sits on its line.
Check it yourself
The script works equations (3) and (4) at three slip angles and four slip ratios, with every shift and curvature the file carries, and compares the forces with the app's. It also prints how much of the friction ellipse each point uses. Paste your own file's coefficients into example_tyre.m to read your tyre.
>> combined_slip The weights at 950 N: what is left of each pure-slip force. alpha \ kappa -0.10 -0.05 0.05 0.10 G_xa 2 deg 0.952 0.927 0.927 0.952 G_xa 5 deg 0.780 0.702 0.702 0.780 G_xa 8 deg 0.615 0.524 0.524 0.615 G_yk 2 deg 0.670 0.875 0.875 0.670 G_yk 5 deg 0.770 0.924 0.924 0.770 G_yk 8 deg 0.852 0.956 0.956 0.852 Share of the friction ellipse used, sqrt((Fx/mu_x Fz)^2 + (Fy/mu_y Fz)^2): 2 deg 1.004 0.836 0.836 1.004 5 deg 1.052 1.010 1.010 1.052 8 deg 1.048 1.037 1.037 1.048 Quantity This script PaceDynamics Diff ----------------------------------------------------------------------------- F_x at 2 deg, kappa -0.10 [N] -1529.09 -1529.09 0% F_x at 2 deg, kappa -0.05 [N] -1150.84 -1150.84 0% F_x at 2 deg, kappa 0.05 [N] 1150.84 1150.84 0% F_x at 2 deg, kappa 0.10 [N] 1529.09 1529.09 0% F_x at 5 deg, kappa -0.10 [N] -1252.65 -1252.65 1.8e-14% F_x at 5 deg, kappa -0.05 [N] -871.815 -871.815 1.3e-14% F_x at 5 deg, kappa 0.05 [N] 871.815 871.815 1.3e-14% F_x at 5 deg, kappa 0.10 [N] 1252.65 1252.65 1.8e-14% F_x at 8 deg, kappa -0.10 [N] -986.975 -986.975 0% F_x at 8 deg, kappa -0.05 [N] -651.375 -651.375 0% F_x at 8 deg, kappa 0.05 [N] 651.375 651.375 0% F_x at 8 deg, kappa 0.10 [N] 986.975 986.975 0% F_y at 2 deg, kappa -0.10 [N] 572.866 572.866 0% F_y at 2 deg, kappa -0.05 [N] 747.667 747.667 3e-14% F_y at 2 deg, kappa 0.05 [N] 747.667 747.667 3e-14% F_y at 2 deg, kappa 0.10 [N] 572.866 572.866 0% F_y at 5 deg, kappa -0.10 [N] 1216.41 1216.41 1.9e-14% F_y at 5 deg, kappa -0.05 [N] 1459.5 1459.5 1.6e-14% F_y at 5 deg, kappa 0.05 [N] 1459.5 1459.5 1.6e-14% F_y at 5 deg, kappa 0.10 [N] 1216.41 1216.41 1.9e-14% F_y at 8 deg, kappa -0.10 [N] 1456.57 1456.57 0% F_y at 8 deg, kappa -0.05 [N] 1634.45 1634.45 0% F_y at 8 deg, kappa 0.05 [N] 1634.45 1634.45 0% F_y at 8 deg, kappa 0.10 [N] 1456.57 1456.57 0% F_x0 at kappa -0.10 [N] -1605.88 -1605.88 0% F_x0 at kappa -0.05 [N] -1242.03 -1242.03 0% F_x0 at kappa 0.05 [N] 1242.03 1242.03 0% F_x0 at kappa 0.10 [N] 1605.88 1605.88 0% F_y0 at 2 deg [N] 854.523 854.523 2.7e-14% F_y0 at 5 deg [N] 1579.84 1579.84 1.4e-14% F_y0 at 8 deg [N] 1709.98 1709.98 0% mu_x, peak drive force / load [-] 1.69998 1.69998 0% mu_y, peak side force / load [-] 1.79998 1.79998 0% All 33 quantities agree with PaceDynamics (largest difference 3e-14 %).
The script
%% Combined slip: a tyre slipping both ways at once % % Companion to the documentation page "Combined slip". Runs unchanged in GNU Octave % (7 or later) and MATLAB. Edit the tyre in example_tyre.m and run: % % >> combined_slip % % A tyre asked for drive or brake force while it corners gives up some of its side % force, and the other way round. The Magic Formula writes that as two weights on the % pure-slip forces, each a cosine of an arctangent: % % F_x = G_xa F_x0(kappa), G_xa = cos( C_xa atan(B_xa alpha) ) % F_y = G_yk F_y0(alpha) + S_Vyk, G_yk = cos( C_yk atan(B_yk kappa) ) % % B_xa = r_Bx1 cos( atan(r_Bx2 kappa) ), B_yk = r_By1 cos( atan(r_By2 alpha) ) % % shown here without the shifts and curvatures, which are zero on the template's tyre % (pd_mf.m carries them all). Each weight is 1 at pure slip and falls as the other slip % grows; r_Bx2 and r_By2 make it fall more slowly the harder the tyre already slips. % % Reference: H. B. Pacejka, Tyre and Vehicle Dynamics, 3rd ed. (Butterworth-Heinemann, % 2012), ch. 4.3.2. % % Part of the PaceDynamics documentation, https://pacedyn.dev/docs % SPDX-License-Identifier: MIT [t, app] = example_tyre(); C = app.combined; deg = pi / 180; % Which way the file's side force points, as the app finds it: by its slope across % +-2 deg at the nominal load. The app turns the side force round when it is negative. up = pd_mf(t, t.FNOMIN, 2 * deg, 0); dn = pd_mf(t, t.FNOMIN, -2 * deg, 0); sign_fy = 2 * ((up.Fy0 - dn.Fy0) >= 0) - 1; %% The forces at each slip angle (rows) and slip ratio (columns) [K, A] = meshgrid(C.kappa, C.alphaDeg * deg); f = pd_mf(t, C.load, A, K); Fx = f.Fx; Fy = sign_fy * f.Fy; px = pd_mf(t, C.load, 0 * C.kappa, C.kappa); % pure slip ratio py = pd_mf(t, C.load, C.alphaDeg * deg, 0 * C.alphaDeg); % pure slip angle fx0 = px.Fx0; fy0 = sign_fy * py.Fy0; % The friction coefficients, as the app reads them: the peak of each pure-slip curve. Fy_at = @(a) getfield(pd_mf(t, C.load, a * deg, 0), 'Fy0'); Fx_at = @(k) getfield(pd_mf(t, C.load, 0, k), 'Fx0'); mu_y = pd_peak(Fy_at, 45, 1) / max(1, C.load); mu_x = pd_peak(Fx_at, 0.6, 0.02) / max(1, C.load); fprintf('\nThe weights at %g N: what is left of each pure-slip force.\n\n', C.load); fprintf(' %-12s', 'alpha \ kappa'); fprintf('%9.2f', C.kappa); fprintf('\n'); for i = 1:numel(C.alphaDeg) fprintf(' G_xa %4g deg ', C.alphaDeg(i)); fprintf('%9.3f', f.Gxa(i, :)); fprintf('\n'); end for i = 1:numel(C.alphaDeg) fprintf(' G_yk %4g deg ', C.alphaDeg(i)); fprintf('%9.3f', f.Gyk(i, :)); fprintf('\n'); end % Against the friction ellipse through the two peaks: 1 is on it, below 1 inside it. use = sqrt((Fx / (mu_x * C.load)).^2 + (Fy / (mu_y * C.load)).^2); fprintf('\n Share of the friction ellipse used, sqrt((Fx/mu_x Fz)^2 + (Fy/mu_y Fz)^2):\n'); for i = 1:numel(C.alphaDeg) fprintf(' %12g deg ', C.alphaDeg(i)); fprintf('%9.3f', use(i, :)); fprintf('\n'); end %% Against the app for i = 1:numel(C.alphaDeg) for j = 1:numel(C.kappa) pd_compare(sprintf('F_x at %g deg, kappa %5.2f [N]', C.alphaDeg(i), C.kappa(j)), Fx(i, j), C.fx(i, j)); end end for i = 1:numel(C.alphaDeg) for j = 1:numel(C.kappa) pd_compare(sprintf('F_y at %g deg, kappa %5.2f [N]', C.alphaDeg(i), C.kappa(j)), Fy(i, j), C.fy(i, j)); end end for j = 1:numel(C.kappa) pd_compare(sprintf('F_x0 at kappa %5.2f [N]', C.kappa(j)), fx0(j), C.fx0(j)); end for i = 1:numel(C.alphaDeg) pd_compare(sprintf('F_y0 at %g deg [N]', C.alphaDeg(i)), fy0(i), C.fy0(i)); end pd_compare('mu_x, peak drive force / load [-]', mu_x, C.muX); pd_compare('mu_y, peak side force / load [-]', mu_y, C.muY); pd_compare();
Download: combined_slip.m · example_tyre.m · pd_mf.m · pd_peak.m · pd_compare.m. The scripts are MIT licensed.
Further reading
- H. B. Pacejka, Tyre and Vehicle Dynamics, 3rd ed. (Butterworth-Heinemann, 2012), ch. 4.3.2, on the combined-slip weighting functions.
- W. F. Milliken and D. L. Milliken, Race Car Vehicle Dynamics (SAE, 1995), ch. 2, on the friction circle.