Name | Description |
---|---|
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 |
Name | Default | Description |
---|---|---|
n[3] | {0,1,0} | Unit vector in direction of spin axis (same direction for left and right wheel) |
leftWheel | true | true, if left wheel, otherwise right wheel |
exact | false | false if influence of bearing acceleration is neglected |
wheelData | final wheelData(R0=tyreData.R0, width=tyreData.width, m=tyreData.m, Iyy=tyreData.Iyy, Ixx=tyreData.Ixx) | |
delta_z_offset | 1e-3 | In order to make the z-computations less non-linear [m] |
delta_eps | 0.1 | should be about 0.1 ... 1; see explanation in model |
tyreData | ||
scale_F_x | 1 | scaling of visual appearance of F_x |
scale_F_y | 1 | scaling of visual appearance of F_y |
scale_F_z | 1/tyreData.load1.Fz_nom | scaling of visual appearance of F_z |
scale_M_z | 1 | scaling of visual appearance of M_z |
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;
Name | Default | Description |
---|---|---|
R0 | 0.28 | undeformed radius of wheel [m] |
Rrim | 0.05 | radius of rim [m] |
width | 0.28 | width of wheel (>0) [m] |
m | 10 | mass of wheel [kg] |
Iyy | 1 | wheel inertia with respect to wheel axis [kg.m2] |
Ixx | 1 | wheel inertia with respect to axis perpendicular to wheel axis [kg.m2] |
c_x | 100000 | tyre spring constant in x-direction [N/m] |
c_y | 150000 | tyre spring constant in y-direction [N/m] |
c_z | 200000 | tyre spring constant in z-direction [N/m] |
d_x | 1500 | tyre damping constant in x-direction [N.s/m] |
d_y | 300 | tyre damping constant in y-direction [N.s/m] |
d_z | 300 | tyre damping constant in z-direction [N.s/m] |
mue_nom | 0.7 | friction coefficient of road for which tyre data is valid |
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;
Name | Default | Description |
---|---|---|
R0 | 0.31 | undeformed radius of wheel [m] |
Rrim | 0.05 | radius of rim [m] |
width | 0.3 | width of wheel (>0) [m] |
m | 10 | mass of wheel [kg] |
Iyy | 1 | wheel inertia with respect to wheel axis [kg.m2] |
Ixx | 1 | wheel inertia with respect to axis perpendicular to wheel axis [kg.m2] |
c_x | 100000 | tyre spring constant in x-direction [N/m] |
c_y | 150000 | tyre spring constant in y-direction [N/m] |
c_z | 200000 | tyre spring constant in z-direction [N/m] |
d_x | 1500 | tyre damping constant in x-direction [N.s/m] |
d_y | 300 | tyre damping constant in y-direction [N.s/m] |
d_z | 300 | tyre damping constant in z-direction [N.s/m] |
mue_nom | 0.7 | friction coefficient of road for which tyre data is valid |
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;
Name | Default | Description |
---|---|---|
R0 | 0.3 | undeformed radius of wheel [m] |
Rrim | 0.2 | radius of rim [m] |
width | 0.19 | width of wheel (>0) [m] |
m | 10 | mass of wheel [kg] |
Iyy | 1 | wheel inertia with respect to wheel axis [kg.m2] |
Ixx | 1 | wheel inertia with respect to axis perpendicular to wheel axis [kg.m2] |
c_x | 100000 | tyre spring constant in x-direction [N/m] |
c_y | 150000 | tyre spring constant in y-direction [N/m] |
c_z | 200000 | tyre spring constant in z-direction [N/m] |
d_x | 1500 | tyre damping constant in x-direction [N.s/m] |
d_y | 300 | tyre damping constant in y-direction [N.s/m] |
d_z | 300 | tyre damping constant in z-direction [N.s/m] |
mue_nom | 0.7 | friction coefficient of road for which tyre data is valid |
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;
Name | Default | Description |
---|---|---|
Fz_nom | 3000 | Nominal normal force [N] |
Fds_x | 50000 | Slope at s_x=0 in longitudinal direction [N] |
s_max_x | 0.15 | Slip of maximum longitudinal tyre force |
F_max_x | 3000 | maximum longitudinal tyre force [N] |
s_slide_x | 0.4 | Slip of sliding begin |
F_slide_x | 2800 | Longitudinal tyre force at sliding begin [N] |
Fds_y | 40000 | Slope at s_y=0 in lateral direction [N] |
s_max_y | 0.21 | Slip of maximum lateral tyre force |
F_max_y | 2750 | maximum lateral tyre force [N] |
s_slide_y | 0.6 | Slip of sliding begin |
F_slide_y | 2500 | Lateral tyre force at sliding begin [N] |
dL0 | 0.133 | (distance contact point to f_y) / (length of contact area) for zero lateral slip |
s0 | 0.25 | Lateral slip where dL=0 for the first time (usually, a bit higher as s_Fmax_y) |
sE | 0.6 | Lateral slip where dL remains zero for higher slips |
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;
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
Name | Default | Description |
---|---|---|
n[3] | {0,1,0} | Unit vector in direction of spin axis (same direction for left and right wheel) |
leftWheel | true | true, if left wheel, otherwise right wheel |
exact | false | false if influence of bearing acceleration is neglected |
delta_z_offset | 1e-3 | In order to make the z-computations less non-linear [m] |
delta_eps | 0.1 | should be about 0.1 ... 1; see explanation in model |
tyreData |
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;
Name | Default | Description |
---|---|---|
data | Data of tyre |
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;
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;
Name | Default | Description |
---|---|---|
f_z[:] | 1000:1000:6000 | Load of wheel |
mue[:] | {0.1,0.3,0.5,0.7} | road friction coefficient variation |
camberAngleDeg | 0 | Camber angle in [deg] |
mueRoad | tyreData.mue_nom |
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;
Name | Default | Description |
---|---|---|
f_z[:] | 1000:1000:6000 | Load of wheel |
mue[:] | {0.1,0.3,0.5,0.7} | road friction coefficient variation |
camberAngleDeg | 0 | Camber angle in [deg] |
mueRoad | tyreData.mue_nom |
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;
Name | Default | Description |
---|---|---|
R0 | 0.3 | undeformed radius of wheel [m] |
Rrim | 0.2 | radius of rim [m] |
width | 0.19 | width of wheel (>0) [m] |
m | 10 | mass of wheel [kg] |
Iyy | 1 | wheel inertia with respect to wheel axis [kg.m2] |
Ixx | 1 | wheel inertia with respect to axis perpendicular to wheel axis [kg.m2] |
c_x | 100000 | tyre spring constant in x-direction [N/m] |
c_y | 100000*0.9 | tyre spring constant in y-direction [N/m] |
c_z | 200000 | tyre spring constant in z-direction [N/m] |
d_x | 1500 | tyre damping constant in x-direction [N.s/m] |
d_y | 300 | tyre damping constant in y-direction [N.s/m] |
d_z | 300 | tyre damping constant in z-direction [N.s/m] |
mue_nom | 0.7 | friction coefficient of road for which tyre data is valid |
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;