clc;
clear;
close all;
%% ============================================================
%% VEHICLE PARAMETERS
%% ============================================================
g = 9.81;
vehicleMass = 250;
frontTrack = 1.25; % Front Track Width (m)
rearTrack = 1.30; % Rear Track Width (m)
wheelbase = 1.55; % Wheelbase (m)
cgHeight = 0.29;
loadedTireRadius = 0.23;
frontDistribution = 4/9;
rearDistribution = 5/9;
lateralG = 1.44;
longitudinalG = 1.00;
%% ============================================================
%% WEIGHT TRANSFER
%% ============================================================
WTlong = vehicleMass * longitudinalG * g * cgHeight / wheelbase;
WTlatFront = vehicleMass * lateralG * g * cgHeight / frontTrack;
WTlatRear = vehicleMass * lateralG * g * cgHeight / rearTrack;
%% ============================================================
%% STATIC AXLE LOADS
%% ============================================================
FrontStatic = vehicleMass * g * frontDistribution;
RearStatic = vehicleMass * g * rearDistribution;
%% ============================================================
%% STATIC WHEEL LOADS
%% ============================================================
FrontWheelStatic = FrontStatic / 2;
RearWheelStatic = RearStatic / 2;
%% ============================================================
%% DYNAMIC WHEEL LOADS
%% ============================================================
FzFront = FrontWheelStatic + WTlatFront/2 + WTlong/2;
FzRear = RearWheelStatic + WTlatRear/2 - WTlong/2;
%% ============================================================
%% TIRE FORCES
%% ============================================================
FxFront = vehicleMass * longitudinalG * g * (FzFront/(vehicleMass*g));
FyFront = vehicleMass * lateralG * g * (FzFront/(vehicleMass*g));
FxRear = vehicleMass * longitudinalG * g * (FzRear/(vehicleMass*g));
FyRear = vehicleMass * lateralG * g * (FzRear/(vehicleMass*g));
%% ============================================================
%% UNIT CONVERSION
%% ============================================================
mm = 1/1000;
%% ============================================================
%% FRONT LEFT GEOMETRY
%% ============================================================
FL.UF = [-100 245 236.141]*mm;
FL.UR = [ 100 245 236.141]*mm;
FL.LF = [-100 245 120.676]*mm;
FL.LR = [ 100 245 120.676]*mm;
FL.UBJ = [6.722 544.524 308.079]*mm;
FL.LBJ = [-6.712 575.284 151.640]*mm;
FL.CP = [0 624.937 0]*mm;
%% ============================================================
%% REAR LEFT GEOMETRY
%% ============================================================
RL.UF = [1250 275 238.607]*mm;
RL.UR = [1450 275 238.607]*mm;
RL.LF = [1250 275 123.189]*mm;
RL.LR = [1450 275 123.189]*mm;
RL.UBJ = [1565.666 589.212 308.261]*mm;
RL.LBJ = [1534.334 594.796 151.459]*mm;
RL.CP = [1550 650 0]*mm;
Corners = {FL,RL};
CornerNames = {
'Front Left'
'Rear Left'
};
%% ============================================================
%% UNIT VECTOR FUNCTION
%% ============================================================
unit = @(A,B) (B-A)/norm(B-A);
Results = struct();
%% ============================================================
%% MAIN ANALYSIS LOOP
%% ============================================================
for k = 1:2
G = Corners{k};
%% --------------------------------------------------------
%% UNIT VECTORS
%% --------------------------------------------------------
u1 = unit(G.UF ,G.UBJ);
u2 = unit(G.UR ,G.UBJ);
u3 = unit(G.LF ,G.LBJ);
u4 = unit(G.LR ,G.LBJ);
%% --------------------------------------------------------
%% POSITION VECTORS
%% Moment arms measured from the contact patch
%% --------------------------------------------------------
r1 = G.UBJ - G.CP;
r2 = G.UBJ - G.CP;
r3 = G.LBJ - G.CP;
r4 = G.LBJ - G.CP;
%% --------------------------------------------------------
%% MOMENT CONTRIBUTIONS
%% --------------------------------------------------------
m1 = cross(r1,u1);
m2 = cross(r2,u2);
m3 = cross(r3,u3);
m4 = cross(r4,u4);
%% --------------------------------------------------------
%% EQUILIBRIUM MATRIX
%%
%% First 3 rows -> Force equilibrium
%% Last 3 rows -> Moment equilibrium
%% --------------------------------------------------------
A = [
u1(1) u2(1) u3(1) u4(1)
u1(2) u2(2) u3(2) u4(2)
u1(3) u2(3) u3(3) u4(3)
m1(1) m2(1) m3(1) m4(1)
m1(2) m2(2) m3(2) m4(2)
m1(3) m2(3) m3(3) m4(3)
];
%% --------------------------------------------------------
%% APPLIED LOADS
%% --------------------------------------------------------
if k == 1
Fx = FxFront;
Fy = FyFront;
Fz = FzFront;
else
Fx = FxRear;
Fy = FyRear;
Fz = FzRear;
end
Force = [
Fx
Fy
Fz
];
%% --------------------------------------------------------
%% APPLIED MOMENT
%% --------------------------------------------------------
Moment = cross(G.CP,Force);
%% Rear axle drive torque
if k==2
Moment = Moment + [
0
Fx*loadedTireRadius
0
];
end
%% --------------------------------------------------------
%% LOAD VECTOR
%% --------------------------------------------------------
B = [
-Force
-Moment
];
%% --------------------------------------------------------
%% SAVE MATRICES
%% --------------------------------------------------------
Results(k).A = A;
Results(k).B = B;
%% --------------------------------------------------------
%% RANK CHECK
%% --------------------------------------------------------
Results(k).Rank = rank(A);
%% --------------------------------------------------------
%% LEAST SQUARES SOLUTION
%% --------------------------------------------------------
F = A\B;
Results(k).Forces = F;
%% --------------------------------------------------------
%% RESIDUAL
%% --------------------------------------------------------
Residual = A*F-B;
Results(k).Residual = Residual;
Results(k).ResidualNorm = norm(Residual);
end
%% ============================================================
%% RESULTS
%% ============================================================
fprintf('\n');
fprintf('=============================================================\n');
fprintf(' FORMULA STUDENT WISHBONE FORCE ANALYSIS\n');
fprintf('=============================================================\n');
for k = 1:2
F = Results(k).Forces;
fprintf('\n');
fprintf('-------------------------------------------------------------\n');
fprintf('%s\n', CornerNames{k});
fprintf('-------------------------------------------------------------\n');
if k==1
fprintf('Applied Loads\n');
fprintf('Fx = %10.3f N\n',FxFront);
fprintf('Fy = %10.3f N\n',FyFront);
fprintf('Fz = %10.3f N\n',FzFront);
else
fprintf('Applied Loads\n');
fprintf('Fx = %10.3f N\n',FxRear);
fprintf('Fy = %10.3f N\n',FyRear);
fprintf('Fz = %10.3f N\n',FzRear);
end
fprintf('\n');
fprintf('Wishbone Tube Forces\n');
fprintf('-----------------------------------------\n');
fprintf('Upper Front Tube : %12.3f N\n',F(1));
fprintf('Upper Rear Tube : %12.3f N\n',F(2));
fprintf('Lower Front Tube : %12.3f N\n',F(3));
fprintf('Lower Rear Tube : %12.3f N\n',F(4));
fprintf('\n');
fprintf('Rank(A) = %d\n',Results(k).Rank);
fprintf('Residual Norm = %.8f\n',Results(k).ResidualNorm);
fprintf('\nResidual Vector\n');
disp(Results(k).Residual)
end
fprintf('\n');
fprintf('=============================================================\n');
fprintf('SUMMARY\n');
fprintf('=============================================================\n');
fprintf('\nFRONT LEFT\n');
fprintf('Upper Front : %10.3f N\n',Results(1).Forces(1));
fprintf('Upper Rear : %10.3f N\n',Results(1).Forces(2));
fprintf('Lower Front : %10.3f N\n',Results(1).Forces(3));
fprintf('Lower Rear : %10.3f N\n',Results(1).Forces(4));
fprintf('\nREAR LEFT\n');
fprintf('Upper Front : %10.3f N\n',Results(2).Forces(1));
fprintf('Upper Rear : %10.3f N\n',Results(2).Forces(2));
fprintf('Lower Front : %10.3f N\n',Results(2).Forces(3));
fprintf('Lower Rear : %10.3f N\n',Results(2).Forces(4));
To embed this project on your website, copy the following code and paste it into your website's HTML: