Camber Gain Optimization for Double Wishbone Suspension - Parker Randall

Camber Gain Optimization for Double Wishbone Suspension - Parker Randall

In racing, suspension design governs how fast a car is capable of going around a corner. One parameter of high importance in suspension design is camber gain. By treating double wishbone suspension as a 4-bar mechanism, position analysis can be done to measure camber gain. By iterating through many different sets of geometries, the geometries that yield the ideal camber gain can be found. I set out to write a MATLAB program that, given a few vehicle parameters, would find the ideal suspension geometry for UT's Formula SAE car.



Background

Suspension engineers are interested in camber because it governs how much of the tire is in contact with the ground at any given moment. Camber is the angle a car's wheel has with a line normal to the ground (figure below is from the website "come and drive it" (https://www.comeanddriveit.com/suspension/camber-caster-toe)). 



In double wishbone suspension, the camber angle of each wheel changes as the car rolls (when the car goes around a corner). It is undesirable to have camber changing too much under roll, but it is necessary to have a little bit of camber change under roll. Since tires are highly compliant, the outside tire will deform in roll and reduce the amount of surface area of the tire that is in contact with the ground, which will reduce grip. Having a small amount of camber angle can prevent this reduction of surface area and help maintain grip. 

This .gif shows how camber angle changes when a car undergoes roll: https://j.gifs.com/r8lXpp.gif

The camber gain target for a Formula SAE car is 0.6-0.8 deg camber/deg body roll. With this target, kinematic analysis of the suspension can be done to find a suitable geometry that yields this camber gain.


Kinematic Analysis

The links of double wishbone suspension are simply a 4-bar pin linkage. The kinematic diagram, vector loop and position analysis for the suspension is shown below.


This vector loop was solved for the length and angle of link 1 to complete each possible suspension geometry for the car.

With a kinematic diagram of the suspension, I then set out to simulate the car rolling by rotating the links, and then use position analysis to find the camber change, which would be Theta3 final - Theta3 initial.

However, I found that this diagram has limitations. It can only represent the car in bump/rebound (vertical wheel motion with respect to the car). A simple example of bump would be driving over a speed bump, and rebound is the opposite of bump. Bump can be shown here by moving the outboard point on the upright vertically.

To simulate roll, link 1 would have to be able to rotate, which would make the linkage impossible, as no link would be grounded. This meant that a new diagram would have to be made for the suspension, if I wished to determine the effect of roll angle on camber. To simulate roll the car must be viewed on both sides, as shown below.

With this diagram, how the body achieves roll can be seen clearly. It rolls about a point called the 'roll center' which is located by drawing lines through the two control arms, finding their intersection, then drawing a line from this intersection to the center of the tire's contact patch, and where this line intersects the central vertical axis of the car is the roll center.

Now that how the body rolls is known, only one side of the car must be examined to determine camber gain. The following kinematic diagram, vector loop and position analysis will be used to determine camber gain.

By drawing a "pseudo"-link 1 that connects the roll center to the center of the tire's contact patch, this new diagram can capture the body roll and the camber change, simultaneously. Camber gain can be found by rotating link 2 by the expected roll angle and finding the new angle of link 4. 

This diagram also has limitations, though. For this model to work, two assumptions about the suspension must be made:

  1. The roll center does not move while the body rolls. This is somewhat true, as roll center will only migrate by a few thousandths of an inch under roll.
  2. The half track width, or the distance between the center line of the car and the center line of the tire remains constant under roll. This is also somewhat true, as the change in track width is often on the order of 10^-2 inches.

With these kinematic models, a MATLAB script can be written to plug in all possible combinations of suspension geometries, measure the camber gain for each of them, and output the geometries that achieved the camber gain target.


MATLAB Method

To optimize camber gain, the following process was implemented into MATLAB.

  1. Input desired range of link lengths and angles for the upper control arm, upright, and lower control arm
  2. Generate all combinations of possible geometries

    For each combination:
  3. Use first position analysis to find length and angle of link 1 to complete the set of geometry.
  4. Find roll center: 
    1. Draw lines through the control arms
    2. Find the intersection of these lines
    3. Draw a line between this intersection point and the center of the tire's contact patch
    4. Find the intersection point of this line and the central vertical axis 
  5. Find R1
  6. Find R4
  7. Find R2
  8. Simulate roll by adding the roll angle to the angle of link 2
  9. Use second position analysis to find new angle of link 4
  10. Camber Gain = final theta4 - initial theta4

  11. Parse through all combinations and remove any combination that is not in the desired camber gain range of 0.6-0.8


Results

The following table is 30 sets of geometries out of 24,300 sets that yielded the target camber gain.



Based on the MATLAB results, a SolidWorks sketch was made using one of the generated geometries to better understand the results. To transfer the results from MATLAB to SolidWorks, the values of a single row in matrix D9 can be transcribed into the smart dimensions in the following image.


The following image shows one of the generated geometries that yielded a camber gain value in the desired range. This specific geometry had 0.7266 deg camber / deg body roll.


Model & Demonstration

To demonstrate the mechanism, a SolidWorks model was created based on the second kinematic diagram mentioned above. The linkage is grounded at the roll center and at the center of the tire's contact patch. 



Here is the fully built 3/10 scale model of the mechanism.

To demonstrate motion, one of the links must be connected, as the assumptions made for the kinematic analysis severely limit the motion of the mechanism.


MATLAB Code

% Optimization of Camber Gain for Double Wishbone Suspension
% Parker Randall
% ME 350R - Robot Mechanism Design - Dr. Ashish D. Deshpande

%%%%%%%%%%%%%%%%%%%%%%%%%%%% ALL UNITS IN IPS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%


clear; % clear workspace
close all; % close all figure windows


% Vehicle Paramters
RollGradient = 0.9; % Roll gradient (deg roll/lateral g)
LateralAccel = 1; % Lateral acceleration (g)
track = 50.5; % Track width
clearance = 4.4; % Ground clearance
bulkhead = 12; % Lower frame width
r = [bulkhead/2, clearance]; % Position vector of local coordinate system
P = [track/2, 0]; % Coordinates of tire contact point in global coordinate system


% Domain of possible link lengths and angles
a = 11.9:0.1:12.1; % Upper control arm length range %11.9-.1-12.1
b = 6.5:0.1:7; % Upright length range % 6.5-7
c = 16.5:0.1:17; % Lower control arm length range % 16.9-.1-17
t2 = 90:0.5:102; % Angle of upper control arm range % 98-.5-102
t3 = 2.9; % Angle of upright (fixed kingpin inclination) % 182.9
t4 = 90.1:0.5:94.1; % Angle of lower control arm range % 90-.5-94
d = zeros(1,1); t1 = zeros(1,1); % Initialize range of ground link parameters


% Matrix of all possible combinations of lengths and angles ... form: G=[a,b,c,d,t1,t2,t3,t4]
Q = combvec(a,b,c,d,t1,t2,t3,t4,0,0,0,0);
G = transpose(Q);


% Solve for t1 and d for all combinations
Gi = POSITION(G);


% Find roll center for all combinations
Gr = ROLLCENTER(Gi, P, r);


% Find camber gain for all combinations
D9 = CAMBER(Gr, P, r, RollGradient, LateralAccel);


% Parse through camber gain values
X = ~((D9(:,12) >= 0.600 & D9(:,12) <= 0.800) | (D9(:,12) <= -0.600 & D9(:,12) >= -0.800));
D9(X, :)= [];


function [Gi] = POSITION(G)

% Find t1 and d for all combinations
for i = 1:size(G,1)

G(i,5) = atand((G(i,1)*cosd(G(i,6))+G(i,2)*cosd(G(i,7))-G(i,3)*cosd(G(i,8)))/(G(i,1)*sind(G(i,6))+G(i,2)*sind(G(i,7))-G(i,3)*sind(G(i,8)))); % Find t1
G(i,4) = (-1)*(G(i,1)*sind(G(i,6))+G(i,2)*sind(G(i,7))-G(i,3)*sind(G(i,8)))/(cosd(G(i,5))); % Find d

end

Gi = G;

end


function [Gr] = ROLLCENTER(Gi, P, r)

Gr = Gi;

for i = 1 : size(Gi,1)

% Local coordinate xy-plane
O4 = [0 0]; % Local System Origion
R4 = [Gi(i,3)*cosd(Gi(i,8)), Gi(i,3)*sind(Gi(i,8))]; % Vector R4
B = O4 + R4; % Coordinates of point B in local

R1 = [Gi(i,4)*cosd(Gi(i,5)), Gi(i,4)*sind(Gi(i,5))]; % Vector R1
O2 = O4 - R1; % Coordinates of point O2 in local
R2 = [Gi(i,1)*cosd(Gi(i,6)), Gi(i,1)*sind(Gi(i,6))]; % Vector R2
A = O2 + R2; % Coordinates of point A in local
Gr(i,10) = A(1); % x-coordinate of point A into Gr
Gr(i,11) = A(2); % y-coordinate of point A into Gr

% Lower control arm line
LCA = [( B(2) - O4(2) ) / ( B(1) - O4(1) ), 0]; % Slope
LCA(2) = O4(2) - LCA(1) * O4(1); % Intercept

% Upper control arm line
UCA = [( A(2) - O2(2) ) / ( A(1) - O2(1) ), 0]; % Slope
UCA(2) = O2(2) - UCA(1) * O2(1); % Intercept

% Instant center location
Z = [-LCA(1), 1, LCA(2);
-UCA(1), 1, UCA(2)];
Instant = rref(Z); % Find intersection of UCA and LCA lines
I = [Instant(1,3), Instant(2,3)]; % Coordinates of Instant Center in local

% Line connecting instant center and tire contact point
p = GLOBALtoLOCAL1(P,r); % Coordinates of point p in local
Ip = [( I(2) - p(2) ) / ( I(1) - p(1) ), 0]; % slope
Ip(2) = p(2) - Ip(1) * p(1); % intercept

% Center line
ctr = [0, -r(1)];

% Roll center location in local
Z = [-Ip(1), 1, Ip(2);
-ctr(1), 1, ctr(2)];
rollcenter = rref(Z); % Find intersection of UCA and LCA lines
rc = [rollcenter(1,3), rollcenter(2,3)]; % Coordinates of Roll center in local

% Roll center location in global
RC = LOCAL1toGLOBAL(rc,r);

% Add roll center height to output matrix
Gr(i,9) = RC(2);

end

end

function [loc] = GLOBALtoLOCAL1 (glob,r)

loc = [glob(2) + r(2), glob(1) - r(1)];

end

function [glob] = LOCAL1toGLOBAL (loc,r)

glob = [loc(2) + r(1), - loc(1) + r(2)];

end

function [D9] = CAMBER (Gr,P, r, RollGradient, LateralAccel)

D9 = Gr;

RollAngle = RollGradient * LateralAccel; % Expected roll angle

% Convert angles to local2 coordinate system
for i = 1 : size(D9,1)

D9(i,5) = D9(i,5) + 90;
D9(i,6) = D9(i,6) - 90;
D9(i,7) = D9(i,7) + 90;
D9(i,8) = D9(i,8) - 90;

end

% Convert point A to global then to local2
for i = 1 : size(D9,1)

A1 = [D9(i,10), D9(i,11)]; % Coordinates of A in local1
Aglob = LOCAL1toGLOBAL(A1,r); % Coordinates of A in global
A = GLOBALtoLOCAL2(Aglob,D9,i); % Coordinates of A in local2

end

for i = 1 : size(D9,1)

% Find R1
O2 = [0,0]; % Local2 system origin
O4 = [P(1), -D9(i,9)]; % Coordinates of O4 in local2
R1 = [sqrt((O4(1)-O2(1))^2+(O4(2)-O2(2))^2), atand((O4(2)-O2(2))/(O4(1)-O2(1)))]; % Vector R1

% Find R4
R4 = [sqrt((A(1)-O4(1))^2+(A(2)-O4(2))^2), atand((A(2)-O4(2))/(A(1)-O4(1))) + 90]; % Vector R4

% Find point K
K = [A(1) - D9(2) * cosd(D9(6)), A(2) - D9(2) * sind(D9(6))];

% Find R2
R2 = [sqrt((K(1)-O2(1))^2+(K(2)-O2(2))^2), atand((K(2)-O2(2))/(K(1)-O2(1)))]; % Vector R2

% Roll car and find camber change
theta4 = POSITION2(D9, R1, R4, R2, RollAngle); % New angle of R4
D9(i,12) = (theta4 - R4(2)) / RollAngle; % Camber gain

end

end


function [loc] = GLOBALtoLOCAL2 (glob,D9,i)

loc = [glob(1), glob(2)-D9(i,9)];

end

function [theta4] = POSITION2(D9, R1, R4, R2, RollAngle)

% Link lengths
a = R2(1);
b = D9(2);
c = R4(1);
d = R1(1);
theta2 = R2(2) + RollAngle;

% Link Ratios
K1 = d / a;
K2 = d / c;
K3 = (a^2 - b^2 + c^2 + d^2)/(2 * a * c);

% Constants
A = cosd(theta2) - K1 - (K2 * cosd(theta2)) + K3;
B = -2 * sind(theta2);
C = K1 - ((K2 + 1) * cosd(theta2)) + K3;

% Theta 4
theta4 = 2 * atand((-B + (B^2 - (4 * A * C))^(1/2))/(2 * A)) + 180;

end