VehicleDynamics.Wheels.RillTyre

Data and functions for tyre model according to Rill

VehicleDynamics.Wheels.RillTyre.TyreData VehicleDynamics.Wheels.RillTyre.Wheel VehicleDynamics.Wheels.RillTyre.WheelWithForceAnimation VehicleDynamics.Wheels.RillTyre.TyreDataDallaraRearWheel VehicleDynamics.Wheels.RillTyre.TyreDataDallaraFrontWheel VehicleDynamics.Wheels.RillTyre.TyreDataWithSteeringFlex

NameDescription
TyreData Tyre data
NominalLoad Tyre force data for nominal load
Wheel Wheel model according to Rill
WheelWithForceAnimation Wheel model according to Rill, with animation of tyre forces
tyreForces Compute tyre forces and torques for steady state conditions
tyreForces2 Compute tyre forces and torques for steady state conditions
TyreProperties1 Compute characteristic values for tyre
TyreProperties2 Compute characteristic values for tyre
TyreDataDallaraRearWheel Tyre data
TyreDataDallaraFrontWheel Tyre data
TyreDataWithSteeringFlex Tyre data


VehicleDynamics.Wheels.RillTyre.WheelWithForceAnimation VehicleDynamics.Wheels.RillTyre.WheelWithForceAnimation

Wheel model according to Rill, with animation of tyre forces

VehicleDynamics.Wheels.RillTyre.WheelWithForceAnimation

Parameters

NameDefaultDescription
n[3]{0,1,0}Unit vector in direction of spin axis (same direction for left and right wheel)
leftWheeltruetrue, if left wheel, otherwise right wheel
exactfalsefalse if influence of bearing acceleration is neglected
wheelDatafinal wheelData(R0=tyreData.R0, width=tyreData.width, m=tyreData.m, Iyy=tyreData.Iyy, Ixx=tyreData.Ixx) 
delta_z_offset1e-3In order to make the z-computations less non-linear [m]
delta_eps0.1should be about 0.1 ... 1; see explanation in model
tyreData  
scale_F_x1scaling of visual appearance of F_x
scale_F_y1scaling of visual appearance of F_y
scale_F_z1/tyreData.load1.Fz_nomscaling of visual appearance of F_z
scale_M_z1scaling of visual appearance of M_z

Modelica definition

model WheelWithForceAnimation 
  "Wheel model according to Rill, with animation of tyre forces" 
  
  extends Wheel(hub(qd, q(stateSelect=StateSelect.always)));
  parameter Real scale_F_x=1 "scaling of visual appearance of F_x";
  parameter Real scale_F_y=1 "scaling of visual appearance of F_y";
  parameter Real scale_F_z=1/tyreData.load1.Fz_nom 
    "scaling of visual appearance of F_z";
  parameter Real scale_M_z=1 "scaling of visual appearance of M_z";
  VisualVector force_x(
    category="force", 
    r=Wr, 
    Size=We_x*(scale_F_x*F_x), 
    S=Sroad);
  VisualVector force_y(
    Material={0,1,0,0.5}, 
    category="force", 
    r=Wr, 
    Size=We_y*(scale_F_y*F_y), 
    S=Sroad);
  VisualVector force_z(
    Material={0,0,1,0.5}, 
    category="force", 
    r=Wr, 
    Size=We_z*(scale_F_z*F_z), 
    S=Sroad);
  VisualVector torque(
    Material={1,0,0,0.5}, 
    category="torque", 
    r=Wr, 
    Size=Wt*scale_M_z*M_z, 
    S=Sroad);
end WheelWithForceAnimation;

VehicleDynamics.Wheels.RillTyre.TyreDataDallaraFrontWheel VehicleDynamics.Wheels.RillTyre.TyreDataDallaraFrontWheel

Tyre data

Parameters

NameDefaultDescription
R00.28undeformed radius of wheel [m]
Rrim0.05radius of rim [m]
width0.28width of wheel (>0) [m]
m10mass of wheel [kg]
Iyy1wheel inertia with respect to wheel axis [kg.m2]
Ixx1wheel inertia with respect to axis perpendicular to wheel axis [kg.m2]
c_x100000tyre spring constant in x-direction [N/m]
c_y150000tyre spring constant in y-direction [N/m]
c_z200000tyre spring constant in z-direction [N/m]
d_x1500tyre damping constant in x-direction [N.s/m]
d_y300tyre damping constant in y-direction [N.s/m]
d_z300tyre damping constant in z-direction [N.s/m]
mue_nom0.7friction coefficient of road for which tyre data is valid

Modelica definition

record TyreDataDallaraFrontWheel "Tyre data" 
  extends Utilities.WheelData(
    R0=0.28, 
    width=0.28, 
    Rrim=0.05);
  
  // Spring and damping characteristic of tyre
  parameter Real c_x(unit="N/m") = 100000 "tyre spring constant in x-direction";
  parameter Real c_y(unit="N/m") = 150000 "tyre spring constant in y-direction";
  parameter Real c_z(unit="N/m") = 200000 "tyre spring constant in z-direction";
  parameter Real d_x(unit="N.s/m") = 1500 
    "tyre damping constant in x-direction";
  parameter Real d_y(unit="N.s/m") = 300 "tyre damping constant in y-direction";
  parameter Real d_z(unit="N.s/m") = 300 "tyre damping constant in z-direction";
  
  // Data for nominal vertical load 1
  parameter Real mue_nom=0.7 
    "friction coefficient of road for which tyre data is valid";
  
  NominalLoad load1(
    Fz_nom=1.5*3000, 
    Fds_x=1.5*50000, 
    Fds_y=1.5*40000, 
    F_max_x=1.5*3000, 
    F_slide_x=1.5*2800, 
    F_max_y=1.5*2750, 
    F_slide_y=1.5*2500);
  NominalLoad load2(
    Fz_nom=6000, 
    s_max_x=0.18, 
    s_slide_x=0.5, 
    s_max_y=0.24, 
    s_slide_y=0.8, 
    dL0=0.1, 
    s0=0.275, 
    sE=0.8, 
    Fds_x=1.5*75000, 
    F_max_x=1.5*4500, 
    F_slide_x=1.5*4200, 
    Fds_y=1.5*60000, 
    F_max_y=1.5*4125, 
    F_slide_y=1.5*3750);
end TyreDataDallaraFrontWheel;

VehicleDynamics.Wheels.RillTyre.TyreDataDallaraRearWheel VehicleDynamics.Wheels.RillTyre.TyreDataDallaraRearWheel

Tyre data

Parameters

NameDefaultDescription
R00.31undeformed radius of wheel [m]
Rrim0.05radius of rim [m]
width0.3width of wheel (>0) [m]
m10mass of wheel [kg]
Iyy1wheel inertia with respect to wheel axis [kg.m2]
Ixx1wheel inertia with respect to axis perpendicular to wheel axis [kg.m2]
c_x100000tyre spring constant in x-direction [N/m]
c_y150000tyre spring constant in y-direction [N/m]
c_z200000tyre spring constant in z-direction [N/m]
d_x1500tyre damping constant in x-direction [N.s/m]
d_y300tyre damping constant in y-direction [N.s/m]
d_z300tyre damping constant in z-direction [N.s/m]
mue_nom0.7friction coefficient of road for which tyre data is valid

Modelica definition

record TyreDataDallaraRearWheel "Tyre data" 
  extends Utilities.WheelData(
    R0=0.31, 
    width=0.3, 
    Rrim=0.05);
  
  // Spring and damping characteristic of tyre
  parameter Real c_x(unit="N/m") = 100000 "tyre spring constant in x-direction";
  parameter Real c_y(unit="N/m") = 150000 "tyre spring constant in y-direction";
  parameter Real c_z(unit="N/m") = 200000 "tyre spring constant in z-direction";
  parameter Real d_x(unit="N.s/m") = 1500 
    "tyre damping constant in x-direction";
  parameter Real d_y(unit="N.s/m") = 300 "tyre damping constant in y-direction";
  parameter Real d_z(unit="N.s/m") = 300 "tyre damping constant in z-direction";
  
  // Data for nominal vertical load 1
  parameter Real mue_nom=0.7 
    "friction coefficient of road for which tyre data is valid";
  
  NominalLoad load1(
    Fz_nom=2.5*3000, 
    Fds_x=2.5*50000, 
    Fds_y=2.5*40000, 
    F_max_x=2.5*3000, 
    F_slide_x=2.5*2800, 
    F_max_y=2.5*2750, 
    F_slide_y=2.5*2500);
  NominalLoad load2(
    Fz_nom=6000, 
    s_max_x=0.18, 
    s_slide_x=0.5, 
    s_max_y=0.24, 
    s_slide_y=0.8, 
    dL0=0.1, 
    s0=0.275, 
    sE=0.8, 
    Fds_x=2.5*75000, 
    F_max_x=2.5*4500, 
    F_slide_x=2.5*4200, 
    Fds_y=2.5*60000, 
    F_max_y=2.5*4125, 
    F_slide_y=2.5*3750);
end TyreDataDallaraRearWheel;

VehicleDynamics.Wheels.RillTyre.TyreData VehicleDynamics.Wheels.RillTyre.TyreData

Tyre data

Parameters

NameDefaultDescription
R00.3undeformed radius of wheel [m]
Rrim0.2radius of rim [m]
width0.19width of wheel (>0) [m]
m10mass of wheel [kg]
Iyy1wheel inertia with respect to wheel axis [kg.m2]
Ixx1wheel inertia with respect to axis perpendicular to wheel axis [kg.m2]
c_x100000tyre spring constant in x-direction [N/m]
c_y150000tyre spring constant in y-direction [N/m]
c_z200000tyre spring constant in z-direction [N/m]
d_x1500tyre damping constant in x-direction [N.s/m]
d_y300tyre damping constant in y-direction [N.s/m]
d_z300tyre damping constant in z-direction [N.s/m]
mue_nom0.7friction coefficient of road for which tyre data is valid

Modelica definition

record TyreData "Tyre data" 
  extends Utilities.WheelData;
  
  // Spring and damping characteristic of tyre
  parameter Real c_x(unit="N/m") = 100000 "tyre spring constant in x-direction";
  parameter Real c_y(unit="N/m") = 150000 "tyre spring constant in y-direction";
  parameter Real c_z(unit="N/m") = 200000 "tyre spring constant in z-direction";
  parameter Real d_x(unit="N.s/m") = 1500 
    "tyre damping constant in x-direction";
  parameter Real d_y(unit="N.s/m") = 300 "tyre damping constant in y-direction";
  parameter Real d_z(unit="N.s/m") = 300 "tyre damping constant in z-direction";
  
  // Data for nominal vertical load 1
  parameter Real mue_nom=0.7 
    "friction coefficient of road for which tyre data is valid";
  
  NominalLoad load1;
  NominalLoad load2(
    Fz_nom=6000, 
    Fds_x=75000, 
    s_max_x=0.18, 
    F_max_x=4500, 
    s_slide_x=0.5, 
    F_slide_x=4200, 
    Fds_y=60000, 
    s_max_y=0.24, 
    F_max_y=4125, 
    s_slide_y=0.8, 
    F_slide_y=3750, 
    dL0=0.1, 
    s0=0.275, 
    sE=0.8);
end TyreData;

VehicleDynamics.Wheels.RillTyre.NominalLoad

Tyre force data for nominal load

Parameters

NameDefaultDescription
Fz_nom3000Nominal normal force [N]
Fds_x50000Slope at s_x=0 in longitudinal direction [N]
s_max_x0.15Slip of maximum longitudinal tyre force
F_max_x3000maximum longitudinal tyre force [N]
s_slide_x0.4Slip of sliding begin
F_slide_x2800Longitudinal tyre force at sliding begin [N]
Fds_y40000Slope at s_y=0 in lateral direction [N]
s_max_y0.21Slip of maximum lateral tyre force
F_max_y2750maximum lateral tyre force [N]
s_slide_y0.6Slip of sliding begin
F_slide_y2500Lateral tyre force at sliding begin [N]
dL00.133(distance contact point to f_y) / (length of contact area) for zero lateral slip
s00.25Lateral slip where dL=0 for the first time (usually, a bit higher as s_Fmax_y)
sE0.6Lateral slip where dL remains zero for higher slips

Modelica definition

record NominalLoad "Tyre force data for nominal load" 
  /* Definition of tyre force characteristic
       Note, that the following requirements must be fulfilled:
             Fds_x >= 2*Fmax_x / s_Fmax_x
             Fds_y >= 2*Fmax_y / s_Fmax_y
       in order that there is no turning point for 0 < s <= s_Fmax
       Also: 0.1 <= dL0 <= 1/6
    */
  parameter SI.Force Fz_nom=3000 "Nominal normal force";
  
  parameter SI.Force Fds_x=50000 "Slope at s_x=0 in longitudinal direction";
  parameter Real s_max_x=0.15 "Slip of maximum longitudinal tyre force";
  parameter SI.Force F_max_x=3000 "maximum longitudinal tyre force";
  parameter Real s_slide_x=0.4 "Slip of sliding begin";
  parameter SI.Force F_slide_x=2800 "Longitudinal tyre force at sliding begin";
  
  parameter SI.Force Fds_y=40000 "Slope at s_y=0 in lateral direction";
  parameter Real s_max_y=0.21 "Slip of maximum lateral tyre force";
  parameter SI.Force F_max_y=2750 "maximum lateral tyre force";
  parameter Real s_slide_y=0.6 "Slip of sliding begin";
  parameter SI.Force F_slide_y=2500 "Lateral tyre force at sliding begin";
  
  parameter Real dL0=0.133 
    "(distance contact point to f_y) / (length of contact area) for zero lateral slip";
  parameter Real s0=0.25 
    "Lateral slip where dL=0 for the first time (usually, a bit higher as s_Fmax_y)";
  parameter Real sE=0.6 "Lateral slip where dL remains zero for higher slips";
end NominalLoad;

VehicleDynamics.Wheels.RillTyre.Wheel VehicleDynamics.Wheels.RillTyre.Wheel

Wheel model according to Rill

VehicleDynamics.Wheels.RillTyre.Wheel

Information

This element contains the inertia properties of a
rotating wheel and the tyre forces acting at the
contact point of the wheel with the road. The tyre forces
are computed accorded to the equations of Rill (see reference below).
The wheel data is defined via the record WheelData and the tire
data is defined via the record RillTyre.TyreData.
Therefore, it suffices to define one instance of
these records and use them for all 4 wheels of a vehicle.
The frames of this object have the following meaning:
Frame carrierFrame is fixed in the carrier of the wheel
and is located on the spin axis of the wheel in the
middle point of the wheel. This point is also approximately
used as the center-of-mass of the wheel.
It is temporarily assumed that the road lies in the
x-y plane of the inertial frame! This restriction can
be removed by defining the road properties via inner/outer
functions.
Flange driveShaft is used to drive the wheel with
a 1D-drive train.
This element is realized according to the description
  Georg Rill: Simulation von Kraftfahrzeugen,
              Vieweg, 1994

Parameters

NameDefaultDescription
n[3]{0,1,0}Unit vector in direction of spin axis (same direction for left and right wheel)
leftWheeltruetrue, if left wheel, otherwise right wheel
exactfalsefalse if influence of bearing acceleration is neglected
delta_z_offset1e-3In order to make the z-computations less non-linear [m]
delta_eps0.1should be about 0.1 ... 1; see explanation in model
tyreData  

Modelica definition

model Wheel "Wheel model according to Rill" 
  import Car;
  import Modelica.Math;
  extends Utilities.BaseWheel(final wheelData(
      R0=tyreData.R0, 
      width=tyreData.width, 
      m=tyreData.m, 
      Iyy=tyreData.Iyy, 
      Ixx=tyreData.Ixx));
  
  //SLIP DEFINITION
  
  SI.Angle slipAngle 
    "Angle between wheel axis velocity and the x-direction of the wheel";
  Real slip "slip at contact point computed with contact velocities";
  Real slip_limited "slip limited in the range -1.1 for plotting";
  Real sinphi 
    "sin(phi), where phi is the angle between -Wv_x and -Wv_y, where Wv_x, Wv_y are the contact point velocities";
  Real cosphi "cos(phi)";
  SI.Velocity Wv_abs "Absolute value of contact point velocity";
  SI.Velocity Rw "denominator of slip quotient";
  
  //TYRE DEFLECTION
protected 
  parameter Real delta_x_nom=tyreData.load1.F_slide_x/tyreData.c_x 
    "nominal tyre deflection in x-direction";
  parameter Real delta_y_nom=tyreData.load1.F_slide_y/tyreData.c_y 
    "nominal tyre deflection in y-direction";
public 
  SI.Position delta_x 
    "Longitudinal tyre deflection (= wheel deformation in x-direction of W-frame)";
  SI.Position delta_y 
    "Lateral tyre deflection (= wheel deformation in y-direction of W-frame)";
  SI.Position delta_z 
    "Radial tyre deflection (= wheel deformation in z-direction of W-frame)";
  parameter SI.Position delta_z_offset=1e-3 
    "In order to make the z-computations less non-linear";
  
  //TYRE CONTACT AND FORCE GENERATION
  
  Boolean contact "true, if wheel has contact with road";
  Real mueRoad;
  parameter Real delta_eps=0.1 
    "should be about 0.1 ... 1; see explanation in model";
  SI.Force f_x "Tyre/contact force at origin of W-frame in x-direction";
  SI.Force f_y "Tyre/contact force at origin of W-frame in y-direction";
  SI.Force f_z "Tyre/contact force at origin of W-frame in z-direction";
  SI.Force f_x0 "f_x at steady state conditions";
  SI.Force f_y0 "f_y at steady state conditions";
  SI.Force f0 
    "Absolute value of tyre/contact force in contact plane at steady state conditions";
  SI.Force df_ds 
    "Derivative of steady state contact force in contact plane with respect to slip";
  SI.Force t_z "Tyre/contact torque at W-frame in z-direction";
  Real dL 
    "(distance contact point to f_y) / (length of contact area); used to compute t_z";
  Real dfx_dvx1 "Partial derivative of f_x with respect to Wv_x";
  Real dfy_dvy1 "Partial derivative of f_y with respect to Wv_y";
  Real dfx_dvx "dfx_dvx1 where potential positive values are set to zero";
  Real dfy_dvy "dfy_dvy1 where potential positive values are set to zero";
  
  Real Lcontact "length of contact area in x-direction";
  Real delta_diff;
  Real delta_diff_pos;
  
  Real delta_x_scaled "delta_x scaled on nominal value";
  Real delta_y_scaled "delta_y scaled on nominal value";
  Real S_rel[3, 3];
  
public 
  parameter TyreData tyreData;
  tyreForces tyre(data=tyreData);
  
  VisualShape shape_1(
    r0=-nShape*0.7*abs(wheelData.width), 
    Length=abs(wheelData.width), 
    Width=2*wheelData.R0, 
    Height=2*wheelData.R0, 
    LengthDirection=nShape, 
    WidthDirection={1,0,0}, 
    Material={0,0,0,.3}, 
    Extra=wheelData.Rrim/wheelData.R0, 
    Shape="tire");
  VisualShape shape0(
    r0=abs(wheelData.width)*nShape*0.2, 
    Length=wheelData.R0 - 0.01, 
    Width=0.02, 
    Height=0.05, 
    WidthDirection=-nShape, 
    Material={0.2,0,0,0.7});
  VisualShape shape1(
    r0=abs(wheelData.width)*nShape*0.2, 
    Length=wheelData.R0 - 0.01, 
    Width=0.02, 
    Height=0.05, 
    LengthDirection={0.6235,0,0.7818}, 
    WidthDirection=-nShape, 
    Material={0.2,0.2,0.2,0.7});
  VisualShape shape2(
    r0=abs(wheelData.width)*nShape*0.2, 
    Length=wheelData.R0 - 0.01, 
    Width=0.02, 
    Height=0.05, 
    LengthDirection={-0.2225,0,0.9749}, 
    WidthDirection=-nShape, 
    Material={0.2,0.2,0.2,0.7});
  VisualShape shape3(
    r0=abs(wheelData.width)*nShape*0.2, 
    Length=wheelData.R0 - 0.01, 
    Width=0.02, 
    Height=0.05, 
    LengthDirection={-0.9010,0,0.4339}, 
    WidthDirection=-nShape, 
    Material={0.2,0.2,0.2,0.7});
  VisualShape shape4(
    r0=abs(wheelData.width)*nShape*0.2, 
    Length=wheelData.R0 - 0.01, 
    Width=0.02, 
    Height=0.05, 
    LengthDirection={-0.9010,0,-0.4339}, 
    WidthDirection=-nShape, 
    Material={0.2,0.2,0.2,0.7});
  VisualShape shape5(
    r0=abs(wheelData.width)*nShape*0.2, 
    Length=wheelData.R0 - 0.01, 
    Width=0.02, 
    Height=0.05, 
    LengthDirection={-0.2225,0,-0.9749}, 
    WidthDirection=-nShape, 
    Material={0.2,0.2,0.2,0.7});
  VisualShape shape6(
    r0=abs(wheelData.width)*nShape*0.2, 
    Length=wheelData.R0 - 0.01, 
    Width=0.02, 
    Height=0.05, 
    LengthDirection={0.6235,0,-0.7818}, 
    WidthDirection=-nShape, 
    Material={0.2,0.2,0.2,0.7});
equation 
  
  //SLIP DEFINITION
  //slipAngle = Modelica.Math.atan2(Cv[2], noEvent(abs(Cv[1])));
  slipAngle = Modelica.Math.atan2(Wv_y, Rw);
  //also possible slipAngle=Modelica.Math.atan2(Wv_y,Wv_x);
  /* Determine slip
       Wv_abs: Absolute value of contact point velocity (= sqrt(Wv*Wv))
       phi   : Angle between longitudinal and lateral contact point velocity
               Assumption: For Wv_abs small -> Wv_x = Wv_abs, Wv_y = 0, i.e.,
                           velocity only in longitudinal direction.
       sinphi: sin(phi) (= 0 for Wv_abs = 0)
       cosphi: cos(phi) (= -1 for Wv_abs = 0)
    */
  Wv_abs = noEvent(max([sqrt(Wv_x*Wv_x + Wv_y*Wv_y); 1.e-10]));
  Rw = wheelData.R0*abs(w) + 0.1;
  slip = Wv_abs/Rw;
  slip_limited = noEvent(if slip > 1 then 1 else if slip < -1 then -1 else slip);
  if noEvent(Wv_abs > v_eps) then
    sinphi = -Wv_y/Wv_abs;
    cosphi = -Wv_x/Wv_abs;
  else
    sinphi = 0;
    cosphi = -1;
  end if;
  
  //TYRE FORCES AND TORQUES  
  
  delta_z = if delta_r >= 0 then delta_r else 0;
  
  // Compute  force perpendicular to contact plane.
  f_z = if delta_r >= 0 then tyreData.c_z*delta_z + tyreData.d_z*ddelta_r else 
    0;
  
  // Compute steady state tyre forces in x- and y-direction
  
  // (f0,f_x0,f_y0,df_ds,dL) = RillTyre.tyreForces(tyreData, slip, sinphi,
  //  cosphi, f_z, mueRoad, camberAngle);
  tyre.slip = slip;
  tyre.sinphi = sinphi;
  tyre.cosphi = cosphi;
  tyre.f_z = f_z;
  tyre.mueRoad = mueRoad;
  tyre.camberAngle = camberAngle;
  tyre.f0 = f0;
  tyre.f_x0 = f_x0;
  tyre.f_y0 = f_y0;
  tyre.df_ds = df_ds;
  tyre.dL = dL;
  
  // Compute data for tyre deflection differential equations
  if noEvent(Wv_abs > v_eps) then
    dfx_dvx1 = -(df_ds*slip*cosphi*cosphi + f0*sinphi*sinphi)/Wv_abs;
    dfy_dvy1 = -(df_ds*slip*sinphi*sinphi + f0*cosphi*cosphi)/Wv_abs;
  else
    dfx_dvx1 = -df_ds/Rw;
    dfy_dvy1 = dfx_dvx1;
  end if;
  
  dfx_dvx = if dfx_dvx1 <= 0 then dfx_dvx1 else 0;
  dfy_dvy = if dfy_dvy1 <= 0 then dfy_dvy1 else 0;
  
  /* Differential equations for tyre deflections in x- and y-direction
         If the wheel angular velocity is too small, the prerequisites for the
         validity of the tyre force calculation are violated and the equations
         give wrong results. In such a case it is assumed that the profil
         particles do no longer get their maximum deflection. If only
         longitudinal slip is present, the deflection delta_x is calculated
         by "der(delta_x) = -Wv_x" (which is the definition of the deflection delta_x).
         However, delta_x has a maximum which is reached when the particle leaves
         the contact area. If the velocity is constant, a particle remains
         "T = Lcontact / (R0*abs(w))" seconds in the contact area, where Lcontact
         is the length of the contact area, R0 is the undeformed wheel radius
         and w is the angular velocity of the wheel. Therefore, the maximum
         deflection is
               delta_x_max = -Wv_x*T
                           = -Wv_x*Lcontact/(R0*abs(w))
                           = slip*Lcontact.
         Therefore, the estimation is used that the simplified differential
         equation is used as long as deflection is less then "delta_eps*slip*Lcontact"
         where delta_eps is choosen appropriately (e.g., delta_eps=0.1;
         note that delta_eps=1 gives the theoretical switching condition
         derived by simplified assumptions).
      */
  contact = delta_r >= 0;
  Lcontact = noEvent(sqrt(8*tyreData.R0*(delta_z + delta_z_offset)) - sqrt(8*
    tyreData.R0*delta_z_offset));
  delta_diff = noEvent(sqrt(delta_x*delta_x + delta_y*delta_y) - abs(delta_eps*
    slip*Lcontact));
  delta_diff_pos = noEvent(if delta_diff >= 0 or Rw >= 1 then 1 else 0);
  
  der(delta_x_scaled) = (if not contact then 0 else if noEvent(delta_diff_pos
     > 0.5) then (f_x0 - tyreData.c_x*delta_x)/(tyreData.d_x - dfx_dvx) else -
    Wv_x)/delta_x_nom;
  der(delta_y_scaled) = (if not contact then 0 else if noEvent(delta_diff_pos
     > 0.5) then (f_y0 - tyreData.c_y*delta_y)/(tyreData.d_y - dfy_dvy) else -
    Wv_y)/delta_y_nom;
  
  delta_x = delta_x_scaled*delta_x_nom;
  delta_y = delta_y_scaled*delta_y_nom;
  
  when change(contact) then
    // Tyre looses contact to ground or gets contact to ground
    reinit(delta_x_scaled, 0);
    reinit(delta_y_scaled, 0);
  end when;
  
  
    // Compute dynamic tyre forces in x- and y-direction and tyre torque in z-direction
  f_x = tyreData.c_x*delta_x + tyreData.d_x*der(delta_x);
  f_y = tyreData.c_y*delta_y + tyreData.d_y*der(delta_y);
  t_z = -Lcontact*dL*f_y;
  
  //FORCES AND MOMENTS REQUIRED BY THE BaseWheel
  F_x = f_x;
  F_y = f_y;
  F_z = f_z;
  M_x = 0;
  //this model is yet unable to generate overturning moment 
  M_y = 0;
  //and roll resistance torque.
  M_z = t_z;
  
  //VISUAL REPRESENTATION OF TYRE AND RIM
  S_rel = [nn]*transpose([nn]) + (identity(3) - [nn]*transpose([nn]))*cos(phi)
     - skew(nn)*sin(phi);
  //tyre
  shape_1.S = wheel_body.frame_b.S*transpose(S_rel);
  shape_1.r = wheel_body.frame_b.r0;
  //rim
  shape0.S = shape_1.S;
  shape0.r = shape_1.r;
  shape1.S = shape0.S;
  shape1.r = shape0.r;
  shape2.S = shape1.S;
  shape2.r = shape1.r;
  shape3.S = shape2.S;
  shape3.r = shape2.r;
  shape4.S = shape3.S;
  shape4.r = shape3.r;
  shape5.S = shape4.S;
  shape5.r = shape4.r;
  shape6.S = shape5.S;
  shape6.r = shape5.r;
end Wheel;

VehicleDynamics.Wheels.RillTyre.tyreForces

Compute tyre forces and torques for steady state conditions

VehicleDynamics.Wheels.RillTyre.tyreForces

Parameters

NameDefaultDescription
data Data of tyre

Modelica definition

block tyreForces 
  "Compute tyre forces and torques for steady state conditions" 
  
  // Compute tire force in contact plane
  
  // Compute longitudinal and lateral tire forces
  
  // Compute attachment point of f_y with respect to contact length (dL)
  input Real slip;
  input Real sinphi 
    "sin(phi), where phi is the angle between -Wv_x and -Wv_y, where Wv_x, Wv_y are the contact point velocities";
  input Real cosphi "cos(phi)";
  input SI.Force f_z "Load in normal direction";
  input Real mueRoad "Coefficient of friction of road";
  input SI.Angle camberAngle;
  output SI.Force f0 "Tyre force in contact plane for steady state conditions";
  output SI.Force f_x0 "Tyre force in x-direction for steady state conditions";
  output SI.Force f_y0 "Tyre force in y-direction for steady state conditions";
  output SI.Force df_ds 
    "Derivative of steady state contact force in contact plane with respect to slip";
  output Real dL 
    "(distance contact point to f_y) / (length of contact area); used to compute t_z";
protected 
  SI.Force f_z1;
  SI.Force f_z2;
  SI.Force Fds_x;
  SI.Force Fds_y;
  SI.Force F_max_x;
  SI.Force F_max_y;
  SI.Force F_slide_x;
  SI.Force F_slide_y;
  SI.Force Fds;
  SI.Force F_max;
  SI.Force F_slide;
  Real s_max_x;
  Real s_max_y;
  Real s_slide_x;
  Real s_slide_y;
  Real s_max;
  Real s_slide;
  Real k_mue;
  Real sigma;
  Real dL0;
  Real s0;
  Real sE;
  Real s_y;
  Real c;
public 
  parameter TyreData data "Data of tyre";
equation 
  
  // (f0,f_x0,f_y0,df_ds,dL) = RillTyre.tyreForces2(data, slip, sinphi,
  //  cosphi, f_z, mueRoad, camberAngle);
  k_mue = mueRoad/data.mue_nom;
  
  // Compute data of force slip curve, according to Rill
  f_z1 = data.load1.Fz_nom;
  f_z2 = data.load2.Fz_nom;
  
  Fds_x = Utilities.interpolate2(f_z, f_z1, data.load1.Fds_x, f_z2, data.load2.
    Fds_x);
  Fds_y = Utilities.interpolate2(f_z, f_z1, data.load1.Fds_y, f_z2, data.load2.
    Fds_y);
  
  F_max_x = k_mue*Utilities.interpolate2(f_z, f_z1, data.load1.F_max_x, f_z2, 
    data.load2.F_max_x);
  F_max_y = k_mue*Utilities.interpolate2(f_z, f_z1, data.load1.F_max_y, f_z2, 
    data.load2.F_max_y);
  
  F_slide_x = k_mue*Utilities.interpolate2(f_z, f_z1, data.load1.F_slide_x, 
    f_z2, data.load2.F_slide_x);
  F_slide_y = k_mue*Utilities.interpolate2(f_z, f_z1, data.load1.F_slide_y, 
    f_z2, data.load2.F_slide_y);
  
  s_max_x = k_mue*Utilities.interpolate1(f_z, f_z1, data.load1.s_max_x, f_z2, 
    data.load2.s_max_x);
  s_max_y = k_mue*Utilities.interpolate1(f_z, f_z1, data.load1.s_max_y, f_z2, 
    data.load2.s_max_y);
  
  s_slide_x = k_mue*Utilities.interpolate1(f_z, f_z1, data.load1.s_slide_x, 
    f_z2, data.load2.s_slide_x);
  s_slide_y = k_mue*Utilities.interpolate1(f_z, f_z1, data.load1.s_slide_y, 
    f_z2, data.load2.s_slide_y);
  
  Fds = noEvent(max([sqrt((Fds_x*cosphi)^2 + (Fds_y*sinphi)^2); 1.e-10]));
  s_max = noEvent(max([sqrt((s_max_x*cosphi)^2 + (s_max_y*sinphi)^2); 1.e-10]));
  F_max = noEvent(max([sqrt((F_max_x*cosphi)^2 + (F_max_y*sinphi)^2); 1.e-10]));
  s_slide = noEvent(max([sqrt((s_slide_x*cosphi)^2 + (s_slide_y*sinphi)^2); 
    1.0001*s_max]));
  F_slide = noEvent(max([sqrt((F_slide_x*cosphi)^2 + (F_slide_y*sinphi)^2); 
    1.e-10]));
  
  // Compute tire force in contact plane
  if noEvent(slip <= s_max) then
    sigma = slip/s_max;
    c = noEvent(sigma*(s_max/max([F_max, 1.e-10])*Fds - 2 + sigma) + 1);
    f0 = s_max*Fds*sigma/c;
    df_ds = Fds*(1 - sigma)/(c*c);
  elseif noEvent(slip <= s_slide) then
    sigma = (slip - s_max)/(s_slide - s_max);
    c = 0;
    f0 = F_max - (F_max - F_slide)*sigma*sigma*(3 - 2*sigma);
    df_ds = -(F_max - F_slide)*6*sigma*(1 - sigma)/(s_slide - s_max);
  else
    sigma = 0;
    c = 0;
    f0 = F_slide;
    df_ds = 0;
  end if;
  
  // Compute longitudinal and lateral tire forces
  f_x0 = f0*cosphi;
  f_y0 = f0*sinphi + f_z*tan(camberAngle);
  
  // Compute attachment point of f_y with respect to contact length (dL)
  dL0 = Utilities.interpolate1(f_z, f_z1, data.load1.dL0, f_z2, data.load2.dL0);
  s0 = Utilities.interpolate1(f_z, f_z1, data.load1.s0, f_z2, data.load2.s0);
  sE = Utilities.interpolate1(f_z, f_z1, data.load1.sE, f_z2, data.load2.sE);
  s_y = slip*sinphi;
  dL = noEvent(if abs(s_y) <= s0 then dL0*(1 - abs(s_y)/s0) else if abs(s_y)
     <= sE then -dL0*(abs(s_y) - s0)/s0*((sE - abs(s_y))/(sE - s0))^2 else 0);
end tyreForces;

VehicleDynamics.Wheels.RillTyre.tyreForces2

Compute tyre forces and torques for steady state conditions

Modelica definition

function tyreForces2 
  "Compute tyre forces and torques for steady state conditions" 
  
  input TyreData data "Data of tyre";
  input Real slip;
  input Real sinphi 
    "sin(phi), where phi is the angle between -Wv_x and -Wv_y, where Wv_x, Wv_y are the contact point velocities";
  input Real cosphi "cos(phi)";
  input SI.Force f_z "Load in normal direction";
  input Real mueRoad "Coefficient of friction of road";
  input SI.Angle camberAngle;
  output SI.Force f0 "Tyre force in contact plane for steady state conditions";
  output SI.Force f_x0 "Tyre force in x-direction for steady state conditions";
  output SI.Force f_y0 "Tyre force in y-direction for steady state conditions";
  output SI.Force df_ds 
    "Derivative of steady state contact force in contact plane with respect to slip";
  output Real dL 
    "(distance contact point to f_y) / (length of contact area); used to compute t_z";
protected 
  SI.Force f_z1;
  SI.Force f_z2;
  SI.Force Fds_x;
  SI.Force Fds_y;
  SI.Force F_max_x;
  SI.Force F_max_y;
  SI.Force F_slide_x;
  SI.Force F_slide_y;
  SI.Force Fds;
  SI.Force F_max;
  SI.Force F_slide;
  SI.Force f;
  Real s_max_x;
  Real s_max_y;
  Real s_slide_x;
  Real s_slide_y;
  Real s_max;
  Real s_slide;
  Real k_mue;
  Real sigma;
  Real dL0;
  Real s0;
  Real sE;
  Real s_y;
  Real c;
algorithm 
  k_mue := mueRoad/data.mue_nom;
  
  // Compute data of force slip curve, according to Rill
  f_z1 := data.load1.Fz_nom;
  f_z2 := data.load2.Fz_nom;
  
  Fds_x := Utilities.interpolate2(f_z, f_z1, data.load1.Fds_x, f_z2, data.load2
    .Fds_x);
  Fds_y := Utilities.interpolate2(f_z, f_z1, data.load1.Fds_y, f_z2, data.load2
    .Fds_y);
  
  F_max_x := k_mue*Utilities.interpolate2(f_z, f_z1, data.load1.F_max_x, f_z2, 
    data.load2.F_max_x);
  F_max_y := k_mue*Utilities.interpolate2(f_z, f_z1, data.load1.F_max_y, f_z2, 
    data.load2.F_max_y);
  
  F_slide_x := k_mue*Utilities.interpolate2(f_z, f_z1, data.load1.F_slide_x, 
    f_z2, data.load2.F_slide_x);
  F_slide_y := k_mue*Utilities.interpolate2(f_z, f_z1, data.load1.F_slide_y, 
    f_z2, data.load2.F_slide_y);
  
  s_max_x := k_mue*Utilities.interpolate1(f_z, f_z1, data.load1.s_max_x, f_z2, 
    data.load2.s_max_x);
  s_max_y := k_mue*Utilities.interpolate1(f_z, f_z1, data.load1.s_max_y, f_z2, 
    data.load2.s_max_y);
  
  s_slide_x := k_mue*Utilities.interpolate1(f_z, f_z1, data.load1.s_slide_x, 
    f_z2, data.load2.s_slide_x);
  s_slide_y := k_mue*Utilities.interpolate1(f_z, f_z1, data.load1.s_slide_y, 
    f_z2, data.load2.s_slide_y);
  
  Fds := sqrt((Fds_x*cosphi)^2 + (Fds_y*sinphi)^2);
  s_max := sqrt((s_max_x*cosphi)^2 + (s_max_y*sinphi)^2);
  F_max := sqrt((F_max_x*cosphi)^2 + (F_max_y*sinphi)^2);
  s_slide := sqrt((s_slide_x*cosphi)^2 + (s_slide_y*sinphi)^2);
  F_slide := sqrt((F_slide_x*cosphi)^2 + (F_slide_y*sinphi)^2);
  
  // Compute tire force in contact plane
  if slip <= s_max then
    sigma := slip/s_max;
    c := sigma*(s_max/max([F_max, 1.e-10])*Fds - 2 + sigma) + 1;
    f0 := s_max*Fds*sigma/c;
    df_ds := Fds*(1 - sigma)/(c*c);
  elseif slip <= s_slide then
    sigma := (slip - s_max)/(s_slide - s_max);
    f0 := F_max - (F_max - F_slide)*sigma*sigma*(3 - 2*sigma);
    df_ds := -(F_max - F_slide)*6*sigma*(1 - sigma)/(s_slide - s_max);
  else
    f0 := F_slide;
    df_ds := 0;
  end if;
  
  // Compute longitudinal and lateral tire forces
  f_x0 := f0*cosphi;
  f_y0 := f0*sinphi + f_z*tan(camberAngle);
  
  // Compute attachment point of f_y with respect to contact length (dL)
  dL0 := Utilities.interpolate1(f_z, f_z1, data.load1.dL0, f_z2, data.load2.dL0);
  s0 := Utilities.interpolate1(f_z, f_z1, data.load1.s0, f_z2, data.load2.s0);
  sE := Utilities.interpolate1(f_z, f_z1, data.load1.sE, f_z2, data.load2.sE);
  s_y := slip*sinphi;
  dL := if abs(s_y) <= s0 then dL0*(1 - abs(s_y)/s0) else if abs(s_y) <= sE
     then -dL0*(abs(s_y) - s0)/s0*((sE - abs(s_y))/(sE - s0))^2 else 0;
end tyreForces2;

VehicleDynamics.Wheels.RillTyre.TyreProperties1

Compute characteristic values for tyre

Parameters

NameDefaultDescription
f_z[:]1000:1000:6000Load of wheel
mue[:]{0.1,0.3,0.5,0.7}road friction coefficient variation
camberAngleDeg0Camber angle in [deg]
mueRoadtyreData.mue_nom 

Modelica definition

model TyreProperties1 "Compute characteristic values for tyre" 
  import SI = Modelica.SIunits;
  import Modelica.Math.*;
  import Modelica.Constants.*;
  TyreData tyreData;
  parameter Real f_z[:]=1000:1000:6000 "Load of wheel";
  parameter Real mue[:]={0.1,0.3,0.5,0.7} "road friction coefficient variation";
  
  parameter Real camberAngleDeg=0 "Camber angle in [deg]";
  parameter Real mueRoad=tyreData.mue_nom;
  final parameter Integer nload=size(f_z, 1);
  final parameter Integer nmue=size(mue, 1);
  
  tyreForces tyre1[nload](each data=tyreData);
  tyreForces tyre2[nload](each data=tyreData);
  tyreForces tyre3[nload](each data=tyreData);
  tyreForces tyre4[nmue](each data=tyreData);
  
  Real slip "at all slip=time values the tyre equations are evaluated";
  Real f_x[nload] 
    "Tyre force in x-direction for pure longitudinal slip and different f_z values";
  Real df_ds[nload] 
    "Derivative of steady state contact force in contact plane with respect to slip for pure longitudinal slip";
  Real f_y[nload] 
    "Tyre force in y-direction for pure lateral slip and different f_z values";
  Real dL[nload] 
    "distance of f_y0 attachment point from contact point with respect to length of contact area for pure lateral slip";
  Real L[nload] "length of contact aread for pure lateral slip";
  Real t_z[nload] "Tyre torque in z-direction for pure lateral slip";
  Real f[nload] "Tyre force in contact plane for phi=45 deg slip";
  Real f_x_mue[nmue] 
    "Tyre force in x-direction for longitudinal slip, f_z=load1.f_z and different mue-values";
protected 
  SI.Angle camberAngle;
equation 
  camberAngle = camberAngleDeg*pi/180;
  slip = time;
  for i in 1:nload loop
    // characteristic 1
    tyre1[i].slip = slip;
    tyre1[i].sinphi = 0;
    tyre1[i].cosphi = 1;
    tyre1[i].f_z = f_z[i];
    tyre1[i].mueRoad = mueRoad;
    tyre1[i].camberAngle = camberAngle;
    f_x[i] = tyre1[i].f_x0;
    df_ds[i] = tyre1[i].df_ds;
    
    // characteristic 2
    tyre2[i].slip = slip;
    tyre2[i].sinphi = 1;
    tyre2[i].cosphi = 0;
    tyre2[i].f_z = f_z[i];
    tyre2[i].mueRoad = mueRoad;
    tyre2[i].camberAngle = camberAngle;
    f_y[i] = tyre2[i].f_y0;
    dL[i] = tyre2[i].dL;
    
    L[i] = noEvent(sqrt(8*tyreData.R0*f_z[i]/tyreData.c_z));
    t_z[i] = -L[i]*dL[i]*f_y[i];
    
    // characteristic 3
    tyre3[i].slip = slip;
    tyre3[i].sinphi = sin(pi/4);
    tyre3[i].cosphi = cos(pi/4);
    tyre3[i].f_z = f_z[i];
    tyre3[i].mueRoad = mueRoad;
    tyre3[i].camberAngle = camberAngle;
    f[i] = tyre3[i].f0;
  end for;
  
  for i in 1:nmue loop
    // characteristic 4
    tyre4[i].slip = slip;
    tyre4[i].sinphi = 0;
    tyre4[i].cosphi = 1;
    tyre4[i].f_z = tyreData.load1.Fz_nom;
    tyre4[i].mueRoad = mue[i];
    tyre4[i].camberAngle = camberAngle;
    
    f_x_mue[i] = tyre4[i].f_x0;
  end for;
end TyreProperties1;

VehicleDynamics.Wheels.RillTyre.TyreProperties2

Compute characteristic values for tyre

Parameters

NameDefaultDescription
f_z[:]1000:1000:6000Load of wheel
mue[:]{0.1,0.3,0.5,0.7}road friction coefficient variation
camberAngleDeg0Camber angle in [deg]
mueRoadtyreData.mue_nom 

Modelica definition

model TyreProperties2 "Compute characteristic values for tyre" 
  import SI = Modelica.SIunits;
  import Modelica.Math.*;
  import Modelica.Constants.*;
  TyreData tyreData;
  parameter Real f_z[:]=1000:1000:6000 "Load of wheel";
  parameter Real mue[:]={0.1,0.3,0.5,0.7} "road friction coefficient variation";
  parameter Real camberAngleDeg=0 "Camber angle in [deg]";
  parameter Real mueRoad=tyreData.mue_nom;
  final parameter Integer nload=size(f_z, 1);
  final parameter Integer nmue=size(mue, 1);
  Real slip "at all slip=time values the tyre equations are evaluated";
  Real f_x[nload] 
    "Tyre force in x-direction for pure longitudinal slip and different f_z values";
  Real df_ds[nload] 
    "Derivative of steady state contact force in contact plane with respect to slip for pure longitudinal slip";
  Real f_y[nload] 
    "Tyre force in y-direction for pure lateral slip and different f_z values";
  Real dL[nload] 
    "distance of f_y0 attachment point from contact point with respect to length of contact area for pure lateral slip";
  Real L[nload] "length of contact aread for pure lateral slip";
  Real t_z[nload] "Tyre torque in z-direction for pure lateral slip";
  Real f[nload] "Tyre force in contact plane for phi=45 deg slip";
  Real f_x_mue[nmue] 
    "Tyre force in x-direction for longitudinal slip, f_z=load1.f_z and different mue-values";
protected 
  SI.Angle camberAngle;
  Real o1;
  Real o2;
  Real o3;
  Real o4;
  Real o5;
algorithm 
  camberAngle := camberAngleDeg*pi/180;
  slip := time;
  for i in 1:nload loop
    (o1,o2,o3,o4,o5) := tyreForces2(tyreData, slip, 0, 1, f_z[i], mueRoad, 
      camberAngle);
    f_x[i] := o2;
    df_ds[i] := o4;
    
    (o1,o2,o3,o4,o5) := tyreForces2(tyreData, slip, 1, 0, f_z[i], mueRoad, 
      camberAngle);
    f_y[i] := o3;
    dL[i] := o5;
    L[i] := noEvent(sqrt(8*tyreData.R0*f_z[i]/tyreData.c_z));
    t_z[i] := -L[i]*dL[i]*f_y[i];
    
    (o1,o2,o3,o4,o5) := tyreForces2(tyreData, slip, sin(pi/4), cos(pi/4), f_z[i], 
       mueRoad, camberAngle);
    f[i] := o1;
  end for;
  
  for i in 1:nmue loop
    (o1,o2,o3,o4,o5) := tyreForces2(tyreData, slip, 0, 1, tyreData.load1.Fz_nom, 
       mue[i], camberAngle);
    f_x_mue[i] := o2;
  end for;
end TyreProperties2;

VehicleDynamics.Wheels.RillTyre.TyreDataWithSteeringFlex VehicleDynamics.Wheels.RillTyre.TyreDataWithSteeringFlex

Tyre data

Parameters

NameDefaultDescription
R00.3undeformed radius of wheel [m]
Rrim0.2radius of rim [m]
width0.19width of wheel (>0) [m]
m10mass of wheel [kg]
Iyy1wheel inertia with respect to wheel axis [kg.m2]
Ixx1wheel inertia with respect to axis perpendicular to wheel axis [kg.m2]
c_x100000tyre spring constant in x-direction [N/m]
c_y100000*0.9tyre spring constant in y-direction [N/m]
c_z200000tyre spring constant in z-direction [N/m]
d_x1500tyre damping constant in x-direction [N.s/m]
d_y300tyre damping constant in y-direction [N.s/m]
d_z300tyre damping constant in z-direction [N.s/m]
mue_nom0.7friction coefficient of road for which tyre data is valid

Modelica definition

record TyreDataWithSteeringFlex "Tyre data" 
  extends TyreData(
    load1(
      Fds_y=0.9*40000, 
      s_max_y=0.21/0.9, 
      F_max_y=2750, 
      s_slide_y=0.6/0.9), 
    load2(
      Fz_nom=6000, 
      Fds_x=75000, 
      s_max_x=0.18, 
      F_max_x=4500, 
      s_slide_x=0.5, 
      F_slide_x=4200, 
      dL0=0.1, 
      s0=0.275, 
      sE=0.8, 
      Fds_y=60000*0.9, 
      s_max_y=0.21/0.9, 
      F_max_y=4125, 
      s_slide_y=0.6/0.9, 
      F_slide_y=3750), 
    c_y=100000*0.9);
  //parameter Real 0.9=0.9 
  //  "coefficient that scales the side stiffness of the tyre.";
end TyreDataWithSteeringFlex;

HTML-documentation generated by Dymola Tue Jul 15 13:23:40 2003 .