Information
VehicleModels contains models which defines vehicle models in terms of equations, such as equations of motion. A registry from the previously described package is included in each vehicle model, so that the equations can use the vehicle parameters defined there and the vehicle parameters can be set for instances of the vehicle model. Note that no manoeuvre is defined so far.
Package Content
Name |
Description |
Functions
|
|
SingleTrack
|
Single-track model for lateral dynamics of articulated vehicles |
SingleTrack_SaturatedTyre
|
Single-track model for lateral dynamics of articulated vehicles |
SingleTrackRollDynamics
|
Single-track model for lateral dynamics of articulated vehicles with roll dynamics and tyre relaxation |
SingleTrackRollDynamicsNonLinTyre
|
Single-track model for lateral dynamics of articulated vehicles with roll dynamics and tyre relaxation |
DirectionInput
|
Single track model with direction of travel at front axle as input |
DirectionInput_SaturatedTyre
|
Single track model with direction of travel at front axle as input |
CurvatureInput
|
Steady-state curve |
VerticalForces
|
|
VerticalForcesRollDynamics
|
|
VerticalForcesRollDynamicsNonLinTyre
|
|
Roll
|
|
Longitudinal
|
|
LongitudinalAccelerationQS
|
Use max thrust force distributed on driving axles and solve for the highest inclination angle where the desired acceleration can be achieved |
LongitudinalAcceleration
|
Use max thrust force distributed on driving axles for dynamic simulation |
Single-track model for lateral dynamics of articulated vehicles
Parameters
Type | Name | Default | Description |
VehicleModel | paramSet | | |
Integer | mode | 1 | 1: Normal, 2: Non-inertial mode, no mass or inertia is considered, 3: Quasistatic, all derivatives are zero |
Integer | nu | paramSet.nu | Number of units |
Integer | na | paramSet.na | Max number of axles per unit |
Length | L[nu, na] | paramSet.L | Axle positions relative first axle of each unit [m] |
Force | Fz[nu, na] | paramSet.Fz | [N] |
Length | A[nu] | paramSet.A | Front coupling position relative first axle [m] |
Length | B[nu] | paramSet.B | Rear coupling position relative first axle [m] |
Length | FOH[nu] | paramSet.FOH | Front overhang relative first axle of each unit [m] |
Length | ROH[nu] | paramSet.ROH | Front overhang relative first axle of each unit [m] |
Angle | inclination | 0 | Lateral road inclination [rad] |
Boolean | driven[nu, na] | paramSet.driven | |
Inertia | Iz[nu] | paramSet.Iz | Inertias [kg.m2] |
Position | rx0[nu, na] | TM*[0; matrix(B[1:nu - 1] - ... | [m] |
Integer | TM[nu, nu] | Functions.tril(nu) | |
Length | rx0_oh[nu, 2] | cat(2, matrix(rx0[:, 1] + FO... | Initial position in x-dir of overhang. Front in first colume rear in second. Resolved from first units first axle [m] |
Connectors
Modelica definition
model SingleTrack
parameter VehicleParameters.Base.VehicleModel paramSet;
OpenPBS.VehicleModels.VerticalForces verticalForces(nu=nu,na=na,paramSet=paramSet);
parameter Integer mode=1
;
parameter Integer nu=paramSet.nu ;
parameter Integer na=paramSet.na ;
parameter Modelica.SIunits.Length[nu,na] L=paramSet.L
;
Modelica.SIunits.Length[nu] X=verticalForces.X
;
parameter Modelica.SIunits.Force[nu,na] Fz=paramSet.Fz;
parameter Modelica.SIunits.Length[nu] A=paramSet.A
;
parameter Modelica.SIunits.Length[nu] B=paramSet.B
;
parameter Modelica.SIunits.Length[nu] FOH=paramSet.FOH
;
parameter Modelica.SIunits.Length[nu] ROH=paramSet.ROH
;
parameter Modelica.SIunits.Angle inclination=0 ;
parameter Boolean[nu,na] driven=paramSet.driven;
Real[nu,na] C=paramSet.CCy0.*Fz
;
Modelica.SIunits.Mass[nu] m=verticalForces.m;
parameter Modelica.SIunits.Inertia[nu] Iz = paramSet.Iz ;
input Modelica.Blocks.Interfaces.RealInput delta_in
;
input Modelica.Blocks.Interfaces.RealInput vx_in
;
Modelica.Blocks.Interfaces.RealOutput vx_out[nu]=vx;
Modelica.Blocks.Interfaces.RealOutput vy_out[nu]=vy;
Modelica.Blocks.Interfaces.RealOutput wz_out[nu]=wz;
Modelica.Blocks.Interfaces.RealOutput ay_out[nu,na] =
matrix(d_vy)*
ones(1,na)+Lcog.*(
matrix(d_wz)*
ones(1,na))+(
matrix(wz)*
ones(1,na)).*(
matrix(vx)*
ones(1,na));
Modelica.Blocks.Interfaces.RealOutput ax_out[nu,na] =
matrix(d_vx)*
ones(1,na)-(
matrix(wz)*
ones(1,na)).*((
matrix(vy)*
ones(1,na))+Lcog.*(
matrix(wz)*
ones(1,na)));
Modelica.Blocks.Interfaces.RealOutput ry_out[nu,na]=ry;
Modelica.Blocks.Interfaces.RealOutput theta_out[nu-1]=theta;
Modelica.SIunits.Angle[nu,na] delta ;
Modelica.SIunits.Acceleration ax[nu] = d_vx-vy.*wz;
Modelica.SIunits.Acceleration ay[nu] = d_vy+vx.*wz;
Modelica.SIunits.AngularVelocity wz[nu](start=
zeros(nu)) ;
Modelica.SIunits.Velocity[nu] vy(start=
zeros(nu))
;
Modelica.SIunits.Velocity[nu] vx ;
Modelica.SIunits.Angle theta[nu-1] ;
Modelica.SIunits.Angle alpha[nu,na] ;
Modelica.SIunits.Force Fxd ;
Modelica.SIunits.Force Fxw[nu,na] ;
Modelica.SIunits.Force Fyw[nu,na] ;
Modelica.SIunits.Force Fx[nu,na] ;
Modelica.SIunits.Force Fy[nu,na] ;
Modelica.SIunits.Force Fcx[nu-1] ;
Modelica.SIunits.Force Fcy[nu-1] ;
Modelica.SIunits.Acceleration[nu] d_vx;
Modelica.SIunits.Acceleration[nu] d_vy;
Modelica.SIunits.AngularAcceleration[nu] d_wz;
Modelica.SIunits.AngularVelocity[nu-1] d_theta;
Modelica.SIunits.Length[nu,na] Lcog = L-
matrix(X)*
ones(1,na)
;
Modelica.SIunits.Length[nu] Bcog = B-X;
Modelica.SIunits.Length[nu] Acog = A-X;
parameter Modelica.SIunits.Position[nu,na] rx0=TM*[0;
matrix(B[1:nu-1]-A[2:nu])]*
ones(1,na)+L;
parameter Integer TM[nu,nu]=
Functions.tril(nu);
parameter Modelica.SIunits.Length[nu,2] rx0_oh=
cat(2,
matrix(rx0[:,1]+FOH),
matrix(rx0[:,1]+ROH))
;
Modelica.SIunits.Length[nu,2] Lcog_oh=
cat(2,
matrix(FOH-X),
matrix(ROH-X))
;
Modelica.SIunits.Position[nu,na] rx(start=rx0);
Modelica.SIunits.Position[nu,na] ry(start=
zeros(nu,na));
Modelica.SIunits.Angle[nu] pz;
output Real[nu,na] friction_usage=
sqrt(Fx.^2+Fy.^2)./verticalForces.Fz;
equation
if mode==1
then
d_vx=
der(vx);
d_vy=
der(vy);
d_wz=
der(wz);
d_theta=
der(theta);
elseif mode==2
then
d_vx=
zeros(nu);
d_vy=
zeros(nu);
d_wz=
zeros(nu);
d_theta=
der(theta);
else
d_vx=
zeros(nu);
d_vy=
zeros(nu);
d_wz=
zeros(nu);
d_theta=
zeros(nu-1);
end if;
vx[1] =
max(0.1,vx_in);
for i
in 1:nu
loop
for j
in 1:na
loop
if i==1
and j==1
then
delta[i,j]=delta_in;
else
delta[i,j]=0;
end if;
end for;
end for;
alpha = ((
matrix(vy)*
ones(1,na)+Lcog.*(
matrix(wz)*
ones(1,na)))./(
matrix(vx)*
ones(1,na))-delta);
for i
in 1:nu
loop
for j
in 1:na
loop
if driven[i,j]
then
Fxw[i,j]=Fxd;
else
Fxw[i,j]=0;
end if;
end for;
end for;
Fyw = -C.*alpha;
Fx = Fxw.*
cos(delta)-Fyw.*
sin(delta);
Fy =Fxw .*
sin(delta) + Fyw .*
cos(delta) -
sin(inclination)*verticalForces.Fz;
for i
in 1:nu-1
loop
vx[i+1] = vx[i]*
cos(theta[i])-(vy[i]+Bcog[i]*wz[i])*
sin(theta[i]);
vy[i+1]+Acog[i+1]*wz[i+1]=(vy[i]+Bcog[i]*wz[i])*
cos(theta[i])+vx[i]*
sin(theta[i]);
end for;
(
if mode==2
then zeros(nu)
else m).*(d_vx-vy.*wz)=
vector(Fx*
ones(na,1)-[
matrix(Fcx);0]+[0;
matrix(Fcx)].*
cos([0;
matrix(theta)])-[0;
matrix(Fcy)].*
sin([0;
matrix(theta)]));
(
if mode==2
then zeros(nu)
else m).*(d_vy+vx.*wz)=
vector(Fy*
ones(na,1)-[
matrix(Fcy);0]+[0;
matrix(Fcx)].*
sin([0;
matrix(theta)])+[0;
matrix(Fcy)].*
cos([0;
matrix(theta)]));
(
if mode==2
then zeros(nu)
else Iz).*d_wz =
vector(Lcog.*Fy*
ones(na,1)-
matrix(Bcog).*[
matrix(Fcy);0]+
matrix(Acog).*([0;
matrix(Fcx)].*
sin([0;
matrix(theta)])+[0;
matrix(Fcy)].*
cos([0;
matrix(theta)])));
d_theta = wz[1:(nu-1)]-wz[2:nu];
der(pz)=wz;
der(rx)=
matrix(vx)*
ones(1,na).*(
cos(
matrix(pz))*
ones(1,na))-(
matrix(vy)*
ones(1,na)+Lcog.*(
matrix(wz)*
ones(1,na))).*(
sin(
matrix(pz))*
ones(1,na));
der(ry)=
matrix(vx)*
ones(1,na).*(
sin(
matrix(pz))*
ones(1,na))+(
matrix(vy)*
ones(1,na)+Lcog.*(
matrix(wz)*
ones(1,na))).*(
cos(
matrix(pz))*
ones(1,na));
end SingleTrack;
Single-track model for lateral dynamics of articulated vehicles
Parameters
Type | Name | Default | Description |
VehicleModel | paramSet | | |
Integer | mode | 1 | 1: Normal, 2: Non-inertial mode, no mass or inertia is considered, 3: Quasistatic, all derivatives are zero |
Integer | nu | paramSet.nu | Number of units |
Integer | na | paramSet.na | Max number of axles per unit |
Length | L[nu, na] | paramSet.L | Axle positions relative first axle of each unit [m] |
Length | X[nu] | paramSet.X | C.g. position relative first axle [m] |
Length | A[nu] | paramSet.A | Front coupling position relative first axle [m] |
Length | B[nu] | paramSet.B | Rear coupling position relative first axle [m] |
Length | FOH[nu] | paramSet.FOH | Front overhang relative first axle of each unit [m] |
Length | ROH[nu] | paramSet.ROH | Front overhang relative first axle of each unit [m] |
Angle | inclination | 0 | Lateral road inclination [rad] |
Boolean | driven[nu, na] | paramSet.driven | |
Mass | m[nu] | paramSet.m | Masses [kg] |
Inertia | Iz[nu] | paramSet.Iz | Inertias [kg.m2] |
Length | Lcog[nu, na] | L - matrix(X)*ones(1, na) | Axle positions relative c.g. [m] |
Length | Bcog[nu] | B - X | [m] |
Length | Acog[nu] | A - X | [m] |
Position | rx0[nu, na] | TM*[0; matrix(B[1:nu - 1] - ... | [m] |
Integer | TM[nu, nu] | Functions.tril(nu) | |
Length | rx0_oh[nu, 2] | cat(2, matrix(rx0[:, 1] + FO... | Initial position in x-dir of overhang. Front in first colume rear in second. Resolved from first units first axle [m] |
Length | Lcog_oh[nu, 2] | cat(2, matrix(FOH - X), matr... | Position of overhang in x-dir from cog, one row for each unit [m] |
Real | mu | | Friction coefficient |
Connectors
Modelica definition
model SingleTrack_SaturatedTyre
parameter VehicleParameters.Base.VehicleModel paramSet;
OpenPBS.VehicleModels.VerticalForces verticalForces(nu=nu,na=na,paramSet=paramSet);
parameter Integer mode=1
;
parameter Integer nu=paramSet.nu ;
parameter Integer na=paramSet.na ;
parameter Modelica.SIunits.Length[nu,na] L=paramSet.L
;
parameter Modelica.SIunits.Length[nu] X=paramSet.X
;
parameter Modelica.SIunits.Length[nu] A=paramSet.A
;
parameter Modelica.SIunits.Length[nu] B=paramSet.B
;
parameter Modelica.SIunits.Length[nu] FOH=paramSet.FOH
;
parameter Modelica.SIunits.Length[nu] ROH=paramSet.ROH
;
parameter Modelica.SIunits.Angle inclination=0 ;
parameter Boolean[nu,na] driven=paramSet.driven;
Real[nu,na] C=paramSet.Cc.*verticalForces.Fz
;
parameter Modelica.SIunits.Mass[nu] m = paramSet.m ;
parameter Modelica.SIunits.Inertia[nu] Iz = paramSet.Iz ;
input Modelica.Blocks.Interfaces.RealInput delta_in
;
input Modelica.Blocks.Interfaces.RealInput vx_in
;
Modelica.Blocks.Interfaces.RealOutput vx_out[nu]=vx;
Modelica.Blocks.Interfaces.RealOutput vy_out[nu]=vy;
Modelica.Blocks.Interfaces.RealOutput wz_out[nu]=wz;
Modelica.Blocks.Interfaces.RealOutput ay_out[nu,na] =
matrix(d_vy)*
ones(1,na)+Lcog.*(
matrix(d_wz)*
ones(1,na))+(
matrix(wz)*
ones(1,na)).*(
matrix(vx)*
ones(1,na));
Modelica.Blocks.Interfaces.RealOutput ax_out[nu,na] =
matrix(d_vx)*
ones(1,na)-(
matrix(wz)*
ones(1,na)).*((
matrix(vy)*
ones(1,na))+Lcog.*(
matrix(wz)*
ones(1,na)));
Modelica.Blocks.Interfaces.RealOutput ry_out[nu,na]=ry;
Modelica.SIunits.Angle[nu,na] delta ;
Modelica.SIunits.Acceleration ax[nu] = d_vx-vy.*wz;
Modelica.SIunits.Acceleration ay[nu] = d_vy+vx.*wz;
Modelica.SIunits.AngularVelocity wz[nu](start=
zeros(nu)) ;
Modelica.SIunits.Velocity[nu] vy(start=
zeros(nu))
;
Modelica.SIunits.Velocity[nu] vx ;
Modelica.SIunits.Angle theta[nu-1] ;
Modelica.SIunits.Angle alpha[nu,na] ;
Modelica.SIunits.Force Fxd ;
Modelica.SIunits.Force Fxw[nu,na] ;
Modelica.SIunits.Force Fyw[nu,na] ;
Modelica.SIunits.Force Fx[nu,na] ;
Modelica.SIunits.Force Fy[nu,na] ;
Modelica.SIunits.Force Fcx[nu-1] ;
Modelica.SIunits.Force Fcy[nu-1] ;
Modelica.SIunits.Acceleration[nu] d_vx;
Modelica.SIunits.Acceleration[nu] d_vy;
Modelica.SIunits.AngularAcceleration[nu] d_wz;
Modelica.SIunits.AngularVelocity[nu-1] d_theta;
parameter Modelica.SIunits.Length[nu,na] Lcog = L-
matrix(X)*
ones(1,na)
;
parameter Modelica.SIunits.Length[nu] Bcog = B-X;
parameter Modelica.SIunits.Length[nu] Acog = A-X;
parameter Modelica.SIunits.Position[nu,na] rx0=TM*[0;
matrix(B[1:nu-1]-A[2:nu])]*
ones(1,na)+L;
parameter Integer TM[nu,nu]=
Functions.tril(nu);
parameter Modelica.SIunits.Length[nu,2] rx0_oh=
cat(2,
matrix(rx0[:,1]+FOH),
matrix(rx0[:,1]+ROH))
;
parameter Modelica.SIunits.Length[nu,2] Lcog_oh=
cat(2,
matrix(FOH-X),
matrix(ROH-X))
;
Modelica.SIunits.Position[nu,na] rx(start=rx0);
Modelica.SIunits.Position[nu,na] ry(start=
zeros(nu,na));
Modelica.SIunits.Angle[nu] pz;
output Real[nu,na] friction_usage=
sqrt(Fx.^2+Fy.^2)./verticalForces.Fz;
parameter Real mu ;
equation
if mode==1
then
d_vx=
der(vx);
d_vy=
der(vy);
d_wz=
der(wz);
d_theta=
der(theta);
elseif mode==2
then
d_vx=
zeros(nu);
d_vy=
zeros(nu);
d_wz=
zeros(nu);
d_theta=
der(theta);
else
d_vx=
zeros(nu);
d_vy=
zeros(nu);
d_wz=
zeros(nu);
d_theta=
zeros(nu-1);
end if;
vx[1] =
max(0.1,vx_in);
for i
in 1:nu
loop
for j
in 1:na
loop
if i==1
and j==1
then
delta[i,j]=delta_in;
else
delta[i,j]=0;
end if;
end for;
end for;
alpha = ((
matrix(vy)*
ones(1,na)+Lcog.*(
matrix(wz)*
ones(1,na)))./(
matrix(vx)*
ones(1,na))-delta);
for i
in 1:nu
loop
for j
in 1:na
loop
if driven[i, j]
then
Fxw[i, j] = Fxd;
else
Fxw[i, j] = 0;
end if;
end for;
end for;
for i
in 1:nu
loop
for j
in 1:na
loop
if driven[i, j]
then
Fyw[i, j] = -
sign(alpha[i, j])*
min(C[i, j]*
abs(alpha[i, j]), mu*verticalForces.Fz[i, j])*
sqrt(1-((Fyw[i, j]/(mu*verticalForces.Fz[i, j]))^2));
else
Fyw[i, j] = -
sign(alpha[i, j])*
min(C[i, j]*
abs(alpha[i, j]), mu*verticalForces.Fz[i, j]);
end if;
end for;
end for;
Fx = Fxw .*
cos(delta) - Fyw .*
sin(delta);
Fy = Fxw .*
sin(delta) + Fyw .*
cos(delta) -
sin(inclination)*verticalForces.Fz;
for i
in 1:nu-1
loop
vx[i+1] = vx[i]*
cos(theta[i])-(vy[i]+Bcog[i]*wz[i])*
sin(theta[i]);
vy[i+1]+Acog[i+1]*wz[i+1]=(vy[i]+Bcog[i]*wz[i])*
cos(theta[i])+vx[i]*
sin(theta[i]);
end for;
(
if mode==2
then zeros(nu)
else m).*(d_vx-vy.*wz)=
vector(Fx*
ones(na,1)-[
matrix(Fcx);0]+[0;
matrix(Fcx)].*
cos([0;
matrix(theta)])-[0;
matrix(Fcy)].*
sin([0;
matrix(theta)]));
(
if mode==2
then zeros(nu)
else m).*(d_vy+vx.*wz)=
vector(Fy*
ones(na,1)-[
matrix(Fcy);0]+[0;
matrix(Fcx)].*
sin([0;
matrix(theta)])+[0;
matrix(Fcy)].*
cos([0;
matrix(theta)]));
(
if mode==2
then zeros(nu)
else I).*d_wz =
vector(Lcog.*Fy*
ones(na,1)-
matrix(Bcog).*[
matrix(Fcy);0]+
matrix(Acog).*([0;
matrix(Fcx)].*
sin([0;
matrix(theta)])+[0;
matrix(Fcy)].*
cos([0;
matrix(theta)])));
d_theta = wz[1:(nu-1)]-wz[2:nu];
der(pz)=wz;
der(rx)=
matrix(vx)*
ones(1,na).*(
cos(
matrix(pz))*
ones(1,na))-(
matrix(vy)*
ones(1,na)+Lcog.*(
matrix(wz)*
ones(1,na))).*(
sin(
matrix(pz))*
ones(1,na));
der(ry)=
matrix(vx)*
ones(1,na).*(
sin(
matrix(pz))*
ones(1,na))+(
matrix(vy)*
ones(1,na)+Lcog.*(
matrix(wz)*
ones(1,na))).*(
cos(
matrix(pz))*
ones(1,na));
end SingleTrack_SaturatedTyre;
Single-track model for lateral dynamics of articulated vehicles with roll dynamics and tyre relaxation
Parameters
Type | Name | Default | Description |
VehicleModelRollDynamics | paramSet | | |
Angle | inclination | 0 | Lateral road inclination [rad] |
Integer | nu | paramSet.nu | Number of units |
Integer | na | paramSet.na | Max number of axles per unit |
Length | L[nu, na] | paramSet.L | Axle positions relative first axle of each unit [m] |
Length | W[nu, na] | paramSet.W | Axle track width [m] |
Length | A[nu] | paramSet.A | Front coupling position relative first axle [m] |
Length | B[nu] | paramSet.B | Rear coupling position relative first axle [m] |
Length | FOH[nu] | paramSet.FOH | Front overhang relative first axle of each unit [m] |
Length | ROH[nu] | paramSet.ROH | Front overhang relative first axle of each unit [m] |
Position | h[nu] | paramSet.h | Units centre of gravity height [m] |
Position | hRC[nu] | paramSet.hRC | Units Roll Centre height [m] |
Position | hC[nu - 1] | paramSet.hC | Coupling height between units [m] |
Real | ks[nu, na] | paramSet.ks | Suspension roll stiffness |
Real | cs[nu, na] | paramSet.cs | Suspension roll dampening |
Boolean | driven[nu, na] | paramSet.driven | Driven axles in vehicle combination |
Length | Lr[nu, na] | paramSet.Lr | Relaxation length [m] |
Inertia | Iz[nu] | paramSet.Iz | Inertias in yaw plane [kg.m2] |
Inertia | Ix[nu] | paramSet.Ix | Inertias in roll plane [kg.m2] |
Position | rx0[nu, na] | TM*[0; matrix(B[1:nu - 1] - ... | [m] |
Integer | TM[nu, nu] | Functions.tril(nu) | |
Length | rx0_oh[nu, 2] | cat(2, matrix(rx0[:, 1] + FO... | Initial position in x-dir of overhang. Front in first colume rear in second. Resolved from first units first axle [m] |
Force | Fz[nu, na] | paramSet.Fz | [N] |
Real | Kcr[nu - 1] | paramSet.Kcr | Coupling roll stiffness |
Real | Ccr[nu - 1] | paramSet.Ccr | Coupling roll damping |
Connectors
Modelica definition
model SingleTrackRollDynamics
parameter VehicleParameters.Base.VehicleModelRollDynamics paramSet;
OpenPBS.VehicleModels.VerticalForcesRollDynamics verticalForcesRollDynamics(nu=nu,na=na,paramSet=paramSet);
parameter Modelica.SIunits.Angle inclination=0 ;
parameter Integer nu=paramSet.nu ;
parameter Integer na=paramSet.na ;
parameter Modelica.SIunits.Length[nu,na] L=paramSet.L ;
parameter Modelica.SIunits.Length[nu,na] W=paramSet.W ;
Modelica.SIunits.Length[nu] X=verticalForcesRollDynamics.X ;
parameter Modelica.SIunits.Length[nu] A=paramSet.A ;
parameter Modelica.SIunits.Length[nu] B=paramSet.B ;
parameter Modelica.SIunits.Length[nu] FOH=paramSet.FOH ;
parameter Modelica.SIunits.Length[nu] ROH=paramSet.ROH ;
parameter Modelica.SIunits.Position[nu] h = paramSet.h ;
parameter Modelica.SIunits.Position[nu] hRC = paramSet.hRC ;
parameter Modelica.SIunits.Position[nu-1] hC = paramSet.hC ;
parameter Real[nu,na] ks = paramSet.ks ;
parameter Real[nu,na] cs = paramSet.cs ;
parameter Boolean[nu,na] driven=paramSet.driven ;
Real[nu,na] C=paramSet.CCy0.*Fz ;
parameter Modelica.SIunits.Length[nu,na] Lr=paramSet.Lr ;
Modelica.SIunits.Mass[nu] m = verticalForcesRollDynamics.m ;
parameter Modelica.SIunits.Inertia[nu] Iz = paramSet.Iz ;
parameter Modelica.SIunits.Inertia[nu] Ix = paramSet.Ix ;
input Modelica.Blocks.Interfaces.RealInput delta_in
;
input Modelica.Blocks.Interfaces.RealInput vx_in
;
Modelica.Blocks.Interfaces.RealOutput vx_out[nu]=vx;
Modelica.Blocks.Interfaces.RealOutput vys_out[nu]=vys;
Modelica.Blocks.Interfaces.RealOutput wz_out[nu]=wz;
Modelica.Blocks.Interfaces.RealOutput ay_out[nu,na] =
matrix(d_vys)*
ones(1,na)+Lcog.*(
matrix(d_wz)*
ones(1,na))+(
matrix(wz)*
ones(1,na)).*(
matrix(vx)*
ones(1,na));
Modelica.Blocks.Interfaces.RealOutput ax_out[nu,na] =
matrix(d_vx)*
ones(1,na)-(
matrix(wz)*
ones(1,na)).*((
matrix(vys)*
ones(1,na))+Lcog.*(
matrix(wz)*
ones(1,na)));
Modelica.Blocks.Interfaces.RealOutput ry_out[nu,na]=ry;
Modelica.Blocks.Interfaces.RealOutput LLT_out=LoadTransferRatio[
end];
Modelica.Blocks.Interfaces.RealOutput theta_out[nu-1]=theta;
Modelica.SIunits.Angle[nu,na] delta ;
Modelica.SIunits.Acceleration ax[nu] = d_vx-vys.*wz;
Modelica.SIunits.Acceleration ay[nu] = d_vys+vx.*wz;
Modelica.SIunits.AngularVelocity wz[nu](start=
zeros(nu)) ;
Modelica.SIunits.Velocity[nu] vys(start=
zeros(nu)) ;
Modelica.SIunits.Velocity[nu] vx ;
Modelica.SIunits.Angle theta[nu-1] ;
Modelica.SIunits.Angle alpha[nu,na] ;
Modelica.SIunits.Force Fxd ;
Modelica.SIunits.Force Fxw[nu,na] ;
Modelica.SIunits.Force Fyw[nu,na] ;
Modelica.SIunits.Force Fx[nu,na] ;
Modelica.SIunits.Force Fy[nu,na] ;
Modelica.SIunits.Force Fcx[nu-1] ;
Modelica.SIunits.Force Fcy[nu-1] ;
Modelica.SIunits.Length[nu,na] Lcog = L-
matrix(X)*
ones(1,na) ;
Modelica.SIunits.Length[nu] Bcog = B-X ;
Modelica.SIunits.Length[nu] Acog = A-X ;
parameter Modelica.SIunits.Position[nu,na] rx0=TM*[0;
matrix(B[1:nu-1]-A[2:nu])]*
ones(1,na)+L;
parameter Integer TM[nu,nu]=
Functions.tril(nu);
Modelica.SIunits.Acceleration[nu] d_vx;
Modelica.SIunits.Acceleration[nu] d_vys;
Modelica.SIunits.AngularAcceleration[nu] d_wz;
Modelica.SIunits.AngularVelocity[nu-1] d_theta;
parameter Modelica.SIunits.Length[nu,2] rx0_oh=
cat(2,
matrix(rx0[:,1]+FOH),
matrix(rx0[:,1]+ROH)) ;
Modelica.SIunits.Length[nu,2] Lcog_oh=
cat(2,
matrix(FOH-X),
matrix(ROH-X)) ;
Modelica.SIunits.Position[nu,na] rx(start=rx0);
Modelica.SIunits.Position[nu,na] ry(start=
zeros(nu,na));
Modelica.SIunits.Angle[nu] pz;
output Real[nu,na] friction_usage=
sqrt(Fx.^2+Fy.^2)./Fz;
Modelica.SIunits.Position[nu] xs ;
Modelica.SIunits.Position[nu] xu ;
Modelica.SIunits.Position[nu] ys ;
Modelica.SIunits.Position[nu] yu ;
Modelica.SIunits.Velocity[nu] vyu ;
Modelica.SIunits.AngularVelocity[nu] wx ;
Modelica.SIunits.Torque[nu] Mxs ;
Modelica.SIunits.Torque[nu] Mxd ;
Modelica.SIunits.Torque[nu] Mx ;
Modelica.SIunits.Force[nu] FzUnitRight ;
Modelica.SIunits.Force[nu] FzUnitLeft ;
Modelica.SIunits.Force[nu,na] FzAxleRight ;
Modelica.SIunits.Force[nu,na] FzAxleLeft ;
Modelica.SIunits.Angle[nu] px ;
Real[nu,na] ALR ;
Real[nu] LoadTransferRatio ;
Real[nu] d_px;
Real[nu] d_wx;
Real[nu] d_Mxs;
Real[nu,na] delta_z;
parameter Modelica.SIunits.Force[nu,na] Fz=paramSet.Fz;
final parameter Real[nu] ksSum=
vector(ks*
ones(na,1));
final parameter Real[nu] csSum=
vector(cs*
ones(na,1));
Modelica.SIunits.Torque[nu-1] Mxc ;
Modelica.SIunits.Angle[nu+1,1] Delta_px1;
Modelica.SIunits.Angle[nu-1,1] Delta_px2;
parameter Real[nu-1] Kcr=paramSet.Kcr ;
parameter Real[nu-1] Ccr=paramSet.Ccr ;
equation
der(xs) = vx .*
cos(pz) - vys .*
sin(pz);
der(ys) = vys .*
cos(pz) + vx .*
sin(pz);
der(xu) = vx .*
cos(pz) - vyu .*
sin(pz);
der(yu) = vyu .*
cos(pz) + vx .*
sin(pz);
d_vx =
der(vx);
d_vys =
der(vys);
d_wz =
der(wz);
d_theta =
der(theta);
vx[1] =
max(0.1,vx_in);
for i
in 1:nu
loop
for j
in 1:na
loop
if i==1
and j==1
then
delta[i,j]=delta_in;
else
delta[i,j]=0;
end if;
end for;
end for;
alpha + delta = (
matrix(vyu) *
ones(1,na) + Lcog .* (
matrix(wz) *
ones(1,na))) ./ (
matrix(vx) *
ones(1,na));
for i
in 1:nu
loop
for j
in 1:na
loop
if driven[i,j]
then
Fxw[i,j]=Fxd;
else
Fxw[i,j]=0;
end if;
end for;
end for;
for i
in 1:nu
loop
for j
in 1:na
loop
if i==1
and j==1
then
Fyw[i,j] = -C[i,j] .* alpha[i,j];
else
der(Fyw[i,j])= ALR[i,j] * ((-C[i,j] * alpha[i,j])-Fyw[i,j]);
end if;
end for;
end for;
ALR=
matrix(
abs(vx))*
ones(1,na)./ Lr;
Fx = Fxw .*
cos(delta) - Fyw .*
sin(delta);
Fy = Fxw .*
sin(delta) + Fyw .*
cos(delta) -
sin(inclination) * Fz;
for i
in 1:nu-1
loop
vx[i+1] = vx[i] *
cos(theta[i]) - (vys[i] + Bcog[i] * wz[i] + (hC[i] - hRC[i]) * wx[i]) *
sin(theta[i]);
vys[i+1] + Acog[i+1] * wz[i+1] + (hC[i] - hRC[i+1]) * wx[i+1] = (vys[i] + Bcog[i] * wz[i] + (hC[i] - hRC[i]) * wx[i]) *
cos(theta[i]) + vx[i] *
sin(theta[i]);
end for;
m .* (d_vx - vys .* wz) =
vector(Fx *
ones(na,1) - [
matrix(Fcx);0] + [0;
matrix(Fcx)] .*
cos([0;
matrix(theta)]) - [0;
matrix(Fcy)] .*
sin([0;
matrix(theta)]));
m .* (d_vys + vx .* wz) =
vector(Fy *
ones(na,1) - [
matrix(Fcy);0] + [0;
matrix(Fcx)] .*
sin([0;
matrix(theta)]) + [0;
matrix(Fcy)] .*
cos([0;
matrix(theta)]));
Iz .* d_wz =
vector(Lcog .* Fy *
ones(na,1) -
matrix(Bcog) .* [
matrix(Fcy);0] +
matrix(Acog) .* ([0;
matrix(Fcx)] .*
sin([0;
matrix(theta)]) + [0;
matrix(Fcy)] .*
cos([0;
matrix(theta)])));
d_theta = wz[1:(nu-1)] - wz[2:nu];
der(pz) = wz;
der(rx) =
matrix(vx) *
ones(1,na) .* (
cos(
matrix(pz)) *
ones(1,na)) - (
matrix(vys) *
ones(1,na) + Lcog .* (
matrix(wz) *
ones(1,na))) .* (
sin(
matrix(pz)) *
ones(1,na));
der(ry) =
matrix(vx) *
ones(1,na) .* (
sin(
matrix(pz)) *
ones(1,na)) + (
matrix(vys) *
ones(1,na) + Lcog .* (
matrix(wz) *
ones(1,na))) .* (
cos(
matrix(pz)) *
ones(1,na));
d_px =
der(px);
d_wx =
der(wx);
d_Mxs =
der(Mxs);
Mxs + Mxd =
vector(
matrix(Mx) + Fy *
ones(na,1) .*
matrix(hRC));
d_px = wx;
vyu =
vector(
matrix(vys) +
matrix(wx) .* (
matrix(h) -
matrix(hRC)));
Ix .* d_wx =
vector(
matrix(Mx) + Fy *
ones(na,1) .*
matrix(h) +
matrix(m) .*
matrix(
fill(9.81, nu, 1)) .*
matrix(h - hRC) .*
matrix(px) +
matrix([Fcy;0]) .* (
matrix(h) -
matrix([hC;0])) +
matrix([0;
sin(theta) .* Fcy +
cos(theta) .* Fcx]) .* (
matrix(h) -
matrix([0;hC]))+
matrix([Mxc;0])-
matrix([0;Mxc]));
d_Mxs = -ksSum .* wx;
Mxd = -csSum .* wx;
Delta_px1=[0;
matrix(px)]-[
matrix(px);0];
Delta_px2=
matrix(Delta_px1[2:
end-1,1]);
Mxc=-Ccr.*
vector(
der(Delta_px2))-Kcr.*
vector(Delta_px2);
der(delta_z) + W .* delta_z =ks .* (
matrix(px) *
ones(1,na)) + cs .* (
matrix(d_px) *
ones(1,na)) + Fy .* (
matrix(h)*
ones(1,na));
FzAxleRight=(Fz./2).+delta_z;
FzAxleLeft=(Fz./2).-delta_z;
FzUnitRight=
vector(FzAxleRight*
ones(na,1));
FzUnitLeft=
vector(FzAxleLeft*
ones(na,1));
LoadTransferRatio=(FzUnitRight-FzUnitLeft)./(FzUnitRight+FzUnitLeft);
end SingleTrackRollDynamics;
Single-track model for lateral dynamics of articulated vehicles with roll dynamics and tyre relaxation
Parameters
Type | Name | Default | Description |
VehicleModelRollDynamicsNonLinTyre | paramSet | | |
Angle | inclination | 0 | Lateral road inclination [rad] |
Integer | nu | paramSet.nu | Number of units |
Integer | na | paramSet.na | Max number of axles per unit |
Length | L[nu, na] | paramSet.L | Axle positions relative first axle of each unit [m] |
Length | W[nu, na] | paramSet.W | Axle track width [m] |
Length | A[nu] | paramSet.A | Front coupling position relative first axle [m] |
Length | B[nu] | paramSet.B | Rear coupling position relative first axle [m] |
Length | FOH[nu] | paramSet.FOH | Front overhang relative first axle of each unit [m] |
Length | ROH[nu] | paramSet.ROH | Front overhang relative first axle of each unit [m] |
Position | h[nu] | paramSet.h | Units centre of gravity height [m] |
Position | hRC[nu] | paramSet.hRC | Units Roll Centre height [m] |
Position | hC[nu - 1] | paramSet.hC | Coupling height between units [m] |
Real | ks[nu, na] | paramSet.ks | Suspension roll stiffness |
Real | cs[nu, na] | paramSet.cs | Suspension roll dampening |
Boolean | driven[nu, na] | paramSet.driven | Driven axles in vehicle combination |
Inertia | Iz[nu] | paramSet.Iz | Inertias in yaw plane [kg.m2] |
Inertia | Ix[nu] | paramSet.Ix | Inertias in roll plane [kg.m2] |
Position | rx0[nu, na] | TM*[0; matrix(B[1:nu - 1] - ... | [m] |
Integer | TM[nu, nu] | Functions.tril(nu) | |
Length | rx0_oh[nu, 2] | cat(2, matrix(rx0[:, 1] + FO... | Initial position in x-dir of overhang. Front in first colume rear in second. Resolved from first units first axle [m] |
Force | Fz[nu, na] | paramSet.Fz | [N] |
Real | Kcr[nu - 1] | paramSet.Kcr | Coupling roll stiffness |
Real | Ccr[nu - 1] | paramSet.Ccr | Coupling roll damping |
Length | Lr[nu, na] | paramSet.Lr | Relaxation length [m] |
Force | FZT0[nu, na] | paramSet.FZT0 | Tyre static load on each indicidual axle [N] |
Real | uy0[nu, na] | paramSet.uy0 | Maximum lateral force coefficient at nominal vertical tyre force |
Real | ugy[nu, na] | paramSet.ugy | Maximum lateral force gradient |
Real | u2[nu, na] | paramSet.u2 | Slide friction ratio |
Real | CCy0[nu, na] | paramSet.CCy0 | Tyre cornering coefficient on each individual axle at nominal tyre force |
Real | ccgy[nu, na] | paramSet.ccgy | Maximum cornering coefficient gradient |
Connectors
Modelica definition
model SingleTrackRollDynamicsNonLinTyre
parameter VehicleParameters.Base.VehicleModelRollDynamicsNonLinTyre paramSet;
OpenPBS.VehicleModels.VerticalForcesRollDynamicsNonLinTyre verticalForcesRollDynamicsNonLinTyre(nu=nu,na=na,paramSet=paramSet);
parameter Modelica.SIunits.Angle inclination=0 ;
parameter Integer nu=paramSet.nu ;
parameter Integer na=paramSet.na ;
parameter Modelica.SIunits.Length[nu,na] L=paramSet.L ;
parameter Modelica.SIunits.Length[nu,na] W=paramSet.W ;
Modelica.SIunits.Length[nu] X=verticalForcesRollDynamicsNonLinTyre.X ;
parameter Modelica.SIunits.Length[nu] A=paramSet.A ;
parameter Modelica.SIunits.Length[nu] B=paramSet.B ;
parameter Modelica.SIunits.Length[nu] FOH=paramSet.FOH ;
parameter Modelica.SIunits.Length[nu] ROH=paramSet.ROH ;
parameter Modelica.SIunits.Position[nu] h = paramSet.h ;
parameter Modelica.SIunits.Position[nu] hRC = paramSet.hRC ;
parameter Modelica.SIunits.Position[nu-1] hC = paramSet.hC ;
parameter Real[nu,na] ks = paramSet.ks ;
parameter Real[nu,na] cs = paramSet.cs ;
parameter Boolean[nu,na] driven=paramSet.driven ;
Modelica.SIunits.Mass[nu] m = verticalForcesRollDynamicsNonLinTyre.m ;
parameter Modelica.SIunits.Inertia[nu] Iz = paramSet.Iz ;
parameter Modelica.SIunits.Inertia[nu] Ix = paramSet.Ix ;
input Modelica.Blocks.Interfaces.RealInput delta_in
;
input Modelica.Blocks.Interfaces.RealInput vx_in
;
Modelica.Blocks.Interfaces.RealOutput vx_out[nu]=vx;
Modelica.Blocks.Interfaces.RealOutput vys_out[nu]=vys;
Modelica.Blocks.Interfaces.RealOutput wz_out[nu]=wz;
Modelica.Blocks.Interfaces.RealOutput ay_out[nu,na] =
matrix(d_vys)*
ones(1,na)+Lcog.*(
matrix(d_wz)*
ones(1,na))+(
matrix(wz)*
ones(1,na)).*(
matrix(vx)*
ones(1,na));
Modelica.Blocks.Interfaces.RealOutput ax_out[nu,na] =
matrix(d_vx)*
ones(1,na)-(
matrix(wz)*
ones(1,na)).*((
matrix(vys)*
ones(1,na))+Lcog.*(
matrix(wz)*
ones(1,na)));
Modelica.Blocks.Interfaces.RealOutput ry_out[nu,na]=ry;
Modelica.Blocks.Interfaces.RealOutput LLT_out=LoadTransferRatio[
end];
Modelica.Blocks.Interfaces.RealOutput theta_out[nu-1]=theta;
Modelica.SIunits.Angle[nu,na] delta ;
Modelica.SIunits.Acceleration ax[nu] = d_vx-vys.*wz;
Modelica.SIunits.Acceleration ay[nu] = d_vys+vx.*wz;
Modelica.SIunits.AngularVelocity wz[nu](start=
zeros(nu)) ;
Modelica.SIunits.Velocity[nu] vys(start=
zeros(nu)) ;
Modelica.SIunits.Velocity[nu] vx ;
Modelica.SIunits.Angle theta[nu-1] ;
Modelica.SIunits.Angle alpha[nu,na] ;
Modelica.SIunits.Force Fxd ;
Modelica.SIunits.Force Fxw[nu,na] ;
Modelica.SIunits.Force Fyw[nu,na] ;
Modelica.SIunits.Force Fx[nu,na] ;
Modelica.SIunits.Force Fy[nu,na] ;
Modelica.SIunits.Force Fcx[nu-1] ;
Modelica.SIunits.Force Fcy[nu-1] ;
Modelica.SIunits.Length[nu,na] Lcog = L-
matrix(X)*
ones(1,na) ;
Modelica.SIunits.Length[nu] Bcog = B-X ;
Modelica.SIunits.Length[nu] Acog = A-X ;
parameter Modelica.SIunits.Position[nu,na] rx0=TM*[0;
matrix(B[1:nu-1]-A[2:nu])]*
ones(1,na)+L;
parameter Integer TM[nu,nu]=
Functions.tril(nu);
Modelica.SIunits.Acceleration[nu] d_vx;
Modelica.SIunits.Acceleration[nu] d_vys;
Modelica.SIunits.AngularAcceleration[nu] d_wz;
Modelica.SIunits.AngularVelocity[nu-1] d_theta;
parameter Modelica.SIunits.Length[nu,2] rx0_oh=
cat(2,
matrix(rx0[:,1]+FOH),
matrix(rx0[:,1]+ROH)) ;
Modelica.SIunits.Length[nu,2] Lcog_oh=
cat(2,
matrix(FOH-X),
matrix(ROH-X)) ;
Modelica.SIunits.Position[nu,na] rx(start=rx0);
Modelica.SIunits.Position[nu,na] ry(start=
zeros(nu,na));
Modelica.SIunits.Angle[nu] pz;
constant Modelica.SIunits.Force F_eps=Modelica.Constants.eps ;
output Real[nu,na] friction_usage;
Modelica.SIunits.Position[nu] xs ;
Modelica.SIunits.Position[nu] xu ;
Modelica.SIunits.Position[nu] ys ;
Modelica.SIunits.Position[nu] yu ;
Modelica.SIunits.Velocity[nu] vyu ;
Modelica.SIunits.AngularVelocity[nu] wx ;
Modelica.SIunits.Torque[nu] Mxs ;
Modelica.SIunits.Torque[nu] Mxd ;
Modelica.SIunits.Torque[nu] Mx ;
Modelica.SIunits.Force[nu] FzUnitRight ;
Modelica.SIunits.Force[nu] FzUnitLeft ;
Modelica.SIunits.Force[nu,na] FzAxleRight ;
Modelica.SIunits.Force[nu,na] FzAxleLeft ;
Modelica.SIunits.Angle[nu] px ;
Real[nu] LoadTransferRatio ;
Real[nu] d_px;
Real[nu] d_wx;
Real[nu] d_Mxs;
Real[nu,na] delta_z;
parameter Modelica.SIunits.Force[nu,na] Fz=paramSet.Fz;
final parameter Real[nu] ksSum=
vector(ks*
ones(na,1));
final parameter Real[nu] csSum=
vector(cs*
ones(na,1));
Modelica.SIunits.Torque[nu-1] Mxc ;
Modelica.SIunits.Angle[nu+1,1] Delta_px1;
Modelica.SIunits.Angle[nu-1,1] Delta_px2;
parameter Real[nu-1] Kcr=paramSet.Kcr ;
parameter Real[nu-1] Ccr=paramSet.Ccr ;
parameter Modelica.SIunits.Length[nu,na] Lr=paramSet.Lr ;
parameter Modelica.SIunits.Force[nu,na] FZT0=paramSet.FZT0 ;
parameter Real[nu,na] uy0=paramSet.uy0 ;
parameter Real[nu,na] ugy=paramSet.ugy ;
parameter Real[nu,na] u2=paramSet.u2 ;
parameter Real[nu,na] CCy0=paramSet.CCy0 ;
parameter Real[nu,na] ccgy=paramSet.ccgy ;
Modelica.SIunits.Force[nu,na] FZT_l ;
Modelica.SIunits.Force[nu,na] FZT_r ;
Modelica.SIunits.Force[nu,na] FYT_l ;
Modelica.SIunits.Force[nu,na] FYT_r ;
Modelica.SIunits.Angle[nu,na] alpha_dot ;
Real[nu,na] CCy_l ;
Real[nu,na] CCy_r ;
Real[nu,na] uy_l ;
Real[nu,na] uy_r ;
Real[nu,na] C ;
equation
for i
in 1:nu
loop
for j
in 1:na
loop
friction_usage[i,j]=
sqrt(Fy[i,j]^2+Fx[i,j]^2)./(
max(Fz[i,j],F_eps));
end for;
end for;
der(xs) = vx .*
cos(pz) - vys .*
sin(pz);
der(ys) = vys .*
cos(pz) + vx .*
sin(pz);
der(xu) = vx .*
cos(pz) - vyu .*
sin(pz);
der(yu) = vyu .*
cos(pz) + vx .*
sin(pz);
d_vx =
der(vx);
d_vys =
der(vys);
d_wz =
der(wz);
d_theta =
der(theta);
vx[1] =
max(0.1,vx_in);
for i
in 1:nu
loop
for j
in 1:na
loop
if i==1
and j==1
then
delta[i,j]=delta_in;
else
delta[i,j]=0;
end if;
end for;
end for;
alpha + delta = (
matrix(vyu) *
ones(1,na) + Lcog .* (
matrix(wz) *
ones(1,na))) ./ (
matrix(vx) *
ones(1,na));
for i
in 1:nu
loop
for j
in 1:na
loop
if driven[i,j]
then
Fxw[i,j]=Fxd;
else
Fxw[i,j]=0;
end if;
end for;
end for;
for i
in 1:nu
loop
for j
in 1:na
loop
if FzAxleRight[i,j] >= 0
then
FZT_r[i,j] = FzAxleRight[i,j];
else
FZT_r[i,j] = 0;
end if;
end for;
end for;
for i
in 1:nu
loop
for j
in 1:na
loop
if FzAxleLeft[i,j] >= 0
then
FZT_l[i,j] = FzAxleLeft[i,j];
else
FZT_l[i,j] = 0;
end if;
end for;
end for;
der(alpha_dot)=((
matrix(vx)*
ones(1,na))./Lr) .* (alpha - alpha_dot);
for i
in 1:nu
loop
for j
in 1:na
loop
if i==1
and j==1
then
FYT_l[i,j]=FZT_l[i,j] .* uy_l[i,j] .*
sin( C[i,j] .*
atan(CCy_l[i,j] ./ (C[i,j] .* uy_l[i,j]) .* alpha[i,j]));
FYT_r[i,j]=FZT_r[i,j] .* uy_r[i,j] .*
sin( C[i,j] .*
atan(CCy_r[i,j] ./ (C[i,j] .* uy_r[i,j]) .* alpha[i,j]));
else
FYT_l[i,j]=FZT_l[i,j] .* uy_l[i,j] .*
sin( C[i,j] .*
atan(CCy_l[i,j] ./ (C[i,j] .* uy_l[i,j]) .* alpha_dot[i,j]));
FYT_r[i,j]=FZT_r[i,j] .* uy_r[i,j] .*
sin( C[i,j] .*
atan(CCy_r[i,j] ./ (C[i,j] .* uy_r[i,j]) .* alpha_dot[i,j]));
end if;
end for;
end for;
C = 2.*(1 .+
asin(u2)./Modelica.Constants.pi);
uy_l = uy0 .* ((
ones(nu,na) + ugy .* ((FZT_l-FZT0)./(FZT0))));
uy_r = uy0 .* ((
ones(nu,na) + ugy .* ((FZT_r-FZT0)./(FZT0))));
CCy_l = CCy0 .* ((
ones(nu,na) + ccgy .* ((FZT_l-FZT0)./(FZT0))));
CCy_r = CCy0 .* ((
ones(nu,na) + ccgy .* ((FZT_r-FZT0)./(FZT0))));
Fyw=-(FYT_l+FYT_r);
Fx = Fxw .*
cos(delta) - Fyw .*
sin(delta);
Fy = Fxw .*
sin(delta) + Fyw .*
cos(delta) -
sin(inclination) * Fz;
for i
in 1:nu-1
loop
vx[i+1] = vx[i] *
cos(theta[i]) - (vys[i] + Bcog[i] * wz[i] + (hC[i] - hRC[i]) * wx[i]) *
sin(theta[i]);
vys[i+1] + Acog[i+1] * wz[i+1] + (hC[i] - hRC[i+1]) * wx[i+1] = (vys[i] + Bcog[i] * wz[i] + (hC[i] - hRC[i]) * wx[i]) *
cos(theta[i]) + vx[i] *
sin(theta[i]);
end for;
m .* (d_vx - vys .* wz) =
vector(Fx *
ones(na,1) - [
matrix(Fcx);0] + [0;
matrix(Fcx)] .*
cos([0;
matrix(theta)]) - [0;
matrix(Fcy)] .*
sin([0;
matrix(theta)]));
m .* (d_vys + vx .* wz) =
vector(Fy *
ones(na,1) - [
matrix(Fcy);0] + [0;
matrix(Fcx)] .*
sin([0;
matrix(theta)]) + [0;
matrix(Fcy)] .*
cos([0;
matrix(theta)]));
Iz .* d_wz =
vector(Lcog .* Fy *
ones(na,1) -
matrix(Bcog) .* [
matrix(Fcy);0] +
matrix(Acog) .* ([0;
matrix(Fcx)] .*
sin([0;
matrix(theta)]) + [0;
matrix(Fcy)] .*
cos([0;
matrix(theta)])));
d_theta = wz[1:(nu-1)] - wz[2:nu];
der(pz) = wz;
der(rx) =
matrix(vx) *
ones(1,na) .* (
cos(
matrix(pz)) *
ones(1,na)) - (
matrix(vys) *
ones(1,na) + Lcog .* (
matrix(wz) *
ones(1,na))) .* (
sin(
matrix(pz)) *
ones(1,na));
der(ry) =
matrix(vx) *
ones(1,na) .* (
sin(
matrix(pz)) *
ones(1,na)) + (
matrix(vys) *
ones(1,na) + Lcog .* (
matrix(wz) *
ones(1,na))) .* (
cos(
matrix(pz)) *
ones(1,na));
d_px =
der(px);
d_wx =
der(wx);
d_Mxs =
der(Mxs);
Mxs + Mxd =
vector(
matrix(Mx) + Fy *
ones(na,1) .*
matrix(hRC));
d_px = wx;
vyu =
vector(
matrix(vys) +
matrix(wx) .* (
matrix(h) -
matrix(hRC)));
Ix .* d_wx =
vector(
matrix(Mx) + Fy *
ones(na,1) .*
matrix(h) +
matrix(m) .*
matrix(
fill(9.81, nu, 1)) .*
matrix(h - hRC) .*
matrix(px) +
matrix([Fcy;0]) .* (
matrix(h) -
matrix([hC;0])) +
matrix([0;
sin(theta) .* Fcy +
cos(theta) .* Fcx]) .* (
matrix(h) -
matrix([0;hC]))+
matrix([Mxc;0])-
matrix([0;Mxc]));
d_Mxs = -ksSum .* wx;
Mxd = -csSum .* wx;
Delta_px1=[0;
matrix(px)]-[
matrix(px);0];
Delta_px2=
matrix(Delta_px1[2:
end-1,1]);
Mxc=-Ccr.*
vector(
der(Delta_px2))-Kcr.*
vector(Delta_px2);
der(delta_z) + W .* delta_z =ks .* (
matrix(px) *
ones(1,na)) + cs .* (
matrix(d_px) *
ones(1,na)) + Fy .* (
matrix(h)*
ones(1,na));
FzAxleRight=(Fz./2).+delta_z;
FzAxleLeft=(Fz./2).-delta_z;
FzUnitRight=
vector(FzAxleRight*
ones(na,1));
FzUnitLeft=
vector(FzAxleLeft*
ones(na,1));
LoadTransferRatio=(FzUnitRight-FzUnitLeft)./(FzUnitRight+FzUnitLeft);
end SingleTrackRollDynamicsNonLinTyre;
Single track model with direction of travel at front axle as input
Parameters
Type | Name | Default | Description |
Integer | nu | 2 | |
Integer | na | 3 | |
VehicleModel | paramSet | | |
Connectors
Type | Name | Description |
output RealOutput | delta_out | |
input RealInput | front_direction_in | Direction of travel at first axle |
input RealInput | vx_in | First unit velocity input |
Modelica definition
model DirectionInput
parameter Integer nu=2;
parameter Integer na=3;
VehicleModels.SingleTrack vehicle( mode=2, paramSet=paramSet,
nu=nu,
na=na);
Modelica.Blocks.Math.InverseBlockConstraints inverseBlockConstraints;
Modelica.Blocks.Interfaces.RealOutput delta_out;
Modelica.Blocks.Interfaces.RealInput front_direction_in
;
Modelica.Blocks.Interfaces.RealInput vx_in ;
Modelica.Blocks.Math.Atan2 headingAngle;
Components.MotionOffset motionOffset(y_offset=-paramSet.W[1, 1]/2,
x_offset=vehicle.Lcog[1, 1]);
parameter VehicleParameters.Base.VehicleModel paramSet;
Modelica.Blocks.Sources.RealExpression realExpression2(y=vehicle.pz[1]);
Modelica.Blocks.Math.Add add;
equation
connect(vehicle.delta_in, inverseBlockConstraints.y2);
connect(inverseBlockConstraints.u1, front_direction_in);
connect(vehicle.vx_in, vx_in);
connect(inverseBlockConstraints.y1, delta_out);
connect(vehicle.vx_out[1], motionOffset.vx);
connect(vehicle.vy_out[1], motionOffset.vy);
connect(vehicle.wz_out[1], motionOffset.wz);
connect(motionOffset.vy_offset, headingAngle.u1);
connect(motionOffset.vx_offset, headingAngle.u2);
connect(add.u1, headingAngle.y);
connect(add.u2, realExpression2.y);
connect(add.y, inverseBlockConstraints.u2);
end DirectionInput;
Single track model with direction of travel at front axle as input
Parameters
Type | Name | Default | Description |
Integer | nu | 2 | |
Integer | na | 3 | |
Real | mu | | Friction coefficient |
VehicleModel | paramSet | | |
Connectors
Type | Name | Description |
output RealOutput | delta_out | |
input RealInput | front_direction_in | Direction of travel at first axle |
input RealInput | vx_in | First unit velocity input |
Modelica definition
model DirectionInput_SaturatedTyre
parameter Integer nu=2;
parameter Integer na=3;
parameter Real mu ;
SingleTrack_SaturatedTyre vehicle( mode=2, paramSet=paramSet,
nu=nu,
na=na,
mu=mu);
Modelica.Blocks.Math.InverseBlockConstraints inverseBlockConstraints;
Modelica.Blocks.Interfaces.RealOutput delta_out;
Modelica.Blocks.Interfaces.RealInput front_direction_in
;
Modelica.Blocks.Interfaces.RealInput vx_in ;
Modelica.Blocks.Math.Atan2 headingAngle;
Components.MotionOffset motionOffset(y_offset=-paramSet.w[1, 1]/2,
x_offset=vehicle.Lcog[1, 1]);
parameter VehicleParameters.Base.VehicleModel paramSet;
Modelica.Blocks.Sources.RealExpression realExpression2(y=vehicle.pz[1]);
Modelica.Blocks.Math.Add add;
equation
connect(vehicle.delta_in, inverseBlockConstraints.y2);
connect(inverseBlockConstraints.u1, front_direction_in);
connect(vehicle.vx_in, vx_in);
connect(inverseBlockConstraints.y1, delta_out);
connect(vehicle.vx_out[1], motionOffset.vx);
connect(vehicle.vy_out[1], motionOffset.vy);
connect(vehicle.wz_out[1], motionOffset.wz);
connect(motionOffset.vy_offset, headingAngle.u1);
connect(motionOffset.vx_offset, headingAngle.u2);
connect(add.u1, headingAngle.y);
connect(add.u2, realExpression2.y);
connect(add.y, inverseBlockConstraints.u2);
end DirectionInput_SaturatedTyre;
Steady-state curve
Parameters
Type | Name | Default | Description |
Integer | nu | 2 | |
Integer | na | 3 | |
VehicleModel | paramSet | | |
Connectors
Modelica definition
model CurvatureInput
parameter Integer nu=2;
parameter Integer na=3;
Modelica.Blocks.Interfaces.RealInput curvature_in;
Modelica.Blocks.Math.InverseBlockConstraints inverseBlockConstraints;
SingleTrack vehicle(paramSet=paramSet,
theta(start=
ones(nu - 1)*0.001),
wz(start=
ones(nu)*0.001),
vy(start=
ones(nu)*0.001),
mode=3,
alpha(start=-0.001*
ones(nu, na)),
Fcx(start=
ones(nu - 1)*1000),
Fcy(start=
ones(nu - 1)*10000));
Modelica.Blocks.Interfaces.RealInput vx_in;
Manoeuvres.Blocks.Curvature curvature(
nu=paramSet.nu,
na=paramSet.na,
Lcog=vehicle.Lcog);
Modelica.Blocks.Interfaces.RealOutput curvature_out[nu,na]
;
parameter VehicleParameters.Base.VehicleModel paramSet;
Modelica.Blocks.Interfaces.RealOutput delta_out ;
equation
connect(vehicle.vx_out,curvature. vx);
connect(vehicle.vy_out,curvature. vy);
connect(vehicle.wz_out,curvature. wz);
connect(curvature.y[1, 1],inverseBlockConstraints. u2);
connect(curvature_in, inverseBlockConstraints.u1);
connect(vx_in, vehicle.vx_in);
connect(curvature.y, curvature_out);
connect(inverseBlockConstraints.y1, delta_out);
connect(inverseBlockConstraints.y2, vehicle.delta_in);
end CurvatureInput;
Parameters
Type | Name | Default | Description |
VehicleModel | paramSet | | |
Integer | nu | paramSet.nu | Number of units |
Integer | na | paramSet.na | Max number of axles per unit |
Force | Fz[nu, na] | paramSet.Fz | [N] |
Boolean | rfc[nu - 1] | paramSet.rfc | Defines roll-free coupling |
Mass | mk[nu] | paramSet.mk | Kerb masses [kg] |
Length | L[nu, na] | paramSet.L | Axle positions relative first axle of each unit [m] |
Length | A[nu] | paramSet.A | Front coupling position relative first axle [m] |
Length | B[nu] | paramSet.B | Rear coupling position relative first axle [m] |
Integer | axlegroups[nu, na] | paramSet.axlegroups | |
Modelica definition
model VerticalForces
constant Modelica.SIunits.Acceleration g=Modelica.Constants.g_n;
parameter OpenPBS.VehicleParameters.Base.VehicleModel paramSet;
parameter Integer nu=paramSet.nu ;
parameter Integer na=paramSet.na ;
parameter Modelica.SIunits.Force[nu,na] Fz=paramSet.Fz;
parameter Boolean[nu-1] rfc=paramSet.rfc ;
parameter Modelica.SIunits.Mass[nu] mk=paramSet.mk ;
parameter Modelica.SIunits.Length[nu,na] L=paramSet.L
;
parameter Modelica.SIunits.Length[nu] A=paramSet.A
;
parameter Modelica.SIunits.Length[nu] B=paramSet.B
;
parameter Integer[nu,na] axlegroups=paramSet.axlegroups;
Modelica.SIunits.Length[nu,na] Lcog = L-
matrix(X)*
ones(1,na)
;
Modelica.SIunits.Length[nu] Bcog = B-X;
Modelica.SIunits.Length[nu] Acog = A-X;
Modelica.SIunits.Force[nu-1] Fcz ;
Modelica.SIunits.Mass[nu] ml ;
Modelica.SIunits.Mass[nu] m;
Modelica.SIunits.Length[nu] X;
equation
for i
in 1:nu
loop
if i==1
and rfc[i]==true
then
ml[i]+mk[i]=
sum(Fz[i,:])/g ;
if rfc[i+1]==false
then
ml[i+1]=0 ;
ml[i+2]+
sum(mk[i+1:i+2])=
sum(Fz[i+1:i+2,:])/g ;
elseif rfc[i+1]==true
then
ml[i+1]+mk[i+1]=
sum(Fz[i+1,:])/g ;
ml[i+2]+mk[i+2]=
sum(Fz[i+2,:])/g ;
else
ml[i]=0;
end if;
elseif i==1
and rfc[i]==false
then
ml[i]=0 ;
if rfc[i+1]==false
then
ml[i+1]+
sum(mk)+ml[i+2]=
sum(Fz)/g ;
ml[i+2]=(42000-mk[i+2])/(15600-1500)*(Fcz[i+1]/g-1500) ;
elseif rfc[i+1]==true
and nu==3
then
ml[i+1]+
sum(mk[i:i+1])=
sum(Fz[i:i+1,:])/g ;
ml[i+2]+mk[i+2]=
sum(Fz[i+2,:])/g ;
elseif rfc[i+1]==true
and rfc[i+2]==false
then
ml[i+1]+
sum(mk[i:i+1])=
sum(Fz[i:i+1,:])/g ;
ml[i+2]=0 ;
ml[i+3]+
sum(mk[i+2:i+3])=
sum(Fz[i+2:i+3,:])/g ;
elseif nu==2
then
ml[2]+
sum(mk)=
sum(Fz)/g ;
else
ml[i]=0;
end if;
end if;
end for;
for i
in 1:nu
loop
m[i]=mk[i]+ml[i];
if i ==1
then
Fcz[i]-
sum(Fz[i,:])=-(ml[i]+mk[i])*Modelica.Constants.g_n;
(
sum(Fz[i,1:na].*L[i,1:na])-Fcz[i].*B[i])/(m[i]*Modelica.Constants.g_n)=X[i];
elseif i>1
and i<nu
then
Fcz[i]-
sum(Fz[i,:])-Fcz[i-1]=-(ml[i]+mk[i])*Modelica.Constants.g_n;
(
sum(Fz[i,1:na].*L[i,1:na])+Fcz[i-1].*A[i]-Fcz[i].*B[i])/(m[i]*Modelica.Constants.g_n)=X[i];
else
(
sum(Fz[i,1:na].*L[i,1:na])+Fcz[i-1].*A[i])/(m[i]*Modelica.Constants.g_n)=X[i];
end if;
end for;
end VerticalForces;
Parameters
Type | Name | Default | Description |
VehicleModelRollDynamics | paramSet | | |
Integer | nu | paramSet.nu | Number of units |
Integer | na | paramSet.na | Max number of axles per unit |
Force | Fz[nu, na] | paramSet.Fz | [N] |
Boolean | rfc[nu - 1] | paramSet.rfc | Defines roll-free coupling |
Mass | mk[nu] | paramSet.mk | Kerb masses [kg] |
Length | L[nu, na] | paramSet.L | Axle positions relative first axle of each unit [m] |
Length | A[nu] | paramSet.A | Front coupling position relative first axle [m] |
Length | B[nu] | paramSet.B | Rear coupling position relative first axle [m] |
Integer | axlegroups[nu, na] | paramSet.axlegroups | |
Modelica definition
model VerticalForcesRollDynamics
constant Modelica.SIunits.Acceleration g=Modelica.Constants.g_n;
parameter OpenPBS.VehicleParameters.Base.VehicleModelRollDynamics paramSet;
parameter Integer nu=paramSet.nu ;
parameter Integer na=paramSet.na ;
parameter Modelica.SIunits.Force[nu,na] Fz=paramSet.Fz;
parameter Boolean[nu-1] rfc=paramSet.rfc ;
parameter Modelica.SIunits.Mass[nu] mk=paramSet.mk ;
parameter Modelica.SIunits.Length[nu,na] L=paramSet.L
;
parameter Modelica.SIunits.Length[nu] A=paramSet.A
;
parameter Modelica.SIunits.Length[nu] B=paramSet.B
;
parameter Integer[nu,na] axlegroups=paramSet.axlegroups;
Modelica.SIunits.Length[nu,na] Lcog = L-
matrix(X)*
ones(1,na)
;
Modelica.SIunits.Length[nu] Bcog = B-X;
Modelica.SIunits.Length[nu] Acog = A-X;
Modelica.SIunits.Force[nu-1] Fcz ;
Modelica.SIunits.Mass[nu] ml ;
Modelica.SIunits.Mass[nu] m;
Modelica.SIunits.Length[nu] X;
equation
for i
in 1:nu
loop
if i==1
and rfc[i]==true
then
ml[i]+mk[i]=
sum(Fz[i,:])/g ;
if rfc[i+1]==false
then
ml[i+1]=0 ;
ml[i+2]+
sum(mk[i+1:i+2])=
sum(Fz[i+1:i+2,:])/g ;
elseif rfc[i+1]==true
then
ml[i+1]+mk[i+1]=
sum(Fz[i+1,:])/g ;
ml[i+2]+mk[i+2]=
sum(Fz[i+2,:])/g ;
else
ml[i]=0;
end if;
elseif i==1
and rfc[i]==false
then
ml[i]=0 ;
if rfc[i+1]==false
then
ml[i+1]+
sum(mk)+ml[i+2]=
sum(Fz)/g ;
ml[i+2]=(42000-mk[i+2])/(15600-1500)*(Fcz[i+1]/g-1500) ;
elseif rfc[i+1]==true
and nu==3
then
ml[i+1]+
sum(mk[i:i+1])=
sum(Fz[i:i+1,:])/g ;
ml[i+2]+mk[i+2]=
sum(Fz[i+2,:])/g ;
elseif rfc[i+1]==true
and rfc[i+2]==false
then
ml[i+1]+
sum(mk[i:i+1])=
sum(Fz[i:i+1,:])/g ;
ml[i+2]=0 ;
ml[i+3]+
sum(mk[i+2:i+3])=
sum(Fz[i+2:i+3,:])/g ;
else
ml[i]=0;
end if;
end if;
end for;
for i
in 1:nu
loop
m[i]=mk[i]+ml[i];
if i ==1
then
Fcz[i]-
sum(Fz[i,:])=-(ml[i]+mk[i])*Modelica.Constants.g_n;
(
sum(Fz[i,1:na].*L[i,1:na])-Fcz[i].*B[i])/(m[i]*Modelica.Constants.g_n)=X[i];
elseif i>1
and i<nu
then
Fcz[i]-
sum(Fz[i,:])-Fcz[i-1]=-(ml[i]+mk[i])*Modelica.Constants.g_n;
(
sum(Fz[i,1:na].*L[i,1:na])+Fcz[i-1].*A[i]-Fcz[i].*B[i])/(m[i]*Modelica.Constants.g_n)=X[i];
else
(
sum(Fz[i,1:na].*L[i,1:na])+Fcz[i-1].*A[i])/(m[i]*Modelica.Constants.g_n)=X[i];
end if;
end for;
end VerticalForcesRollDynamics;
Parameters
Type | Name | Default | Description |
VehicleModelRollDynamicsNonLinTyre | paramSet | | |
Integer | nu | paramSet.nu | Number of units |
Integer | na | paramSet.na | Max number of axles per unit |
Force | Fz[nu, na] | paramSet.Fz | [N] |
Boolean | rfc[nu - 1] | paramSet.rfc | Defines roll-free coupling |
Mass | mk[nu] | paramSet.mk | Kerb masses [kg] |
Length | L[nu, na] | paramSet.L | Axle positions relative first axle of each unit [m] |
Length | A[nu] | paramSet.A | Front coupling position relative first axle [m] |
Length | B[nu] | paramSet.B | Rear coupling position relative first axle [m] |
Integer | axlegroups[nu, na] | paramSet.axlegroups | |
Modelica definition
model VerticalForcesRollDynamicsNonLinTyre
constant Modelica.SIunits.Acceleration g=Modelica.Constants.g_n;
parameter OpenPBS.VehicleParameters.Base.VehicleModelRollDynamicsNonLinTyre paramSet;
parameter Integer nu=paramSet.nu ;
parameter Integer na=paramSet.na ;
parameter Modelica.SIunits.Force[nu,na] Fz=paramSet.Fz;
parameter Boolean[nu-1] rfc=paramSet.rfc ;
parameter Modelica.SIunits.Mass[nu] mk=paramSet.mk ;
parameter Modelica.SIunits.Length[nu,na] L=paramSet.L
;
parameter Modelica.SIunits.Length[nu] A=paramSet.A
;
parameter Modelica.SIunits.Length[nu] B=paramSet.B
;
parameter Integer[nu,na] axlegroups=paramSet.axlegroups;
Modelica.SIunits.Length[nu,na] Lcog = L-
matrix(X)*
ones(1,na)
;
Modelica.SIunits.Length[nu] Bcog = B-X;
Modelica.SIunits.Length[nu] Acog = A-X;
Modelica.SIunits.Force[nu-1] Fcz ;
Modelica.SIunits.Mass[nu] ml ;
Modelica.SIunits.Mass[nu] m;
Modelica.SIunits.Length[nu] X;
equation
for i
in 1:nu
loop
if i==1
and rfc[i]==true
then
ml[i]+mk[i]=
sum(Fz[i,:])/g ;
if rfc[i+1]==false
then
ml[i+1]=0 ;
ml[i+2]+
sum(mk[i+1:i+2])=
sum(Fz[i+1:i+2,:])/g ;
elseif rfc[i+1]==true
then
ml[i+1]+mk[i+1]=
sum(Fz[i+1,:])/g ;
ml[i+2]+mk[i+2]=
sum(Fz[i+2,:])/g ;
else
ml[i]=0;
end if;
elseif i==1
and rfc[i]==false
then
ml[i]=0 ;
if rfc[i+1]==false
then
ml[i+1]+
sum(mk)+ml[i+2]=
sum(Fz)/g ;
ml[i+2]=(42000-mk[i+2])/(15600-1500)*(Fcz[i+1]/g-1500) ;
elseif rfc[i+1]==true
and nu==3
then
ml[i+1]+
sum(mk[i:i+1])=
sum(Fz[i:i+1,:])/g ;
ml[i+2]+mk[i+2]=
sum(Fz[i+2,:])/g ;
elseif rfc[i+1]==true
and rfc[i+2]==false
then
ml[i+1]+
sum(mk[i:i+1])=
sum(Fz[i:i+1,:])/g ;
ml[i+2]=0 ;
ml[i+3]+
sum(mk[i+2:i+3])=
sum(Fz[i+2:i+3,:])/g ;
else
ml[i]=0;
end if;
end if;
end for;
for i
in 1:nu
loop
m[i]=mk[i]+ml[i];
if i ==1
then
Fcz[i]-
sum(Fz[i,:])=-(ml[i]+mk[i])*Modelica.Constants.g_n;
(
sum(Fz[i,1:na].*L[i,1:na])-Fcz[i].*B[i])/(m[i]*Modelica.Constants.g_n)=X[i];
elseif i>1
and i<nu
then
Fcz[i]-
sum(Fz[i,:])-Fcz[i-1]=-(ml[i]+mk[i])*Modelica.Constants.g_n;
(
sum(Fz[i,1:na].*L[i,1:na])+Fcz[i-1].*A[i]-Fcz[i].*B[i])/(m[i]*Modelica.Constants.g_n)=X[i];
else
(
sum(Fz[i,1:na].*L[i,1:na])+Fcz[i-1].*A[i])/(m[i]*Modelica.Constants.g_n)=X[i];
end if;
end for;
end VerticalForcesRollDynamicsNonLinTyre;
Information
This is a test. a = b/c
Parameters
Type | Name | Default | Description |
Adouble6x4_RollDynamics_NonLinTyre | paramSet | redeclare parameter VehicleP... | |
Integer | nu | paramSet.nu | |
Integer | na | paramSet.na | |
Force | Fz[nu, na] | paramSet.Fz | [N] |
Integer | axlegroups[nu, na] | paramSet.axlegroups | |
Position | h[nu] | paramSet.h | [m] |
Position | hRC[nu] | paramSet.hRC | [m] |
Length | FOH[nu] | paramSet.FOH | [m] |
Length | ROH[nu] | paramSet.ROH | [m] |
TranslationalSpringConstant | ks[nu, na] | paramSet.ks | [N/m] |
Real | Kcr[nu - 1] | paramSet.Kcr | |
Boolean | driven[nu, na] | paramSet.driven | |
TranslationalSpringConstant | CZT[nu, na] | paramSet.CZT | Tyre vertical stiffness [N/m] |
TranslationalSpringConstant | CYT[nu, na] | paramSet.CYT | Tyre lateral stiffness [N/m] |
Length | We[nu, na] | paramSet.We | Effective track width [m] |
Boolean | rfc[nu - 1] | paramSet.rfc | Defines roll-rigid couplings |
Integer | nrc | 1 + Modelica.Math.BooleanVec... | Number of roll-free coupled units |
Connectors
Modelica definition
model Roll
replaceable parameter VehicleParameters.Vehicles.Adouble6x4_RollDynamics_NonLinTyre
paramSet
constrainedby VehicleParameters.Base.VehicleModelRollDynamicsNonLinTyre;
constant Modelica.SIunits.Acceleration g=Modelica.Constants.g_n;
OpenPBS.VehicleModels.VerticalForcesRollDynamicsNonLinTyre verticalForcesRollDynamicsNonLinTyre(nu=nu,na=na,paramSet=paramSet);
Modelica.Blocks.Interfaces.RealOutput SRT_out1=SRT[1];
Modelica.Blocks.Interfaces.RealOutput SRT_out2=SRT[2];
Modelica.Blocks.Interfaces.RealOutput SRT_out3=SRT[3];
parameter Integer nu = paramSet.nu;
parameter Integer na = paramSet.na;
parameter Modelica.SIunits.Force[nu,na] Fz = paramSet.Fz;
parameter Integer[nu,na] axlegroups = paramSet.axlegroups;
parameter Modelica.SIunits.Position[nu] h = paramSet.h;
parameter Modelica.SIunits.Position[nu] hRC = paramSet.hRC;
parameter Modelica.SIunits.Length[nu] FOH = paramSet.FOH;
parameter Modelica.SIunits.Length[nu] ROH = paramSet.ROH;
parameter Modelica.SIunits.TranslationalSpringConstant[nu, na] ks = paramSet.ks;
parameter Real[nu-1] Kcr = paramSet.Kcr;
parameter Boolean[nu,na] driven=paramSet.driven;
Modelica.SIunits.Force[nu-1] Fcz=verticalForcesRollDynamicsNonLinTyre.Fcz;
Modelica.SIunits.Mass[nu] m=verticalForcesRollDynamicsNonLinTyre.m;
Modelica.SIunits.Mass[nu] ml=verticalForcesRollDynamicsNonLinTyre.ml;
parameter Modelica.SIunits.TranslationalSpringConstant[nu, na] CZT=paramSet.CZT ;
parameter Modelica.SIunits.TranslationalSpringConstant[nu, na] CYT=paramSet.CYT ;
parameter Modelica.SIunits.Length[nu,na] We = paramSet.We ;
parameter Boolean[nu-1] rfc = paramSet.rfc ;
parameter Integer nrc=1+
Modelica.Math.BooleanVectors.countTrue(rfc) ;
Modelica.SIunits.TranslationalSpringConstant[nu, na] kes ;
Modelica.SIunits.TranslationalSpringConstant[nu, na] kt ;
Modelica.SIunits.TranslationalSpringConstant[nu, na] k ;
Modelica.SIunits.TranslationalSpringConstant[nrc] kv ;
Modelica.SIunits.TranslationalSpringConstant[nrc] CYTe ;
Modelica.SIunits.Position[nrc] Wev ;
Modelica.SIunits.TranslationalSpringConstant[nu-1] kfw ;
Modelica.SIunits.Acceleration[nu, na] ayl ;
Modelica.SIunits.Acceleration[nrc] aym ;
Modelica.SIunits.Acceleration[nu, na] aSRT ;
Modelica.SIunits.Acceleration[nrc] SRT;
Real[nu, na] DK ;
Modelica.SIunits.Position[nrc] hCG ;
Modelica.SIunits.Position[nrc] hS ;
Integer[nu, na] axles ;
Integer dbl ;
Modelica.SIunits.Position[nu] hs ;
Modelica.SIunits.Force[nu] Fu ;
Modelica.SIunits.Force[nu,na] ma ;
equation
kfw=4*Fcz;
dbl=
Modelica.Math.Vectors.find(0.0,Kcr,eps=0.001);
hs=(h.*m-Fu./g.*hRC)./(m-Fu./g);
if nrc==3
then
for i
in 1:nrc
loop
SRT[i]=
min(aSRT[i,:]);
kv[i]=
sum(k[i,:]);
CYTe[i]=
sum(CYT[i,:]);
Wev[i]=
sum(We[i,:].*Fz[i,:])/
sum(Fz[i,:]);
hS[i]=hs[i];
hCG[i]=h[i];
Fu[i]=
sum(ma[i,:])*g;
aym[i]=0.5*
sum(Fz[i,:]).*Wev[i]./((
sum(Fz[i,:]).*hCG[i])+(((
sum(Fz[i,:])-Fu[i]).*hS[i]).^2 ./(kv[i]-(
sum(Fz[i,:]).*hS[i])))+
sum(Fz[i,:]).^2 ./CYTe[i]);
for j
in 1:na
loop
kes[i,j]=ks[i,j].*(hS[i]./(hS[i]-hRC[i]))^2;
kt[i,j]=CZT[i,j].*(We[i,j].^2)/2;
k[i,j]=(kes[i,j].*kt[i,j])./(kes[i,j]+kt[i,j]);
DK[i,j]=k[i,j]./kv[i];
ayl[i,j]=0.5*Fz[i,j].*We[i,j]./((DK[i,j].*
sum(Fz[i,:]).*hCG[i])+(((
sum(Fz[i,:])-Fu[i]).*DK[i,j].*hS[i]).^2 ./(k[i,j]-(
sum(Fz[i,:]).*DK[i,j].*hS[i])))+Fz[i,j].^2 ./(CYT[i,j]));
aSRT[i,j]=(aym[i]-(aym[i]-ayl[i,j]).*(Fz[i,j]./
sum(Fz[i,:])))*Modelica.Constants.g_n;
end for;
end for;
elseif nrc==2
and rfc[1]==true
then
SRT={
min(aSRT[1:dbl,:]),
min(aSRT[dbl+1:nu,:])};
kv={
sum(k[1:dbl,:]),
sum(k[dbl+1:nu,:])};
CYTe={
sum(CYT[1:dbl,:]),
sum(CYT[dbl+1:nu,:])};
Wev={
sum(We[1:dbl,:].*Fz[1:dbl,:])./
sum(Fz[1:dbl,:]),
sum(We[dbl+1:nu,:].*Fz[dbl+1:nu,:])./
sum(Fz[dbl+1:nu,:])};
hCG={
sum(h[1:dbl].*m[1:dbl])./
sum(m[1:dbl]),
sum(h[dbl+1:nu].*m[dbl+1:nu])/
sum(m[dbl+1:nu])};
hS={
sum(hs[1:dbl].*m[1:dbl])./
sum(m[1:dbl]),
sum(hs[dbl+1:nu].*m[dbl+1:nu])/
sum(m[dbl+1:nu])};
aym={0.5*
sum(Fz[1:dbl,:]).*Wev[1]./((
sum(Fz[1:dbl,:]).*hCG[1])+(((
sum(Fz[1:dbl,:])-
sum(Fu[1:dbl])).*hS[1])^2/(kv[1]-(
sum(Fz[1:dbl,:]).*hS[1])))+
sum(Fz[1:dbl,:])^2/CYTe[1]), 0.5*
sum(Fz[dbl+1:nu,:]).*Wev[2]./((
sum(Fz[dbl+1:nu,:]).*hCG[2])+(((
sum(Fz[dbl+1:nu,:])-
sum(Fu[dbl+1:nu])).*hS[2])^2/(kv[2]-(
sum(Fz[dbl+1:nu,:]).*hS[2])))+
sum(Fz[dbl+1:nu,:])^2/CYTe[2])};
for i
in 1:nu
loop
Fu[i]=
sum(ma[i,:])*g;
for j
in 1:na
loop
if i<=dbl
then
kes[i,j]=ks[i,j].*(hS[1]./(hS[1]-hRC[i]))^2;
kt[i,j]=CZT[i,j].*(We[i,j].^2)/2;
k[i,j]=(kes[i,j].*kt[i,j])./(kes[i,j]+kt[i,j]);
DK[i,j]=k[i,j]./kv[1];
ayl[i,j]=0.5*Fz[i,j].*We[i,j]./((DK[i,j].*
sum(Fz[1:dbl,:]).*hCG[1])+(((
sum(Fz[1:dbl,:])-
sum(Fu[1:dbl])).*DK[i,j].*hS[1]).^2 ./(k[i,j]-(
sum(Fz[1:dbl,:]).*DK[i,j].*hS[1])))+Fz[i,j].^2 ./(CYT[i,j]));
aSRT[i,j]=(aym[1]-(aym[1]-ayl[i,j]).*(Fz[i,j]./
sum(Fz[1:dbl,:])))*Modelica.Constants.g_n;
else
kes[i,j]=ks[i,j].*(hS[nrc]./(hS[nrc]-hRC[i]))^2;
kt[i,j]=CZT[i,j].*(We[i,j]^2)/2;
k[i,j]=(kes[i,j].*kt[i,j])./(kes[i,j]+kt[i,j]);
DK[i,j]=k[i,j]./kv[nrc];
ayl[i,j]=0.5*Fz[i,j].*We[i,j]./((DK[i,j].*
sum(Fz[dbl+1:nu,:]).*hCG[nrc])+(((
sum(Fz[dbl+1:nu,:])-
sum(Fu[dbl+1:nu])).*DK[i,j].*hS[nrc]).^2/(k[i,j]-(
sum(Fz[dbl+1:nu,:]).*DK[i,j].*hS[nrc])))+Fz[i,j].^2/(CYT[i,j]));
aSRT[i,j]=(aym[nrc]-(aym[nrc]-ayl[i,j]).*(Fz[i,j]./
sum(Fz[dbl+1:nu,:])))*Modelica.Constants.g_n;
end if;
end for;
end for;
elseif nrc==2
and rfc[1]==false
then
SRT={
min(aSRT[2,:]),
min(aSRT[dbl+1:nu,:])};
kv={
sum(k[2,:])+(kfw[1]),
sum(k[dbl+1:nu,:])};
CYTe={
sum(CYT[2,:]),
sum(CYT[dbl+1:nu,:])};
Wev={(
sum(We[2,:].*Fz[2,:])+
sum(We[1,:])./
sum(axles[1,:]).*(Fcz[1]))./(
sum(Fz[2,:])+(Fcz[1])),
sum(We[dbl+1:nu,:].*Fz[dbl+1:nu,:])./
sum(Fz[dbl+1:nu,:])};
hCG={h[2],
sum(h[dbl+1:nu].*m[dbl+1:nu])/
sum(m[dbl+1:nu])};
hS={hs[2],
sum(hs[dbl+1:nu].*m[dbl+1:nu])/
sum(m[dbl+1:nu])};
aym={0.5*
sum(Fz[2,:]).*Wev[1]./((
sum(Fz[2,:]).*hCG[1])+(((
sum(Fz[2,:])-Fu[2]).*hS[1])^2/(kv[1]-(
sum(Fz[2,:]).*hS[1])))+
sum(Fz[2,:])^2/CYTe[1]), 0.5*
sum(Fz[dbl+1:nu,:]).*Wev[2]./((
sum(Fz[dbl+1:nu,:]).*hCG[2])+(((
sum(Fz[dbl+1:nu,:])-
sum(Fu[dbl+1:nu])).*hS[2])^2/(kv[2]-(
sum(Fz[dbl+1:nu,:]).*hS[2])))+
sum(Fz[dbl+1:nu,:])^2/CYTe[2])};
for i
in 1:nu
loop
Fu[i]=
sum(ma[i,:])*g;
for j
in 1:na
loop
if i<=dbl
then
kes[i,j]=ks[i,j].*(hS[1]./(hS[1]-hRC[i]))^2;
kt[i,j]=CZT[i,j].*(We[i,j].^2)/2;
DK[i,j]=k[i,j]./kv[1];
ayl[i,j]=0.5*Fz[i,j].*We[i,j]./((DK[i,j].*
sum(Fz[2,:]).*hCG[1])+(((
sum(Fz[2,:])-Fu[2]).*DK[i,j].*hS[1]).^2 ./(k[i,j]-(
sum(Fz[2,:]).*DK[i,j].*hS[1])))+Fz[i,j].^2 ./(CYT[i,j]));
aSRT[i,j]=(aym[1]-(aym[1]-ayl[i,j]).*(Fz[i,j]./
sum(Fz[2,:])))*Modelica.Constants.g_n;
if i==1
then
k[i,j]=kfw[1]/
sum(axles[1,:]);
else
k[i,j]=(kes[i,j].*kt[i,j])./(kes[i,j]+kt[i,j]);
end if;
else
kes[i,j]=ks[i,j].*(hS[nrc]./(hS[nrc]-hRC[i]))^2;
kt[i,j]=CZT[i,j].*(We[i,j]^2)/2;
k[i,j]=(kes[i,j].*kt[i,j])./(kes[i,j]+kt[i,j]);
DK[i,j]=k[i,j]./kv[nrc];
ayl[i,j]=0.5*Fz[i,j].*We[i,j]./((DK[i,j].*
sum(Fz[dbl+1:nu,:]).*hCG[nrc])+(((
sum(Fz[dbl+1:nu,:])-
sum(Fu[dbl+1:nu])).*DK[i,j].*hS[nrc]).^2/(k[i,j]-(
sum(Fz[dbl+1:nu,:]).*DK[i,j].*hS[nrc])))+Fz[i,j].^2/(CYT[i,j]));
aSRT[i,j]=(aym[nrc]-(aym[nrc]-ayl[i,j]).*(Fz[i,j]./
sum(Fz[dbl+1:nu,:])))*Modelica.Constants.g_n;
end if;
end for;
end for;
elseif nrc==1
then
SRT[1]=
min(aSRT[2:nu]);
kv[1]=
sum(k[2:nu,:])+kfw[1];
CYTe[1]=
sum(CYT[2:nu,:]);
aym=0.5*
sum(Fz[2:nu,:]).*Wev./((
sum(Fz[2:nu,:]).*hCG)+(((
sum(Fz[2:nu,:])-
sum(Fu[2:nu])).*hS).^2 ./(kv-(
sum(Fz[2:nu,:]).*hS)))+
sum(Fz[2:nu,:]).^2 ./CYTe);
Wev[1]=(
sum(We[2:nu,:].*Fz[2:nu,:])+
sum(We[1])./
sum(axles[1]).*(Fcz[1]))./(
sum(Fz[2:nu,:])+Fcz[1]);
hCG[1]=
sum(h[2:nu].*m[2:nu])/
sum(m[2:nu]);
hS[1]=
sum(hs[2:nu].*m[2:nu])/
sum(m[2:nu]);
for i
in 1:nu
loop
Fu[i]=
sum(ma[i,:])*g;
for j
in 1:na
loop
kes[i,j]=ks[i,j].*(hS[1]./(hS[1]-hRC[i]))^2;
kt[i,j]=CZT[i,j].*(We[i,j]^2)/2;
DK[i,j]=k[i,j]./kv[nrc];
ayl[i,j]=0.5*Fz[i,j].*We[i,j]./((DK[i,j].*
sum(Fz[2:nu,:]).*hCG[nrc])+(((
sum(Fz[2:nu,:])-
sum(Fu[2:nu])).*DK[i,j].*hS[nrc]).^2/(k[i,j]-(
sum(Fz[2:nu,:]).*DK[i,j].*hS[nrc])))+Fz[i,j].^2/(CYT[i,j]));
aSRT[i,j]=(aym[1]-(aym[1]-ayl[i,j]).*(Fz[i,j]./
sum(Fz[2:nu,:])))*Modelica.Constants.g_n;
k[i,j]=(kes[i,j].*kt[i,j])./(kes[i,j]+kt[i,j]);
end for;
end for;
end if;
for i
in 1:nu
loop
for j
in 1:na
loop
if axlegroups[i,j]==0
then
axles[i,j]=0;
else
axles[i,j]=1;
end if;
end for;
end for;
for i
in 1:nu
loop
for j
in 1:na
loop
if driven[i,j]==true
then
ma[i,j]=1300;
elseif i==1
and CZT[i,j]>1300000
and driven[i,j]==false
then
ma[i,j]=900;
else
if CZT[i,j]>1300000
then
ma[i,j]=800;
elseif 0<CZT[i,j]
and CZT[i,j]<=1300000
then
ma[i,j]=700;
else
ma[i,j]=0;
end if;
end if;
end for;
end for;
end Roll;
Parameters
Type | Name | Default | Description |
NordicCombination | paramSet | redeclare parameter VehicleP... | |
Integer | mode | 2 | 1: Normal, 2: Quasistatic |
Velocity | vx0 | 70/3.6 | [m/s] |
Angle | inclination_angle | | Inclination angle, positive for uphill driving [rad] |
Integer | nu | paramSet.nu | |
Integer | na | paramSet.na | |
Length | L[nu, na] | paramSet.L | Axle positions relative first axle of each unit [m] |
Length | A[nu] | paramSet.A | Front coupling position relative first axle [m] |
Length | B[nu] | paramSet.B | Rear coupling position relative first axle [m] |
Integer | axlegroups[nu, na] | paramSet.axlegroups | |
Boolean | driven[nu, na] | paramSet.driven | |
Real | drag_coefficient | paramSet.drag_coefficient | |
Area | frontal_area | paramSet.frontal_area | [m2] |
Real | rolling_resistance_coefficient | paramSet.rolling_resistance_... | Rolling resistance force as a function of vertical force |
Force | max_thrust_force_vx0 | paramSet.max_thrust_force_vx0 | [N] |
Power | max_engine_power | paramSet.max_engine_power | [W] |
Density | air_density | 1.3 | [kg/m3] |
Integer | n_driven | Modelica.Math.BooleanVectors... | |
Force | Fz[nu, na] | paramSet.Fz | [N] |
Modelica definition
partial model Longitudinal
replaceable parameter VehicleParameters.Vehicles.NordicCombination paramSet
constrainedby VehicleParameters.Base.VehicleModelRollDynamicsNonLinTyre;
OpenPBS.VehicleModels.VerticalForcesRollDynamicsNonLinTyre verticalForcesRollDynamicsNonLinTyre(nu=nu,na=na,paramSet=paramSet);
parameter Integer mode=2
;
parameter Modelica.SIunits.Velocity vx0=70/3.6;
parameter Modelica.SIunits.Angle inclination_angle ;
parameter Integer nu=paramSet.nu;
parameter Integer na=paramSet.na;
parameter Modelica.SIunits.Length[nu,na] L=paramSet.L
;
parameter Modelica.SIunits.Length[nu] A=paramSet.A
;
parameter Modelica.SIunits.Length[nu] B=paramSet.B
;
parameter Integer[nu,na] axlegroups=paramSet.axlegroups;
parameter Boolean[nu,na] driven=paramSet.driven;
parameter Real drag_coefficient=paramSet.drag_coefficient;
parameter Modelica.SIunits.Area frontal_area=paramSet.frontal_area;
parameter Real rolling_resistance_coefficient=paramSet.rolling_resistance_coefficient ;
parameter Modelica.SIunits.Force max_thrust_force_vx0=paramSet.max_thrust_force_vx0;
parameter Modelica.SIunits.Power max_engine_power=paramSet.max_engine_power;
parameter Modelica.SIunits.Density air_density=1.3;
Modelica.SIunits.Mass[nu] m=verticalForcesRollDynamicsNonLinTyre.m;
Modelica.SIunits.Length[nu] X=verticalForcesRollDynamicsNonLinTyre.X
;
Modelica.SIunits.Length[nu,na] Lcog = L-
matrix(X)*
ones(1,na)
;
Modelica.SIunits.Length[nu] Bcog = B-X;
Modelica.SIunits.Length[nu] Acog = A-X;
final parameter Modelica.SIunits.Position[nu,na] rx0=TM*[0;
matrix(B[1:nu-1]-A[2:nu])]*
ones(1,na)+L;
final parameter Integer TM[nu,nu]=
Functions.tril(nu);
parameter Integer n_driven=
Modelica.Math.BooleanVectors.countTrue(driven[1,:]);
parameter Modelica.SIunits.Force[nu,na] Fz=paramSet.Fz;
Modelica.SIunits.Acceleration ax[nu];
Modelica.SIunits.Velocity vx[nu];
Modelica.SIunits.Force Fx[nu,na] ;
Modelica.SIunits.Force Fxd ;
Modelica.SIunits.Force Fcx[nu-1] ;
Modelica.SIunits.Force Fxa ;
Modelica.SIunits.Position[nu,na] rx(start=rx0);
constant Modelica.SIunits.Force F_eps=Modelica.Constants.eps ;
Real[nu,na] friction_usage;
initial equation
vx=vx0*
ones(nu);
equation
for i
in 1:nu
loop
for j
in 1:na
loop
friction_usage[i,j]=Fx[i,j]./(
max(Fz[i,j],F_eps));
end for;
end for;
if mode==1
then
der(vx)=ax;
else
der(vx)=
zeros(nu);
end if;
Fxa = 0.5*air_density*vx[1]^2*drag_coefficient*frontal_area ;
for i
in 1:nu
loop
for j
in 1:na
loop
if driven[i,j]==true
then
Fx[i,j]=Fxd-Fz[i,j]*
sin(inclination_angle)-Fz[i,j]*rolling_resistance_coefficient*
cos(inclination_angle);
else
Fx[i,j]=-Fz[i,j]*
sin(inclination_angle)-Fz[i,j]*rolling_resistance_coefficient*
cos(inclination_angle);
end if;
end for;
end for;
for i
in 1:nu-1
loop
ax[i+1] = ax[i];
end for;
m.*ax=
vector(-[
matrix(Fxa);
zeros(nu-1,1)]+Fx*
ones(na,1)-[
matrix(Fcx);0]+[0;
matrix(Fcx)]);
der(rx)=
if mode==1
then matrix(vx)*
ones(1,na)
else zeros(nu,na);
end Longitudinal;
Use max thrust force distributed on driving axles and solve for the highest inclination angle where the desired acceleration can be achieved
Information
Extends from Longitudinal.
Parameters
Type | Name | Default | Description |
NordicCombination | paramSet | redeclare parameter VehicleP... | |
Integer | mode | 2 | 1: Normal, 2: Quasistatic |
Velocity | vx0 | 0 | [m/s] |
Integer | nu | paramSet.nu | |
Integer | na | paramSet.na | |
Length | L[nu, na] | paramSet.L | Axle positions relative first axle of each unit [m] |
Length | A[nu] | paramSet.A | Front coupling position relative first axle [m] |
Length | B[nu] | paramSet.B | Rear coupling position relative first axle [m] |
Integer | axlegroups[nu, na] | paramSet.axlegroups | |
Boolean | driven[nu, na] | paramSet.driven | |
Real | drag_coefficient | paramSet.drag_coefficient | |
Area | frontal_area | paramSet.frontal_area | [m2] |
Real | rolling_resistance_coefficient | paramSet.rolling_resistance_... | Rolling resistance force as a function of vertical force |
Force | max_thrust_force_vx0 | paramSet.max_thrust_force_vx0 | [N] |
Power | max_engine_power | paramSet.max_engine_power | [W] |
Density | air_density | 1.3 | [kg/m3] |
Integer | n_driven | Modelica.Math.BooleanVectors... | |
Force | Fz[nu, na] | paramSet.Fz | [N] |
Acceleration | acceleration_demand | 0.02 | Required acceleration [m/s2] |
Real | friction | 0.8 | |
Real | eta | 0.85 | Total efficiency of powertrain |
Connectors
Type | Name | Description |
output RealOutput | inclination_out | |
Modelica definition
model LongitudinalAccelerationQS
extends Longitudinal(mode=2, inclination_angle(fixed=false,start=0),vx0=0);
parameter Modelica.SIunits.Acceleration acceleration_demand=0.02 ;
parameter Real friction=0.8;
parameter Real eta=0.85 ;
Modelica.SIunits.Force max_force=
min(limiting_force)*friction;
Modelica.Blocks.Interfaces.RealOutput inclination_out=inclination_angle;
protected
Real limiting_force[nu,na];
initial equation
Fxd=
min(max_force,
min(max_thrust_force_vx0,max_engine_power/
max(0.1,vx[1]))/n_driven)*eta;
equation
for i
in 1:nu
loop
for j
in 1:na
loop
limiting_force[i,j] =
if driven[i,j]
then Fz[i,j]
else 1e10;
end for;
end for;
ax[1]=acceleration_demand;
end LongitudinalAccelerationQS;
Use max thrust force distributed on driving axles for dynamic simulation
Information
Extends from Longitudinal.
Parameters
Type | Name | Default | Description |
NordicCombination | paramSet | redeclare parameter VehicleP... | |
Integer | mode | 1 | 1: Normal, 2: Quasistatic |
Velocity | vx0 | 70/3.6 | [m/s] |
Angle | inclination_angle | 0 | Inclination angle, positive for uphill driving [rad] |
Integer | nu | paramSet.nu | |
Integer | na | paramSet.na | |
Length | L[nu, na] | paramSet.L | Axle positions relative first axle of each unit [m] |
Length | A[nu] | paramSet.A | Front coupling position relative first axle [m] |
Length | B[nu] | paramSet.B | Rear coupling position relative first axle [m] |
Integer | axlegroups[nu, na] | paramSet.axlegroups | |
Boolean | driven[nu, na] | paramSet.driven | |
Real | drag_coefficient | paramSet.drag_coefficient | |
Area | frontal_area | paramSet.frontal_area | [m2] |
Real | rolling_resistance_coefficient | paramSet.rolling_resistance_... | Rolling resistance force as a function of vertical force |
Force | max_thrust_force_vx0 | paramSet.max_thrust_force_vx0 | [N] |
Power | max_engine_power | paramSet.max_engine_power | [W] |
Density | air_density | 1.3 | [kg/m3] |
Integer | n_driven | Modelica.Math.BooleanVectors... | |
Force | Fz[nu, na] | paramSet.Fz | [N] |
Real | friction | 0.8 | |
Real | eta | 0.85 | Total efficiency of powertrain |
Connectors
Modelica definition
model LongitudinalAcceleration
extends Longitudinal(mode=1, inclination_angle=0);
parameter Real friction=0.8;
parameter Real eta=0.85 ;
Modelica.SIunits.Force max_force=
min(limiting_force)*friction;
Modelica.Blocks.Interfaces.RealOutput s_out=rx[1,1];
protected
Real limiting_force[nu,na];
equation
Fxd=
min(max_force,
min(max_thrust_force_vx0,max_engine_power/
max(0.1,vx[1]))/n_driven)*eta;
for i
in 1:nu
loop
for j
in 1:na
loop
limiting_force[i,j] =
if driven[i,j]
then Fz[i,j]
else 1e10;
end for;
end for;
end LongitudinalAcceleration;
Automatically generated Tue Feb 23 11:57:20 2021.