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));

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: