Stability of the single-track vehicle


Full-linear vehicle modelling

> restart: libname := libname, "C:/MBSymba": with(MBSymba_r6):
LA:=LinearAlgebra:

> PDEtools[declare]({x(t),y(t),u(t),v(t),psi(t),omega(t),delta(t),Ff(t), Fr(t)},prime=t,quiet);

Definition of small variables

> linear_modeling({v(t),y(t),psi(t),omega(t),delta(t)},{},{Fr(t),Ff(t)});

Warning, Linear Modeling option has been choosen for the following variables:

Definition of the Moving Frame

The forward speed U is assumed constant

> use_moving_frame(U,v(t),0,0,0,omega(t)):

Warning, The base frame <moving_frame> has been selected.

vehicle chassis

define main frame

> TV := moving_frame:

define vehicle body

> vehicle := make_BODY(TV,M,IX,IY,IZ): show(vehicle,'synthetic');

rear tire

> R := make_POINT(TV,-b,0,0): show(R);

rear tire kinematics

> VR:=velocity(R):show(VR);

> lambda[R] := linearize( -arctan( comp_Y(VR,TV)/comp_X(VR,TV) )):

force

> Fr := KLr * lambda[R];
make_VECTOR(TV, 0, Fr ,0):
rear_tire := make_FORCE(%, R, vehicle): show(rear_tire);

front tire

> TF := TV * Translate(a,0,0) * Rotate('Z',delta(t));

contact point

> F := origin(TF): show(F,'synthetic');

front tire kinematics

> VF := project(velocity(F),TF): show(VF);

> lambda[F] := linearize ( -arctan( comp_Y(VF,TF)/comp_X(VF,TF) ) );

force

> Ff := KLf * lambda[F];
make_VECTOR(TF, 0, Ff ,0):
front_tire := make_FORCE(%, F, vehicle): show(front_tire);

Newton-Euler equations

Newton

> eqnsN := newton_equations({vehicle,rear_tire,front_tire}): show(eqnsN);

Euler

> eqnsE := euler_equations({vehicle,rear_tire,front_tire},CoM(vehicle)):
show(eqnsE);

State space formulation

implicit state equations

> lin_eqns := [comp_Y(eqnsN), comp_Z(eqnsE)]: Vector(lin_eqns);

state variables

> xx := [v(t),omega(t)];

system inputs

> uu := [delta(t)];

state space formulation

> AA,BB := state_space(lin_eqns,t,xx,uu);
AA,BB := map(simplify,AA),BB;

> Vector(diff(xx,t)) = AA,Vector(xx) ; BB,Vector(uu);

UnderSteering Vehicle

> interface(displayprecision=2):

define vehicle characteristics

> understeer_vehicle :=[
a=1.3, from Cr to G
b=1.3, from G to Cf
M=1000.,mass
IZ=600,yaw inertia
KLr=24.*5000,rear tire cornering stiffness
KLf=20.*5000 front tire cornering stiffness
];
AN := map(expand,subs(understeer_vehicle,AA));
BN := subs(understeer_vehicle,BB);

Free Stability

> free_stability := speed -> LA[Eigenvalues](subs(U=speed,AN));

> free_stability (10);

> free_stability (30);

> free_stability (50);

Eigenvalues from 1 to 50 m/s

> max_speed := 60; maximum speed

> for i from 1 to max_speed do
ev := free_stability(i):
ev1[i]:=ev[1]: ev2[i]:=ev[2]:
end do:
ev1 := convert(ev1,list):
ev2 := convert(ev2,list):

Nyquist

> plots[complexplot]([op(ev1),op(ev2)],style=point,view=[-50..10,0..6],labels=["Re[1/s]","Im[rad/s]"],title="Nyquist plot");

> plot([seq([i,Re(ev1[i])],i=1..max_speed), seq([i,Re(ev2[i])],i=1..max_speed)],
style=point,view=[0..max_speed,-50..5],color=[blue,red],labels=["speed [m/s]","RealPart [1/s]"]);

OverSteering Vehicle

define vehicle characteristics

> oversteer_vehicle :=[
a=1.3, from Cr to G
b=1.3, from G to Cf
M=1000.,mass
IZ=600.,yaw inertia
KLr=18.*5000,rear tire cornering stiffness
KLf=24.*5000 front tire cornering stiffness
];

> AN := map(expand,subs(oversteer_vehicle,AA));
BN := subs(oversteer_vehicle,BB);

Free Anaylsis

> free_stability (10);

> free_stability (30);

> free_stability (50);

Eigenvalues from 1 to 50 m/s

> max_speed := 60; maximum speed

> for i from 1 to max_speed do
ev := free_stability(i):
ev1[i]:=ev[1]: ev2[i]:=ev[2]:
end do:
ev1 := convert(ev1,list):
ev2 := convert(ev2,list):

Nyquist

> #plots[complexplot]([op(ev2),op(ev2)],style=point,view=[-60..10,0..6],labels=["Re[1/s]","Im[rad/s]"],title="Nyquist plot");

> plot([seq([i,Re(ev1[i])],i=1..max_speed), seq([i,Re(ev2[i])],i=1..max_speed)],
style=point,view=[0..max_speed,-50..5],color=[blue,red],labels=["speed [m/s]","RealPart [1/s]"]);

Comments are closed.