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

For further description see __Motorcycle Dynamics__by Vittore Cossalter, pg. 245

System Model:

definition of the rear assembly reference frame

NOTE: The order of rotation and translational transformations is critical.

The description of the particular reference frame is accomplished by:

1) specifying the translational velocity (time dependent)

2) specifying the rotation of the body coordinate frame about the transvere Y axis thus creating the steering head inclination (Caster angle) (independent of time).

3) specifying the rotation of the coordinate frame around the steering axis (rotated Z-axis) (time dependent). Positive psi according to the right hand rule about the steering axis (Z down).

Optional 4) linearization of the coordinate transformation for small rotations of the rear frame.

> PDEtools[declare](psi(t),prime=t,quiet):

> TT := translate(V*t,0,0) *rotate('Y',epsilon) * rotate('Z',-psi(t));

definition of the rear chassis mass properties.

in this case the center of mass is not specified explicitly. The location of the CoM from the steering axis of rotation is accounted from the in the inertial term, IA.

> Gr := make_POINT(TT,-l1,0,h1): show(Gr);

_gravity := make_VECTOR(ground,0,0,g): show(_gravity);

> rear_chassis := make_BODY(Gr, m, 0,0,IG): show(%);

definition of the contact point of the rear tire with ground.

> CP := make_POINT(TT, -l,0,0):

project(CP,ground):

show(%);

velocity vector of the contact point

This vector is a combination of the vehicle forward velocity and the lateral velocity of the tire contact point.

> VCP := velocity(CP): show(%);

horizontal unit vector which moves with the chassis (parallel and projected to the ground plane)

> u := make_VECTOR(TT, cos(epsilon),0,sin(epsilon)): show(%);

u := project(u,ground): show(%);

vector cross product between the horizontal unit vector "u" and the contact point velocity vector "VCP" (the direction is specified according to the right hand rule)

> w := cross_prod(u,VCP): #show(%);

sideslip angle

defined as the z component of the cross product divided by the forward velocity of the contact point.

> lambda := simplify(expand(comp_Z(w)/V),trig);

definition of the tire force

defining the force as a vector with some components defined relative to the ground frame and some relative to the rear chassis frame simplifies the input.

The force vector is them projected to the ground frame and applied as a force of tire contact point (CP) of hte rear chassis.

> fv := make_VECTOR(ground, 0,0,-N) + make_VECTOR(TT,0,-Fsr,0):

fv := project(fv,ground): #show(%);

make_VECTOR(ground, comp_XYZ(fv)):

tire_force := make_FORCE(%, CP, rear_chassis): show(%);

tire constitutive equation

> Kl; cornering stiffness

lambda; sideslip angle

> Fsr := Kl*'lambda';

steering reactive torques

these torques represent the steering head constraints which maintain its position in space (caster angle) while allowing free rotation about the body Z axis.

> make_VECTOR(TT,MX,MY,0):

steer_react := make_TORQUE(%, rear_chassis): show(%);

Euler approach

> eqnsE := euler_equations( {rear_chassis, tire_force, steer_react}, origin(TT)):

> eqnE_lin := collect( expand(linearize(-comp_Z(eqnsE,ground),{diff(psi(t),t,t),diff(psi(t),t),psi(t)})) , [diff(psi(t),t,t),diff(psi(t),t),psi(t)]);

Lagrange approach: be careful because it works only with non-linear kinematics !!

> LL := simplify(kinetic_energy(rear_chassis)-gravitational_energy(rear_chassis));

> Q[psi] := generalized_force({tire_force,steer_react},psi(t));

> leqn := lagrange(LL,psi(t),t) - Q[psi];

> leqn_lin := collect( expand(linearize(leqn,[psi(t)])), [diff(psi(t),t$2),diff(psi(t),t),psi(t)]);