Initial commit
This commit is contained in:
+99
@@ -0,0 +1,99 @@
|
||||
clc
|
||||
clear
|
||||
fprintf('Calcolo degli angoli del cinematismo: Quadrilatero Articolato \n');
|
||||
|
||||
% dimensione vettori del quadrilatero
|
||||
z1=248.56; z2=338.66; z3=282.74; z4=198.8;
|
||||
|
||||
% angoli statici del quadrilatero (theta3, theta4)
|
||||
t3=271; t4=181;
|
||||
|
||||
% range angoli theta2
|
||||
initial_angle = 45;
|
||||
final_angle= 90;
|
||||
|
||||
% Analisi posizione
|
||||
for j=1:(final_angle - initial_angle)
|
||||
|
||||
teta2rad=deg2rad(initial_angle+j);
|
||||
x0=[deg2rad(t3); deg2rad(t4)];
|
||||
kmax=1000; tol=1e-2;
|
||||
|
||||
f1=@(x) z2*cos(teta2rad)+z3.*cos(x(1))+z4.*cos(x(2))-z1;
|
||||
f2=@(x) z2*sin(teta2rad)+z3.*sin(x(1))+z4.*sin(x(2));
|
||||
|
||||
df11=@(x) -z3.*sin(x(1));
|
||||
df12=@(x) -z4.*sin(x(2));
|
||||
df21=@(x) z3.*cos(x(1));
|
||||
df22=@(x) z4.*cos(x(2));
|
||||
|
||||
[x,k,info ] = newtonsis2(f1,f2,df11,df12,df21,df22,kmax,tol,x0);
|
||||
xrad=rad2deg(x);
|
||||
|
||||
if info==0
|
||||
fprintf(' θ2 = '); disp(rad2deg(teta2rad));
|
||||
fprintf(' θ3 calcolato = '); disp(xrad(1));
|
||||
fprintf(' θ4 calcolato = '); disp(xrad(2));
|
||||
fprintf(' Numero di iterazioni '); disp(k);
|
||||
fprintf(' ------------------------------- \n');
|
||||
teta2(j)=rad2deg(teta2rad);
|
||||
teta3(j)=xrad(1);
|
||||
teta4(j)=xrad(2);
|
||||
else
|
||||
fprintf(' Numero massimo iterazioni raggiunto ');
|
||||
end
|
||||
|
||||
t=deg2rad(110);
|
||||
a=[0; z2*cos(teta2rad+t); z2*cos(teta2rad+t)+z3*cos(x(1)+t); z1*cos(t)];
|
||||
b=[0; z2*sin(teta2rad+t); z2*sin(teta2rad+t)+z3*sin(x(1)+t); z1*sin(t)];
|
||||
|
||||
|
||||
plot(a,b,'r','linewidth',1)
|
||||
grid on
|
||||
grid minor
|
||||
axis([-400 200 -200 400])
|
||||
hold on
|
||||
plot(a,b,'o','color', 'r','markersize',8)
|
||||
xlabel('x [mm]')
|
||||
ylabel('y [mm]')
|
||||
title("Kinematic analysis of the front double wishbone position")
|
||||
|
||||
end
|
||||
|
||||
figure(2)
|
||||
plot (teta2,teta3);
|
||||
grid on
|
||||
grid minor
|
||||
hold on
|
||||
plot (teta2,teta4);
|
||||
xlabel('θ2 [°]')
|
||||
ylabel('θ3 - θ4 [°]')
|
||||
legend("θ3","θ4")
|
||||
hold off
|
||||
title("θ3 and θ4 variations respective to θ2")
|
||||
|
||||
% Analisi velocita
|
||||
|
||||
r=input('Digita 1 per il calcolo della velocità, 2 per uscire: ');
|
||||
if r==1
|
||||
fprintf('Calcolo delle velocità angolari del cinematismo: Quadrilatero Articolato \n');
|
||||
a1=input('Inserisci il valore di θ2 di partenza: ');
|
||||
a2=input('inserisci il valore θ2 finale: ');
|
||||
t=input('inserisci Δt in secondi: ');
|
||||
w2=deg2rad((a2-a1)/t);
|
||||
|
||||
%cerca la posizione del valore messo nell'input a1 nell'array teta2
|
||||
for i=1:45
|
||||
if a1==teta2(i)
|
||||
i1=i;
|
||||
end
|
||||
end
|
||||
|
||||
dftx=[-z2*sin(deg2rad(teta2(i1))); z2*cos(deg2rad(teta2(i1)))];
|
||||
dfty=[-z3*sin(deg2rad(teta3(i1))) -z4*sin(deg2rad(teta4(i1))); z3*cos(deg2rad(teta3(i1))) z4*cos(deg2rad(teta4(i1)))];
|
||||
w=-inv(dfty)*(dftx*w2);
|
||||
fprintf('Velocità angolare [rad/s] w2='); disp(w2);
|
||||
fprintf('Velocità angolare [rad/s] w3='); disp(w(1));
|
||||
fprintf('Velocità angolare [rad/s] w4='); disp(w(2));
|
||||
|
||||
end
|
||||
Executable
+16
@@ -0,0 +1,16 @@
|
||||
function[xn,k,info,Jk] = newtonsis2(f1 ,f2 ,df11 ,df12 ,df21 ,df22 ,kmax ,tol ,xc)
|
||||
info=0;
|
||||
F0(1)= f1(xc) ; F0(2)= f2(xc);
|
||||
Fk=F0 ;
|
||||
|
||||
for k=1:kmax
|
||||
Jk(1,1)= df11(xc) ; Jk(1,2)= df12(xc) ; Jk(2,1)= df21(xc) ; Jk(2,2)= df22(xc);
|
||||
xn=xc-(inv(Jk))*Fk' ;
|
||||
Fk(1)= f1(xn) ; Fk(2)= f2 (xn);
|
||||
if norm( xn -xc)< tol && norm(Fk)< tol
|
||||
return
|
||||
end
|
||||
xc=xn;
|
||||
end
|
||||
info=1;
|
||||
end
|
||||
Executable
+213
@@ -0,0 +1,213 @@
|
||||
clear
|
||||
clc
|
||||
|
||||
%% Dati da Lotus Suspension Analysis
|
||||
position = [
|
||||
40.000
|
||||
35.000
|
||||
30.000
|
||||
25.000
|
||||
20.000
|
||||
15.000
|
||||
10.000
|
||||
5.000
|
||||
0.000
|
||||
-5.000
|
||||
-10.000
|
||||
-15.000
|
||||
-20.000
|
||||
-25.000
|
||||
-30.000
|
||||
-35.000
|
||||
-40.000
|
||||
-45.000
|
||||
-50.000
|
||||
-55.000
|
||||
-60.000
|
||||
-65.000
|
||||
];
|
||||
|
||||
tire_forces = [
|
||||
4595.7847
|
||||
4358.7183
|
||||
4123.7476
|
||||
3890.7935
|
||||
3659.7786
|
||||
3430.6235
|
||||
3203.2480
|
||||
2977.5703
|
||||
2753.5076
|
||||
2530.9746
|
||||
2309.8843
|
||||
2090.1472
|
||||
1871.6707
|
||||
1654.3597
|
||||
1438.1155
|
||||
1222.8350
|
||||
1008.4114
|
||||
794.7330
|
||||
581.6828
|
||||
369.1380
|
||||
156.9698
|
||||
-54.9575
|
||||
];
|
||||
|
||||
spring_forces = [
|
||||
6751.6
|
||||
6421.9
|
||||
6092.7
|
||||
5764.0
|
||||
5435.7
|
||||
5107.9
|
||||
4780.5
|
||||
4453.6
|
||||
4127.2
|
||||
3801.1
|
||||
3475.5
|
||||
3150.3
|
||||
2825.5
|
||||
2501.1
|
||||
2177.1
|
||||
1853.4
|
||||
1529.9
|
||||
1206.8
|
||||
883.9
|
||||
561.2
|
||||
238.7
|
||||
-83.6
|
||||
];
|
||||
|
||||
spring_travel = [
|
||||
26.8343
|
||||
23.4638
|
||||
20.0979
|
||||
16.7366
|
||||
13.3800
|
||||
10.0280
|
||||
6.6807
|
||||
3.3381
|
||||
0.0000
|
||||
-3.3337
|
||||
-6.6629
|
||||
-9.9879
|
||||
-13.3089
|
||||
-16.6260
|
||||
-19.9395
|
||||
-23.2495
|
||||
-26.5564
|
||||
-29.8605
|
||||
-33.1620
|
||||
-36.4613
|
||||
-39.7588
|
||||
-43.0549
|
||||
];
|
||||
|
||||
%% Interpolazioni
|
||||
% Curva interpolata per la forza del pneumatico
|
||||
tire_fit_x = min(position):0.1:max(position);
|
||||
tire_fit_y = interp1(position, tire_forces, tire_fit_x, 'spline');
|
||||
|
||||
% Curva interpolata per la forza della molla
|
||||
spring_fit_x = min(position):0.1:max(position);
|
||||
spring_fit_y = interp1(position, spring_forces, spring_fit_x, 'spline');
|
||||
|
||||
%% Grafico della forza verticale sullo pneumatico in funzione dello
|
||||
% spostamento della ruota
|
||||
figure;
|
||||
hold on
|
||||
plot(position, tire_forces, '.', tire_fit_x, tire_fit_y, '-r', 'LineWidth', 1.5);
|
||||
|
||||
% Seleziona i punti sul grafico: 1 = bump 40mm, 17 = rebound 40mm
|
||||
x1 = position(1);
|
||||
x2 = position(17);
|
||||
y1 = tire_forces(1);
|
||||
y2 = tire_forces(17);
|
||||
|
||||
% Calcola la rigidezza a terra (ground stiffness)
|
||||
g_s = (y2 - y1) / (x2 - x1);
|
||||
|
||||
% Traccia la retta blu tra i due punti -40 e 40
|
||||
plot([-40, 40], [y2, y1], 'b--', 'LineWidth', 1);
|
||||
|
||||
% Posizione per il testo della costante della molla
|
||||
text_x = mean([x1, x2]);
|
||||
text_y = mean([y1, y2]);
|
||||
|
||||
% Visualizza il valore della costante della molla
|
||||
text(text_x + 3, text_y + 3, ['k = ', num2str(g_s), ' N/mm'], 'FontSize', 15, 'Color', 'blue', 'VerticalAlignment', 'cap', 'HorizontalAlignment', 'left');
|
||||
|
||||
title('Tire Force relative to wheel position');
|
||||
grid on;
|
||||
grid minor;
|
||||
xlabel('Wheel position [mm]');
|
||||
ylabel('Force [N]');
|
||||
text(position, tire_forces, string(tire_forces), 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right');
|
||||
hold off;
|
||||
|
||||
%% Grafico della forza sulla molla in funzione dello spostamento della ruota
|
||||
figure;
|
||||
plot(position, spring_forces, '.', spring_fit_x, spring_fit_y, 'LineWidth', 1.5);
|
||||
title('Spring Force relative to wheel position');
|
||||
grid on;
|
||||
grid minor;
|
||||
xlabel('Wheel position [mm]');
|
||||
ylabel('Force [N]');
|
||||
text(position, spring_forces, string(spring_forces), 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right');
|
||||
|
||||
%% Grafico della forza sulla molla su forza sulla ruota
|
||||
figure;
|
||||
plot(spring_forces, tire_forces, 'LineWidth', 1.5);
|
||||
title('Spring Force relative to Tire Force');
|
||||
grid on;
|
||||
grid minor;
|
||||
xlabel('Spring Force [N]');
|
||||
ylabel('Tire Force [N]');
|
||||
|
||||
%% Grafico dello spring travel su spring force
|
||||
figure;
|
||||
plot(spring_travel, spring_forces, 'LineWidth', 1.5);
|
||||
hold on;
|
||||
|
||||
% Seleziona due punti sul grafico
|
||||
% 1 = bump 40mm, 9 = condizione statica (auto a terra)
|
||||
x1 = spring_travel(1);
|
||||
x2 = spring_travel(9);
|
||||
y1 = spring_forces(1);
|
||||
y2 = spring_forces(9);
|
||||
|
||||
% Calcola la costante della molla (k)
|
||||
k = (y2 - y1) / (x2 - x1);
|
||||
|
||||
% Posizione per il testo della costante della molla
|
||||
text_x = mean([x1, x2]);
|
||||
text_y = mean([y1, y2]);
|
||||
|
||||
% Visualizza il valore della costante della molla
|
||||
text(text_x+4, text_y+4, ['k = ', num2str(k), ' N/mm'], 'FontSize', 15, 'Color', 'blue', 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'left');
|
||||
|
||||
title('Spring Travel vs Spring Force');
|
||||
xlabel('Spring Travel [mm]');
|
||||
ylabel('Spring Force [N]');
|
||||
grid on;
|
||||
hold off;
|
||||
|
||||
%% Grafico della rigidezza a terra (secante)
|
||||
|
||||
% Calcolo del delta della forza della molla rispetto alla condizione di position = 0
|
||||
delta_spring_forces = tire_forces - tire_forces(9);
|
||||
|
||||
% Calcolo della rigidezza per ogni posizione della ruota
|
||||
stiffness = delta_spring_forces ./ position;
|
||||
|
||||
% Curva interpolata per la rigidezza a terra
|
||||
stiffness_fit_x = min(position):0.1:max(position);
|
||||
stiffness_fit_y = interp1(position, stiffness, stiffness_fit_x, 'spline');
|
||||
|
||||
figure;
|
||||
plot(position, stiffness, '-', stiffness_fit_x, stiffness_fit_y, 'LineWidth', 1.5);
|
||||
text(position, stiffness, string(stiffness), 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'right');
|
||||
grid on;
|
||||
grid minor;
|
||||
title('Vehicle ground stiffness');
|
||||
xlabel('Wheel travel [mm]');
|
||||
ylabel('Stiffness [N/mm^2]');
|
||||
Executable
+50
@@ -0,0 +1,50 @@
|
||||
% Clear workspace and command window
|
||||
clear
|
||||
clc
|
||||
|
||||
%% Trasmissibilita: forze trasmesse al basamento
|
||||
|
||||
ground_stiffness = 44842.2; % rigidezza secante [N/m]
|
||||
|
||||
susp_mass = 291.75; % massa sospesa ant sx [kg]
|
||||
|
||||
wn = sqrt(ground_stiffness/susp_mass);
|
||||
|
||||
a=0.1:0.01:3;
|
||||
w = wn .* a;
|
||||
r2 = w.^2. / wn^2;
|
||||
r = w./wn;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
|
||||
% Range valori zita
|
||||
zita_range = 0.3:0.05:0.4;
|
||||
|
||||
for i = 1:length(zita_range)
|
||||
zita = zita_range(i);
|
||||
|
||||
% equazione trasmissibilita
|
||||
t = sqrt((2 .* zita .* r).^2 + 1) ./ sqrt((1 - r2).^2 + (2 .* zita .* r).^2);
|
||||
|
||||
plot(r2, t, 'LineWidth', 1.5);
|
||||
end
|
||||
|
||||
%% Trova intersezione
|
||||
|
||||
for i = 1:length(t)
|
||||
if t(i) > 0.1 && t(i) < 1
|
||||
intersection_point = r2(i);
|
||||
break;
|
||||
end
|
||||
end
|
||||
|
||||
text(intersection_point + 0.5, 1, ['\omega^2 / \omega_n^2 = ', num2str(intersection_point)], 'VerticalAlignment', 'top', 'HorizontalAlignment', 'left', 'FontSize', 11);
|
||||
text(intersection_point + 0.5, 1, 'τ = 1', 'VerticalAlignment', 'bottom', 'HorizontalAlignment', 'left', 'FontSize', 11);
|
||||
|
||||
%% Plot
|
||||
xlabel('\omega^2 / \omega_n^2');
|
||||
ylabel('τ');
|
||||
title('Transmissibility relative to. \omega^2 / \omega_n^2');
|
||||
grid on;
|
||||
legend(cellstr(num2str(zita_range', 'ζ = %0.2f')));
|
||||
Reference in New Issue
Block a user