VehicleDynamics.Chassis.Components

Vehicle components to build suspensions.

VehicleDynamics.Chassis.Components.MacPherson VehicleDynamics.Chassis.Components.RackSteering VehicleDynamics.Chassis.Components.MasslessCutPushRod VehicleDynamics.Chassis.Components.MultiLink4 VehicleDynamics.Chassis.Components.MacPherson4 VehicleDynamics.Chassis.Components.RackSteering4 VehicleDynamics.Chassis.Components.MultiLink42 VehicleDynamics.Chassis.Components.CutPushRod VehicleDynamics.Chassis.Components.Simple VehicleDynamics.Chassis.Components.Bushing VehicleDynamics.Chassis.Components.BushingAntiRollBar VehicleDynamics.Chassis.Components.SimpleAntiRollBar VehicleDynamics.Chassis.Components.PairBushing VehicleDynamics.Chassis.Components.CutBushing VehicleDynamics.Chassis.Components.SedanBody VehicleDynamics.Chassis.Components.AckermannSteering VehicleDynamics.Chassis.Components.TrailingArm VehicleDynamics.Chassis.Components.Strut VehicleDynamics.Chassis.Components.FormulaBody VehicleDynamics.Chassis.Components.DoubleWishBone VehicleDynamics.Chassis.Components.FiveLink VehicleDynamics.Chassis.Components.CutLink VehicleDynamics.Chassis.Components.Link VehicleDynamics.Chassis.Components.MonoDamperBelleVilleAntiRoll VehicleDynamics.Chassis.Components.TwinDamperTorsionAntiRoll VehicleDynamics.Chassis.Components.AntiRollBar VehicleDynamics.Chassis.Components.BeamAxle VehicleDynamics.Chassis.Components.MacPherson2

NameDescription
MacPherson MacPherson strut linkage
RackSteering RackSteering - standard steering system
MasslessCutPushRod Two bushings connected by a massless rod
MultiLink4 MultiLink4 - Linkage with four massless links, one more than neccessary
MacPherson4 MacPherson strut linkage
RackSteering4 RackSteering - standard steering system
MultiLink42 MultiLink4 - Linkage with four links, one more than neccessary
CutPushRod Two bushings connected by a massless rod
Simple Simple - Suspension linkage model whithout geometry. Camber and Steering are specified as functions of bounce. This should be extended so that track width changes could be modelled as well.
Bushing CutBusing - to be used as a cut in a closed loop.
BushingAntiRollBar AntiRollBar - standard anti-roll linkage.
SimpleAntiRollBar AntiRollBar - standard anti-roll linkage.
PairBushing A pair of bushings, to be used with e.g. WishBones.
CutBushing CutBusing - to be used as a cut in a closed loop.
SedanBody Body and body shape of a car. by default a middle sized sedan car with BMW 3-series shape.
AckermannSteering AckermannSteering - steers the right and left wheel according to the Ackermann geometry.
TrailingArm  
Strut Strut - Integrated spring-damper unit
FormulaBody Essentially the same as the SedanBody but with default values from a formula car.
DoubleWishBone MacPherson strut linkage
FiveLink Five links constrain the motion of the upright and reduces the degrees of freedom to one.
CutLink Two bushings connected by a massless rod
Link Two bushings connected by a massless rod
MonoDamperBelleVilleAntiRoll OnBoard linkage that decouples roll and bounce (pitch).
TwinDamperTorsionAntiRoll Onboard linkage with separate struts and anti-roll linkage.
AntiRollBar AntiRollBar - standard anti-roll linkage.
BeamAxle BeamAxle, used in rigid axle suspensions
MacPherson2 MacPherson strut linkage


VehicleDynamics.Chassis.Components.FormulaBody VehicleDynamics.Chassis.Components.FormulaBody

Essentially the same as the SedanBody but with default values from a formula car.

VehicleDynamics.Chassis.Components.FormulaBody

Information


This component contains the visual information of a BMW 3 series sedan.


Parameters

NameDefaultDescription
rcmB[3]data.rcmBVector from frame_a to center of mass, resolved in frame_a [m]
mBdata.mBMass of body [kg]
i11Bdata.i11B(1,1) element of inertia tensor [kg.m2]
i22Bdata.i22B(2,2) element of inertia tensor [kg.m2]
i33Bdata.i33B(3,3) element of inertia tensor [kg.m2]
i21Bdata.i21B(2,1) element of inertia tensor [kg.m2]
i31Bdata.i31B(3,1) element of inertia tensor [kg.m2]
i32Bdata.i32B(3,2) element of inertia tensor [kg.m2]
shapedata.shapeName of shape
r0[3]data.r0Vector from frame_a to shape origin. resolved in frame_a [m]
lengthDirection[3]data.lengthDirectionVector in length direction, resolved in frame_a [m]
widthDirection[3]data.widthDirectionVector in width direction, resolved in frame_a [m]
lengthdata.lengthlength of shape [m]
widthdata.widthwidth of shape|Shape| [m]
heightdata.heightheight of shape|Shape| [m]
material[4]data.materialColor and specular coefficient
extradata.extraAdditional parameter for cone and pipe

Modelica definition

model FormulaBody 
  "Essentially the same as the SedanBody but with default values from a formula car."
   
  
  
  Chassis.Data.BodyData data(
    extra=1, 
    mB=530, 
    i11B=45, 
    i22B=470, 
    i33B=514, 
    shape="1", 
    width=15/18, 
    height=15/18, 
    lengthDirection={1,0,-0.03}, 
    r0={-0.04,0,-0.2}, 
    length=-78/90, 
    rcmB={-1.4,0,0.07}) "Uses a dxf file of a formula car";
  
  parameter SIunits.Position rcmB[3]=data.rcmB 
    "|Body|Vector from frame_a to center of mass, resolved in frame_a";
  parameter SIunits.Mass mB=data.mB "|Body|Mass of body";
  parameter SIunits.Inertia i11B=data.i11B "|Body|(1,1) element of inertia tensor";
  parameter SIunits.Inertia i22B=data.i22B "|Body|(2,2) element of inertia tensor";
  parameter SIunits.Inertia i33B=data.i33B "|Body|(3,3) element of inertia tensor";
  parameter SIunits.Inertia i21B=data.i21B "|Body|(2,1) element of inertia tensor";
  parameter SIunits.Inertia i31B=data.i31B "|Body|(3,1) element of inertia tensor";
  parameter SIunits.Inertia i32B=data.i32B "|Body|(3,2) element of inertia tensor";
  
  parameter String shape=data.shape "|Shape|Name of shape";
  parameter SIunits.Position r0[3]=data.r0 
    "|Shape|Vector from frame_a to shape origin. resolved in frame_a";
  parameter SIunits.Position lengthDirection[3]=data.lengthDirection 
    "|Shape|Vector in length direction, resolved in frame_a";
  parameter SIunits.Position widthDirection[3]=data.widthDirection 
    "|Shape|Vector in width direction, resolved in frame_a";
  parameter SIunits.Length length=data.length "|Shape|length of shape";
  parameter SIunits.Length width=data.width "width of shape|Shape|";
  parameter SIunits.Length height=data.height "height of shape|Shape|";
  parameter Real material[4]=data.material 
    "|Shape|Color and specular coefficient";
  parameter Real extra=data.extra 
    "|Shape|Additional parameter for cone and pipe";
  
  Utilities.Parts.Body shapeBody(
    m=mB, 
    I11=i11B, 
    I22=i22B, 
    I33=i33B, 
    I21=i21B, 
    I31=i31B, 
    I32=i32B, 
    rCM=rcmB, 
    shape=shape, 
    r0=r0, 
    widthDirection=widthDirection, 
    length=length, 
    width=width, 
    height=height, 
    material=material, 
    extra=extra, 
    lengthDirection=lengthDirection);
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_a1;
equation 
  connect(shapeBody.frame_a, frame_a1);
  
end FormulaBody;

VehicleDynamics.Chassis.Components.SedanBody VehicleDynamics.Chassis.Components.SedanBody

Body and body shape of a car. by default a middle sized sedan car with BMW 3-series shape.

VehicleDynamics.Chassis.Components.SedanBody

Information


This component contains the visual information of a BMW 3 series sedan.


Parameters

NameDefaultDescription
rcmB[3]data.rcmBVector from frame_a to center of mass, resolved in frame_a [m]
mBdata.mBMass of body [kg]
i11Bdata.i11B(1,1) element of inertia tensor [kg.m2]
i22Bdata.i22B(2,2) element of inertia tensor [kg.m2]
i33Bdata.i33B(3,3) element of inertia tensor [kg.m2]
i21Bdata.i21B(2,1) element of inertia tensor [kg.m2]
i31Bdata.i31B(3,1) element of inertia tensor [kg.m2]
i32Bdata.i32B(3,2) element of inertia tensor [kg.m2]
shapedata.shapeName of shape
r0[3]data.r0Vector from frame_a to shape origin. resolved in frame_a [m]
lengthDirection[3]data.lengthDirectionVector in length direction, resolved in frame_a [m]
widthDirection[3]data.widthDirectionVector in width direction, resolved in frame_a [m]
lengthdata.lengthlength of shape [m]
widthdata.widthwidth of shape|Shape| [m]
heightdata.heightheight of shape|Shape| [m]
material[4]data.materialColor and specular coefficient
extradata.extraAdditional parameter for cone and pipe

Modelica definition

model SedanBody 
  "Body and body shape of a car. by default a middle sized sedan car with BMW 3-series shape."
   
  
  
  Chassis.Data.BodyData data(
    r0={-.72,0,0.35}, 
    lengthDirection={0,-1,0}, 
    widthDirection={1,0,0}, 
    length=0.002, 
    width=0.002, 
    height=0.002, 
    extra=1, 
    rcmB={-2.55*0.4,0,2.55*0.12}, 
    mB=1400, 
    i11B=500, 
    i22B=1500, 
    i33B=1800, 
    shape="2") "Uses a dxf file of a BMW 3 series sedan";
  parameter SI.Position rcmB[3]=data.rcmB 
    "|Body|Vector from frame_a to center of mass, resolved in frame_a";
  parameter SI.Mass mB=data.mB "|Body|Mass of body";
  parameter SI.Inertia i11B=data.i11B "|Body|(1,1) element of inertia tensor";
  parameter SI.Inertia i22B=data.i22B "|Body|(2,2) element of inertia tensor";
  parameter SI.Inertia i33B=data.i33B "|Body|(3,3) element of inertia tensor";
  parameter SI.Inertia i21B=data.i21B "|Body|(2,1) element of inertia tensor";
  parameter SI.Inertia i31B=data.i31B "|Body|(3,1) element of inertia tensor";
  parameter SI.Inertia i32B=data.i32B "|Body|(3,2) element of inertia tensor";
  
  parameter String shape=data.shape "|Shape|Name of shape";
  parameter SI.Position r0[3]=data.r0 
    "|Shape|Vector from frame_a to shape origin. resolved in frame_a";
  parameter SI.Position lengthDirection[3]=data.lengthDirection 
    "|Shape|Vector in length direction, resolved in frame_a";
  parameter SI.Position widthDirection[3]=data.widthDirection 
    "|Shape|Vector in width direction, resolved in frame_a";
  parameter SI.Length length=data.length "|Shape|length of shape";
  parameter SI.Length width=data.width "width of shape|Shape|";
  parameter SI.Length height=data.height "height of shape|Shape|";
  parameter Real material[4]=data.material 
    "|Shape|Color and specular coefficient";
  parameter Real extra=data.extra 
    "|Shape|Additional parameter for cone and pipe";
  
  Utilities.Parts.Body shapeBody(
    m=mB, 
    I11=i11B, 
    I22=i22B, 
    I33=i33B, 
    I21=i21B, 
    I31=i31B, 
    I32=i32B, 
    rCM=rcmB, 
    shape=shape, 
    r0=r0, 
    widthDirection=widthDirection, 
    length=length, 
    width=width, 
    height=height, 
    material=material, 
    extra=extra, 
    lengthDirection=lengthDirection);
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_a1;
equation 
  connect(shapeBody.frame_a, frame_a1);
  
end SedanBody;

VehicleDynamics.Chassis.Components.AckermannSteering VehicleDynamics.Chassis.Components.AckermannSteering

AckermannSteering - steers the right and left wheel according to the Ackermann geometry.

VehicleDynamics.Chassis.Components.AckermannSteering

Information


A geometrical approach shows that the outer wheel should turn less when the car turns. The inner wheel should turn with an angle delta_i=atan(L/R) while the outer wheel should turn with a smaller angle delta_o=atan(L/(b+R)) where R is the turning radius of the inner wheel, b is the trackwidth and L is the wheelbase. This effect is often reffered to as Ackermann steering but was devided by Lankensperger. This model assumes that the driver steers a wheel in the midle of the car and from this, the inner and outer turning angles are calculated.


Parameters

NameDefaultDescription
wheelbase2.55Distance from front to rear axis
trackwidth1.6Distance between the front wheels
ratio1Gear ratio to be used to compensate for the ratio in a steering linkage, should be angle on steering wheel/steer angle

Modelica definition

model AckermannSteering 
  "AckermannSteering - steers the right and left wheel according to the Ackermann geometry."
   
  
  parameter Real wheelbase=2.55 "Distance from front to rear axis";
  parameter Real trackwidth=1.6 "Distance between the front wheels";
  parameter Real ratio=1 
    "Gear ratio to be used to compensate for the ratio in a steering linkage, should be angle on steering wheel/steer angle";
protected 
  parameter Real b=wheelbase;
  parameter Real tw=trackwidth;
  
  Real tand;
  Real delta;
  Real delta_1;
  Real delta_2;
  Real ratio_1;
  Real ratio_2;
  //  Real w_1;
  //  Real w_2;
  //  Real w;
  
  //SI.Position r1,r1d,r2,r2d;
  
public 
  Modelica.Mechanics.Rotational.Interfaces.Flange_a flange_a;
  Modelica.Mechanics.Rotational.Interfaces.Flange_b flange_b1;
  Modelica.Mechanics.Rotational.Interfaces.Flange_b flange_b2;
equation 
  // geometric equations for steering angles
  flange_b1.phi = delta_1;
  flange_b2.phi = delta_2;
  flange_a.phi = delta;
  
  tand = tan(ratio*delta);
  //delta_1 = atan(2*wheelbase*tand/(2*wheelbase - trackwidth*tand));
  //delta_2 = atan(2*wheelbase*tand/(2*wheelbase + trackwidth*tand));
  
  //  w_1 = der(delta_1);
  //  w_2 = der(delta_2);
  //  w = der(delta);
  
  //  w_1 = ratio_1*w;
  //  w_2 = ratio_2*w;
  
  delta_1 = (ratio*ratio_1)*delta;
  delta_2 = (ratio*ratio_2)*delta;
  
  // Torque equations  
  0 = flange_a.tau + ratio*ratio_1*flange_b1.tau + ratio*ratio_2*flange_b2.tau;
  
  // Derivatives delta_1/delta and delta_2/delta
  ratio_1 = 4*b*b*(1 + tand*tand)/(4*b^2 - 4*b*tw*tand + tw*tw*tand^2 + 4*b*b*
    tand^2);
  ratio_2 = 4*b*b*(1 + tand*tand)/(4*b^2 + 4*b*tw*tand + tw*tw*tand^2 + 4*b*b*
    tand^2);
  
end AckermannSteering;

VehicleDynamics.Chassis.Components.Simple VehicleDynamics.Chassis.Components.Simple

Simple - Suspension linkage model whithout geometry. Camber and Steering are specified as functions of bounce. This should be extended so that track width changes could be modelled as well.

VehicleDynamics.Chassis.Components.Simple

Information


This model has no linkage defined. Instead, the model applies camber and additional steering angles to the wheel depending on its bounce motion. For handling studies, this model provides an convienient way to examine different linkage characteristics. From a simulation point of view, it may also be advatageous when simulation speed is critical due to its lack of closed kinematic loops.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} makes a left-hand linkage into a right-hand dito.
  rUW:         location of wheel centre, resolved in frame_C
  q0Strut:     The additional unstretched strut length, compared to the referecne geometry.
  Mass and inertia properties not yet solved!  
 

Parameters

NameDefaultDescription
rUW[3]{0.0,0.9,0}[m]
rCU[3]{0.0,0.85,0}[m]
q0Strut0.2[m]
leftLinkage(rUW_scaled[2] > 0) 
scaleFactor[3]{1,1,1}To make right hand side Linkage use {1,-1,1}
rCMU[3]{0,0,0}[m]
mU1[kg]
i11U.1[kg.m2]
i22U.1[kg.m2]
i33U.1[kg.m2]
i21U.01[kg.m2]
i31U.01[kg.m2]
i32U.01[kg.m2]
data_S  
steeringPoly  
camberPoly  

Modelica definition

model Simple 
  "Simple - Suspension linkage model whithout geometry. Camber and Steering are specified as functions of bounce. This should be extended so that track width changes could be modelled as well."
   
  
  import SI = Modelica.SIunits;
  parameter SI.Position[3] rUW={0.0,0.9,0} "|Geometry|";
  parameter SI.Position[3] rCU={0.0,0.85,0} "|Geometry|";
  parameter SI.Position q0Strut=0.2 "|Geometry|";
  parameter Boolean leftLinkage=(rUW_scaled[2] > 0) "|Geometry|";
  parameter Real[3] scaleFactor={1,1,1} 
    "To make right hand side Linkage use {1,-1,1}";
  
  parameter SI.Position[3] rCMU={0,0,0} "|Mass and Inertia|";
  parameter SI.Mass mU=1 "|Mass and Inertia|";
  parameter SI.Inertia i11U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i22U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i33U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i21U=.01 "|Mass and Inertia|";
  parameter SI.Inertia i31U=.01 "|Mass and Inertia|";
  parameter SI.Inertia i32U=.01 "|Mass and Inertia|";
  
  //SCALED COORDINATES
protected 
  parameter Real left=if leftLinkage then 1 else -1;
  parameter SI.Position[3] rUW_scaled=Utilities.Functions.EWM(scaleFactor, rUW);
  parameter SI.Position[3] rCU_scaled=Utilities.Functions.EWM(scaleFactor, rCU);
  
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_C;
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_U;
  parameter Utilities.Forces.Utilities.ForceTable1D data_S;
  ModelicaAdditions.MultiBody.Joints.Prismatic bounce(
    n={0,0,1}, 
    q0=0.4, 
    q(stateSelect=StateSelect.always), 
    qd(stateSelect=StateSelect.always));
  ModelicaAdditions.MultiBody.Joints.Revolute steering;
  ModelicaAdditions.MultiBody.Joints.Revolute camber(n={left,0,0});
  Modelica.Mechanics.Rotational.Interfaces.Flange_a steerAxis;
  ModelicaAdditions.MultiBody.Parts.FrameTranslation upper(r=rCU_scaled + {0,
        0,0.4});
  Modelica.Mechanics.Translational.Sensors.PositionSensor sensor;
  Modelica.Mechanics.Rotational.Position camberAngle(exact=true);
  Modelica.Mechanics.Rotational.Position addSteeringAngle(exact=true);
  Utilities.Polynomial.Evaluation camberTable(poly=camberPoly) 
    "Camber angle[rad] as function of bounce [m] as scaled polynomial";
  Utilities.Polynomial.Evaluation steeringTable(poly=steeringPoly) 
    "Steering angle[rad] as function of bounce [m] as scaled polynomial";
  Utilities.RotationalSum sum(ratio_a1=scaleFactor[2], ratio_a2=scaleFactor[
        2]);
  Utilities.Forces.SpringDamperTableLine3D SpringDamperTableLine3D1(
    data=data_S, 
    s_rel0=q0Strut + 0.4, 
    n1={1,0,0});
  Utilities.Parts.Body upright(
    m=mU, 
    I11=i11U, 
    I22=i22U, 
    I33=i33U, 
    I21=i21U, 
    I31=i31U, 
    I32=i32U, 
    widthDirection={1,0,0}, 
    r=rUW_scaled - rCU_scaled, 
    rCM=rCMU);
  Modelica.Mechanics.Translational.Interfaces.Flange_a bounceAxis;
  parameter Utilities.Polynomial.ScaledPolynomial steeringPoly(
    redeclare type uType = SI.Position, 
    redeclare type yType = SI.Angle, 
    u_min=-0.082, 
    u_max=0.078, 
    y_min=-0.010297, 
    y_max=0.0012217, 
    c={6.30814489981295e+000,-1.63208206468340e+001,1.59971846025538e+001,-9.43372508316803e+000,
        2.72106634745229e+000,7.28435761181664e-001}, 
    original=[-8.20000000000000e-002, -1.91986217719376e-003; -6.20000000000000e-002, 
         -4.20000000000000e-002; -2.20000000000000e-002, -1.60000000000000e-002; 
         -2.00000000000000e-003, 0.00000000000000e+000; 1.80000000000000e-002, 
        3.80000000000000e-002; 5.80000000000000e-002, 7.80000000000000e-002; 
        6.98131700797732e-004, 1.22173047639603e-003; 1.22173047639603e-003, 
        8.72664625997165e-004; 1.74532925199433e-004, 0.00000000000000e+000; -1.57079632679490e-003, 
         -4.01425727958696e-003; -7.15584993317675e-003, -1.02974425867665e-002]);
  parameter Utilities.Polynomial.ScaledPolynomial camberPoly(
    redeclare type uType = SI.Position, 
    redeclare type yType = SI.Angle, 
    u_min=-0.082, 
    u_max=0.078, 
    y_min=-0.0055851, 
    y_max=0.027576, 
    c={-4.98260440195846e+000,1.28215982847983e+001,-1.17916202644075e+001,
        5.83708966179418e+000,-2.88532206648880e+000,9.99807679818011e-001}, 
    original=[-8.20000000000000e-002, 2.75762021815104e-002; -6.20000000000000e-002, 
         -4.20000000000000e-002; -2.20000000000000e-002, -1.60000000000000e-002; 
         -2.00000000000000e-003, 0.00000000000000e+000; 1.80000000000000e-002, 
        3.80000000000000e-002; 5.80000000000000e-002, 7.80000000000000e-002; 
        1.79768912955416e-002, 1.09955742875643e-002; 5.75958653158129e-003, 
        4.01425727958696e-003; 5.23598775598299e-004, 0.00000000000000e+000; -2.96705972839036e-003, 
         -4.71238898038469e-003; -5.58505360638185e-003, -5.58505360638185e-003]);
  
  Modelica.Blocks.Math.Gain Gain1(k={left});
equation 
  connect(camber.frame_a, steering.frame_b);
  connect(upper.frame_a, frame_C);
  connect(upper.frame_b, bounce.frame_a);
  connect(camberAngle.flange_b, camber.axis);
  connect(bounce.axis, sensor.flange_a);
  connect(bounce.frame_b, steering.frame_a);
  connect(camberTable.outPort, camberAngle.inPort);
  connect(sensor.outPort, steeringTable.inPort);
  connect(camberTable.inPort, sensor.outPort);
  connect(addSteeringAngle.flange_b, sum.flange_a1);
  connect(steerAxis, sum.flange_a2);
  connect(sum.flange_b, steering.axis);
  connect(bounce.frame_b, SpringDamperTableLine3D1.frame_a);
  connect(SpringDamperTableLine3D1.frame_b, bounce.frame_a);
  connect(upright.frame_a, camber.frame_b);
  connect(upright.frame_b, frame_U);
  connect(bounce.axis, bounceAxis);
  connect(Gain1.outPort, addSteeringAngle.inPort);
  connect(Gain1.inPort, steeringTable.outPort);
end Simple;

VehicleDynamics.Chassis.Components.RackSteering4 VehicleDynamics.Chassis.Components.RackSteering4

RackSteering - standard steering system

VehicleDynamics.Chassis.Components.RackSteering4

Information


A geometrical approach shows that the outer wheel should turn less when the car turns. This effect is often reffered to as Ackermann steering but was devided by Lankensperger. The steering rack is connected to one upright/spindle/kingping at each end via a rod allows the oter wheel to turn less than the inner wheel.

Advantages: Allows the wheels to rotate accorting to the Ackermann steering geometry.

Disadvantages: -

Usage: Most vehicles.

The following parameters are used to define the component, see nomenclature for further information: The right hand side parameters, ending with _2, are by default symmetric to the left hand dito ending with _1.

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} mirrors it around the xz-plane.
  ratioWheelToRack=22: rack-pinion gear ratio [m/rad]
  rX_1:   location of frame X_1, resolved in frame_C
  rXL1_1: location of left rod end, resolved in frame_C
  rRL_1:  location of left rack end, resolved in frame_C
  rX_2:   location of frame X_2, resolved in frame_C,
  rXL1_2: location of right rod end, resolved in frame_C
  rRL_2:  location of right rack end, resolved in frame_C
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1}To make right hand side Linkage use {1,-1,1}
rXL_1[3]{-0.12,0.85,0.08}Vector to . resolved in innerFrame [m]
rRL_1[3]{-0.16,0.54,0.085}[m]
rX_1[3]{0.0,0.9,0}[m]
rXL_2[3]Utilities.Functions.EWM({1,-1,1}, rXL_1)[m]
rRL_2[3]Utilities.Functions.EWM({1,-1,1}, rRL_1)[m]
rX_2[3]Utilities.Functions.EWM({1,-1,1}, rX_1)[m]
iSW0.2Steering inertia [kg.m2]
ratioWheelToRack22rotatational to translational ratio [m/rad]
data_R  

Modelica definition

model RackSteering4 "RackSteering - standard steering system " 
  import SI = Modelica.SIunits;
  parameter Real[3] scaleFactor={1,1,1} 
    "To make right hand side Linkage use {1,-1,1}";
  parameter SI.Position[3] rXL_1={-0.12,0.85,0.08} 
    "Vector to . resolved in innerFrame";
  //{-0.1280,0.6430,0.0744} 
  parameter SI.Position[3] rRL_1={-0.16,0.54,0.085};
  //{-0.1600,0.3070,0.0950};
  parameter SI.Position[3] rX_1={0.0,0.9,0};
  //{0.0059,0.6905,-0.0710} + {-0.0060,0.0365,0.1110};
  parameter SI.Position[3] rXL_2=Utilities.Functions.EWM({1,-1,1}, rXL_1);
  parameter SI.Position[3] rRL_2=Utilities.Functions.EWM({1,-1,1}, rRL_1);
  parameter SI.Position[3] rX_2=Utilities.Functions.EWM({1,-1,1}, rX_1);
  parameter SI.Inertia iSW=0.2 "Steering inertia";
  parameter Real ratioWheelToRack=22 
    "rotatational to translational ratio [m/rad]";
  
protected 
  parameter SI.Position[3] rXL_1_scaled=Utilities.Functions.EWM(scaleFactor, rXL_1);
  parameter SI.Position[3] rRL_1_scaled=Utilities.Functions.EWM(scaleFactor, rRL_1);
  parameter SI.Position[3] rX_1_scaled=Utilities.Functions.EWM(scaleFactor, rX_1);
  parameter SI.Position[3] rXL_2_scaled=Utilities.Functions.EWM(scaleFactor, rXL_2);
  parameter SI.Position[3] rRL_2_scaled=Utilities.Functions.EWM(scaleFactor, rRL_2);
  parameter SI.Position[3] rX_2_scaled=Utilities.Functions.EWM(scaleFactor, rX_2);
  parameter SI.Position[3] rr=rRL_2_scaled - (rRL_1_scaled + rRL_2_scaled)/2;
  parameter SI.Position[3] rl=rRL_1_scaled - (rRL_1_scaled + rRL_2_scaled)/2;
  
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_C;
public 
  Modelica.Mechanics.Rotational.IdealGearR2T wheelToRack(ratio=1/
        ratioWheelToRack);
  Modelica.Mechanics.Rotational.Interfaces.Flange_a flange_a;
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_X_1;
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_X_2;
  ModelicaAdditions.MultiBody.Joints.Prismatic Prismatic(
    n=-(rRL_1_scaled - rRL_2_scaled), 
    q(stateSelect=StateSelect.always), 
    qd(stateSelect=StateSelect.always));
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslation(r=(
        rRL_1_scaled + rRL_2_scaled)/2);
  Utilities.Parts.Body rightRack(r=rr);
  Utilities.Parts.Body leftRack(r=rl);
  Modelica.Mechanics.Rotational.Inertia inertia(J=iSW);
  Utilities.Forces.SpringDamperTableRot1D springDamper(data=data_R);
  parameter Utilities.Forces.Utilities.ForceTable1D data_R;
equation 
  connect(Prismatic.frame_a, frameTranslation.frame_b);
  connect(frameTranslation.frame_a, frame_C);
  connect(Prismatic.frame_b, leftRack.frame_a);
  connect(rightRack.frame_a, leftRack.frame_a);
  connect(rightRack.frame_b, frame_X_2);
  connect(leftRack.frame_b, frame_X_1);
  connect(inertia.flange_a, flange_a);
  connect(wheelToRack.flange_b, Prismatic.axis);
  connect(springDamper.flange_b, wheelToRack.flange_a);
  connect(springDamper.flange_a, inertia.flange_b);
end RackSteering4;

VehicleDynamics.Chassis.Components.MacPherson VehicleDynamics.Chassis.Components.MacPherson

MacPherson strut linkage

VehicleDynamics.Chassis.Components.MacPherson

Information


The MacPherson strut suspension was invented in the 1940s by Earl S. MacPherson of Ford. It was introduced on the 1950 English Ford and has since become one of the dominating suspensions systems of the world because of its compactness and low cost. Unlike other suspension designs, in MacPherson strut suspension, the telescopic shock absorber also serves as a link to control the position of the wheel and makes the upper control arm obsolete. Since the strut is vertically positioned, the whole suspension is very compact and suitable for front-wheel drive cars, whose engine and transmission are all located inside the front compartment and need front suspensions which engage very little width of the car.

Advantages: Compact and cheap.

Disadvantages: Body roll and wheel's movement lead to variation in camber, although not as severe as swing axle suspension.

Usage: The MacPherson strut is the dominatin front suspension for cars.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} makes a left-hand linkage into a right-hand dito.
  rUL1L2: location of outer ballUtilities.Joints.Joint, resolved in frame_C
  rCL1:   location of inner frontUtilities.Joints.Joint, resolved in frame_C
  rCL2:   location of inner rearUtilities.Joints.Joint, resolved in frame_C
  rCS:    location of strut mount in chassis, resolved in frame_C
  rUS:    location of strut mount in upright, resolved in frame_C
  rUW:    location of frame_W, resolved in frame_C
  forceTable: To set the force generation table add a component named [name] of class Utilities.Forces.Utilities.ForceTable1D to the model and write forceTable=[name] in the modifiers row
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1}To make right hand side Linkage use {1,-1,1}
rCL1[3]{0.1070,0.55,-0.0380} Vector from origin of frame_C to front link mount in chassis resolved in frame_C (at initial time) [m]
rCL2[3]{-0.3070,0.55,-0.0380} Vector from origin of frame_C to rear link mount in chassis resolved in frame_C (at initial time) [m]
rCS[3]{-0.0295,0.850,0.5670} Vector from origin of frame_C to strut mount in chassis resolved in frame_C (at initial time) [m]
rUS[3]{-0.0070,0.8733,0.1380} Vector from origin of frame_C to strut mount in uppright resolved in frame_C (at initial time) [m]
rUL1L2[3]{-0.0070,0.8733,-0.0380} Vector from origin of frame_C to low spindleUtilities.Joints.Joint resolved in frame_C (at initial time) [m]
rUW[3]{0.0,0.9,0} Vector from origin of frame_C to wheel centre resolved in frame_C (at initial time) [m]
rRL3[3]{-0.12,0.85,0.08} Vector from origin of frame_C to origin of frame_S resolved in frame_C (at initial time) [m]
rUL3[3]{0.0,0.9,0} Vector from origin of frame_C to lower ball of steering rod resolved in frame_C (at initial time) [m]
q0S0.05 Unstretched additional spring length of the strut, compared to the construction geometry [m]
rCMU[3]{0,0,0}[m]
mU0[kg]
i11U0[kg.m2]
i22U0[kg.m2]
i33U0[kg.m2]
i21U0[kg.m2]
i31U0[kg.m2]
i32U0[kg.m2]
rCML1L2[3]{0,0,0}[m]
mL1L20[kg]
i11L1L2.0[kg.m2]
i22L1L2.0[kg.m2]
i33L1L2.0[kg.m2]
i21L1L2.0[kg.m2]
i31L1L2.0[kg.m2]
i32L1L2.0[kg.m2]

Modelica definition

model MacPherson "MacPherson strut linkage" 
  import SI = Modelica.SIunits;
  
  extends Chassis.Interfaces.Interface;
  parameter Real[3] scaleFactor={1,1,1} 
    "To make right hand side Linkage use {1,-1,1}";
  parameter SI.Position[3] rCL1={0.1070,0.55,-0.0380} 
    "|Geometry| Vector from origin of frame_C to front link mount in chassis resolved in frame_C (at initial time)";
  parameter SI.Position[3] rCL2={-0.3070,0.55,-0.0380} 
    "|Geometry| Vector from origin of frame_C to rear link mount in chassis resolved in frame_C (at initial time)";
  parameter SI.Position[3] rCS={-0.0295,0.850,0.5670} 
    "|Geometry| Vector from origin of frame_C to strut mount in chassis resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUS={-0.0070,0.8733,0.1380} 
    "|Geometry| Vector from origin of frame_C to strut mount in uppright resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUL1L2={-0.0070,0.8733,-0.0380} 
    "|Geometry| Vector from origin of frame_C to low spindleUtilities.Joints.Joint resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUW={0.0,0.9,0} 
    "|Geometry| Vector from origin of frame_C to wheel centre resolved in frame_C (at initial time)";
  parameter SI.Position[3] rRL3={-0.12,0.85,0.08} 
    "|Geometry| Vector from origin of frame_C to origin of frame_S resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUL3={0.0,0.9,0} 
    "|Geometry| Vector from origin of frame_C to lower ball of steering rod resolved in frame_C (at initial time)";
  parameter SI.Length q0S=0.05 
    "|Geometry| Unstretched additional spring length of the strut, compared to the construction geometry";
  
  parameter SI.Position[3] rCMU={0,0,0} "|Mass and Inertia|Wheel carrier|";
  parameter SI.Mass mU=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i11U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i22U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i33U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i21U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i31U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i32U=0 "|Mass and Inertia|Wheel carrier|";
  
  parameter SI.Position[3] rCML1L2={0,0,0} "|Mass and Inertia|Wishbone|";
  parameter SI.Mass mL1L2=0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i11L1L2=.0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i22L1L2=.0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i33L1L2=.0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i21L1L2=.0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i31L1L2=.0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i32L1L2=.0 "|Mass and Inertia|Wishbone|";
  
  /*Scaled coordinates*/
protected 
  parameter SI.Position[3] rCL1_scaled=Utilities.Functions.EWM(scaleFactor, rCL1);
  parameter SI.Position[3] rCL2_scaled=Utilities.Functions.EWM(scaleFactor, rCL2);
  parameter SI.Position[3] rCS_scaled=Utilities.Functions.EWM(scaleFactor, rCS);
  parameter SI.Position[3] rUS_scaled=Utilities.Functions.EWM(scaleFactor, rUS);
  parameter SI.Position[3] rUL1L2_scaled=Utilities.Functions.EWM(scaleFactor, rUL1L2);
  parameter SI.Position[3] rUW_scaled=Utilities.Functions.EWM(scaleFactor, rUW);
  parameter SI.Position[3] rRL3_scaled=Utilities.Functions.EWM(scaleFactor, rRL3);
  parameter SI.Position[3] rUL3_scaled=Utilities.Functions.EWM(scaleFactor, rUL3);
  parameter SI.Length q0Strut=sqrt((rCS_scaled - rUS_scaled)*(rCS_scaled - rUS_scaled))
       + q0S;
  parameter SI.Length L_frontBar=sqrt((rCL1_scaled - rUL1L2_scaled)*(rCL1_scaled - 
      rUL1L2_scaled)) "length of frontBar";
  parameter SI.Length L_rearBar=sqrt((rCL2_scaled - rUL1L2_scaled)*(rCL2_scaled - 
      rUL1L2_scaled)) "length of rearBar";
  parameter SI.Length L_springRod=sqrt((rUS_scaled - rUL1L2_scaled)*(rUS_scaled - 
      rUL1L2_scaled));
  parameter SI.Length L_outerRod=sqrt((rUW_scaled - rUL1L2_scaled)*(rUW_scaled - 
      rUL1L2_scaled));
  parameter SI.Position rS[3]=rCS_scaled - rUL1L2_scaled;
  parameter SI.Position rU[3]=rUW_scaled - rUL1L2_scaled 
    "Position vector from frame_L1L2 to frame_U, resolved in frame_C";
  parameter Real n_a[3]=cross(rS, rU) 
    "First rotation axis of universalUtilities.Joints.Joint in springJoint, resolved in frame_C";
  
public 
  ModelicaAdditions.MultiBody.Joints.Revolute innerJoint(
    q(stateSelect=StateSelect.always), 
    qd(stateSelect=StateSelect.always), 
    n=rCL1_scaled - rCL2_scaled);
  
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_L12;
  Utilities.Forces.Utilities.ForceTable1D data_S;
  ModelicaAdditions.MultiBody.Parts.FrameTranslation upper(r=rCS_scaled);
  Utilities.Joints.JointUPS MacPherson(n_a=n_a);
  Utilities.Parts.Body springRod(r=rUS_scaled - rUL1L2_scaled, mass=false);
  Utilities.Forces.SpringDamperTableLine3D strut(s_rel0=q0Strut, data=data_S);
  Utilities.Parts.Body outerRod(r=rUW_scaled - rUL1L2_scaled, mass=false);
  ModelicaAdditions.MultiBody.Parts.Body U(
    rCM=rCMU, 
    m=mU, 
    I11=i11U, 
    I22=i22U, 
    I33=i33U, 
    I21=i21U, 
    I31=i31U, 
    I32=i32U);
  Utilities.Parts.Body steeringRod(r=rUL3_scaled - rRL3_scaled, shape=
        "cylinder");
  Utilities.Joints.JointRSU steeringJoint(
    n_b={1,0,0}, 
    n_a=rCS_scaled - rUL1L2_scaled, 
    r_a=rUL3_scaled - rUL1L2_scaled);
  ModelicaAdditions.MultiBody.Parts.FrameTranslation lower(r=rCL1_scaled);
  Utilities.Parts.Body frontBar(r=rUL1L2_scaled - rCL1_scaled);
  Utilities.Parts.Body rearBar(r=rCL2_scaled - rUL1L2_scaled, widthDirection
      =cross(rCL2_scaled - rUL1L2_scaled, {0,0,1}));
protected 
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_ta1;
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_S;
  Utilities.Parts.Body steeringLever(r=rUL3_scaled - rUL1L2_scaled);
equation 
  connect(lower.frame_a, frame_C);
  connect(upper.frame_a, frame_C);
  connect(MacPherson.frame_b, upper.frame_b);
  connect(steeringJoint.frame_b, frame_S);
  connect(outerRod.frame_b, frame_U);
  connect(MacPherson.frame_pb, strut.frame_b);
  connect(springRod.frame_b, strut.frame_a);
  connect(frame_ta1, outerRod.frame_a);
  connect(U.frame_a, frame_ta1);
  connect(frame_ta1, steeringJoint.frame_ta);
  connect(MacPherson.frame_pa, steeringJoint.frame_a);
  connect(springRod.frame_a, frame_ta1);
  connect(rearBar.frame_a, frontBar.frame_b);
  connect(frontBar.frame_b, MacPherson.frame_a);
  connect(steeringJoint.frame_c, steeringRod.frame_a);
  connect(frame_L12, frontBar.frame_b);
  connect(steeringLever.frame_a, steeringJoint.frame_ta);
  connect(innerJoint.frame_a, lower.frame_b);
  connect(innerJoint.frame_b, frontBar.frame_a);
end MacPherson;

VehicleDynamics.Chassis.Components.SimpleAntiRollBar VehicleDynamics.Chassis.Components.SimpleAntiRollBar

AntiRollBar - standard anti-roll linkage.

VehicleDynamics.Chassis.Components.SimpleAntiRollBar

Information


To a torsion bar with levers in each end, two connecting rods are attached, these are normally attached at the left and right suspension linkage to reduce roll motion. This component is modelled with rigid elements, except for a torsion bar. The force generation fue to deflection is modelled from table values.

Usage: Most vehicles with independent suspensions, both front and rear.

The following parameters are used to define the component, see nomenclature for further information: The right hand side parameters, ending with _2, are by default symmetric to the left hand dito ending with _1.

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} mirrors it around the xz-plane.
  ratioWheelToRack=22: rack-pinion gear ratio [m/rad]
  rX_1:   location of frame X_1, resolved in frame_C
  rXL1_1: location of left link end, resolved in frame_C
  rAL_1:  location of left torsion bar end, resolved in frame_C
  rX_2:   location of frame X_2, resolved in frame_C,
  rXL1_2: location of right link end, resolved in frame_C
  rAL_2:  location of right torsion bar end, resolved in frame_C
  forceTable: To set the force generation table add a component named [name] of class Utilities.Forces.Utilities.ForceTable1D to the model and write forceTable=[name] in the modifiers row
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
r2t1/abs(rAL_1_scaled[1] - rCA_1_scaled[1])[m]
scaleFactor[3]{1,1,1} 
rCA_1[3]{-0.2405,0.3420,0.0330}vector to left torsion beam end resolved in frame_C [m]
rAL_1[3]{-0.0439,0.5115,0.0203}vector to left inner anti roll rod end/left anti roll lever resolved in frame_C [m]
rXL_1[3]{-0.0564,0.5401,0.2183}vector to left outer anti roll rod end resolved in frame_C [m]
rX_1[3]{0.0059,0.6905,-0.0710} + {-0.0060,0.0365,0.1110}vector to left anti roll mount resolved in frame_C [m]
rCA_2[3]Utilities.Functions.EWM({1,-1,1}, rCA_1)[m]
rAL_2[3]Utilities.Functions.EWM({1,-1,1}, rAL_1)[m]
rXL_2[3]Utilities.Functions.EWM({1,-1,1}, rXL_1)[m]
rX_2[3]Utilities.Functions.EWM({1,-1,1}, rX_1)[m]
data  

Modelica definition

model SimpleAntiRollBar "AntiRollBar - standard anti-roll linkage." 
  
  SI.Position[3] r_rel "location difference of frame_X_1 and frame_X_2,
resolved in inertial frame";
  SI.Position[3] r_rel2 "location difference of frame_X_1 and frame_X_2,
resolved in frame_C";
  //Real s "offset to use in force calculation";
  
  parameter SI.Position r2t=1/abs(rAL_1_scaled[1] - rCA_1_scaled[1]);
  
  Real f;
  Real tau;
  SI.Angle phi_rel;
  Real w_rel;
  
  parameter Real[3] scaleFactor={1,1,1};
  parameter SI.Position[3] rCA_1={-0.2405,0.3420,0.0330} 
    "vector to left torsion beam end resolved in frame_C";
  parameter SI.Position[3] rAL_1={-0.0439,0.5115,0.0203} 
    "vector to left inner anti roll rod end/left anti roll lever resolved in frame_C";
  parameter SI.Position[3] rXL_1={-0.0564,0.5401,0.2183} 
    "vector to left outer anti roll rod end resolved in frame_C";
  parameter SI.Position[3] rX_1={0.0059,0.6905,-0.0710} + {-0.0060,0.0365,0.1110} 
    "vector to left anti roll mount resolved in frame_C";
  
  parameter SI.Position[3] rCA_2=Utilities.Functions.EWM({1,-1,1}, rCA_1);
  parameter SI.Position[3] rAL_2=Utilities.Functions.EWM({1,-1,1}, rAL_1);
  parameter SI.Position[3] rXL_2=Utilities.Functions.EWM({1,-1,1}, rXL_1);
  parameter SI.Position[3] rX_2=Utilities.Functions.EWM({1,-1,1}, rX_1);
  
protected 
  parameter SI.Position[3] rCA_1_scaled=Utilities.Functions.EWM(scaleFactor, rCA_1);
  parameter SI.Position[3] rAL_1_scaled=Utilities.Functions.EWM(scaleFactor, rAL_1);
  parameter SI.Position[3] rXL_1_scaled=Utilities.Functions.EWM(scaleFactor, rXL_1);
  parameter SI.Position[3] rX_1_scaled=Utilities.Functions.EWM(scaleFactor, rX_1);
  
  parameter SI.Position[3] rCA_2_scaled=Utilities.Functions.EWM(scaleFactor, rCA_2);
  parameter SI.Position[3] rAL_2_scaled=Utilities.Functions.EWM(scaleFactor, rAL_2);
  parameter SI.Position[3] rXL_2_scaled=Utilities.Functions.EWM(scaleFactor, rXL_2);
  parameter SI.Position[3] rX_2_scaled=Utilities.Functions.EWM(scaleFactor, rX_2);
public 
  parameter Utilities.Forces.Utilities.ForceTable1D data;
public 
  ModelicaAdditions.Tables.CombiTable1D Dr(
    table=data.fd, 
    tableName=data.tableName_D, 
    fileName=data.fileName_D, 
    icol=data.icol_D);
  ModelicaAdditions.Tables.CombiTable1D Cr(
    table=data.fc, 
    tableName=data.tableName_C, 
    fileName=data.fileName_C, 
    icol=data.icol_C);
  
public 
  Real f_C[3];
equation 
  
  w_rel = der(phi_rel);
  
  Cr.inPort.signal[1] = phi_rel;
  Dr.inPort.signal[1] = w_rel;
  
  tau = Cr.outPort.signal[1] + Dr.outPort.signal[1];
  
  r_rel = frame_X_1.r0 - frame_X_2.r0;
  r_rel2 = transpose(frame_C.S)*r_rel;
  //frame_C.S*r_rel2 = r_rel;
  phi_rel = r2t*r_rel2[3];
  
  f = tau*r2t;
  
  f_C = frame_C.S*{0,0,f};
  frame_X_1.f = transpose(frame_X_1.S)*f_C;
  frame_X_2.f = -transpose(frame_X_2.S)*f_C;
  
  //{0,0,f} = transpose(frame_C.S)*frame_X_1.S*frame_X_1.f;
  //{0,0,-f} = transpose(frame_C.S)*frame_X_2.S*frame_X_2.f;
  
  frame_X_1.t = zeros(3);
  frame_X_2.t = zeros(3);
  
  frame_C.t = cross({0,0,f}, r_rel2);
  frame_C.f = zeros(3);
  
  
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_X_2;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_X_1;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_C;
end SimpleAntiRollBar;

VehicleDynamics.Chassis.Components.Strut VehicleDynamics.Chassis.Components.Strut

Strut - Integrated spring-damper unit

VehicleDynamics.Chassis.Components.Strut

Information


The damper is mounted inside the coil spring which gives a compact component. The force generation is modelled from table values

Advantages: Compact.

Disadvantages: Mounting and Demounting is sometimes more timeconsuming than with separate components.

Usage: Front suspension in many cars.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} mirrors it around the xz-plane.
  rA: location of strut end A, resolved in frame_A.
  rB: location of strut end B, resolved in frame_B.
  s0: unstretched strut length. Not affected by scaleFactor.
  forceTable: To set the force generation table add a component named [name] of class Utilities.Forces.Utilities.ForceTable1D to the model and write forceTable=[name] in the modifiers row
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1} 
rA[3]{.0,-.05,0.05}[m]
rB[3]{0.1,0.1,.3}[m]
s00Unstreched strut length
data  

Modelica definition

model Strut "Strut - Integrated spring-damper unit" 
  parameter Real[3] scaleFactor={1,1,1};
  parameter SI.Position[3] rA={.0,-.05,0.05};
  parameter SI.Position[3] rB={0.1,0.1,.3};
  
  parameter Real s0=0 "Unstreched strut length";
  
protected 
  parameter SI.Position[3] rA_scaled=Utilities.Functions.EWM(scaleFactor, rA);
  parameter SI.Position[3] rB_scaled=Utilities.Functions.EWM(scaleFactor, rB);
  
  
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_b;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_a;
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslationA(r=
        rA_scaled);
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslationB(r=
        rB_scaled);
  parameter Utilities.Forces.Utilities.ForceTable1D data(fd=0.8*[-1, 10000; -0.5, 3300; 
         0, 0; 0.5, -3300; 1, -10000], fc=8*[-1, 10000; -0.5, 3300; 0, 0; 0.5, 
        -3300; 1, -10000]);
  Utilities.Forces.SpringDamperTableLine3D springDamper(data=data, s_rel0=s0);
  Utilities.Parts.Shape shapeA(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
  Utilities.Parts.Shape shapeB(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
equation 
  connect(frameTranslationA.frame_a, frame_a);
  connect(frameTranslationB.frame_a, frame_b);
  connect(springDamper.frame_a, frameTranslationA.frame_b);
  connect(springDamper.frame_b, frameTranslationB.frame_b);
  connect(shapeA.frame_a, frameTranslationA.frame_b);
  connect(shapeB.frame_a, frameTranslationB.frame_b);
end Strut;

VehicleDynamics.Chassis.Components.TrailingArm VehicleDynamics.Chassis.Components.TrailingArm

VehicleDynamics.Chassis.Components.TrailingArm

Information

A so called wishbone (A-arm) suspesnion component
- Left side shall be connected to chassis
- Right side shall be connected to wheel carrier, the so called
spindle
- Lower side intefrace might be used to attach spring,
shockabsorber or anti roll bar for example to the wishbone
Any bushings needed in model are to be attched outside the
wishbone. The chassis side needs a PairBushing to make a standard
wishbone configuration 

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1} 
rCU[3]{0.34,0.72,0.01}[m]
rUW[3]{0.0,0.9,0}[m]
nCU[3]{0.11,1,-0.001} 
rCMU[3]{0,0,0}[m]
mU1[kg]
i11U.1[kg.m2]
i22U.1[kg.m2]
i33U.1[kg.m2]
i21U.01[kg.m2]
i31U.01[kg.m2]
i32U.01[kg.m2]

Modelica definition

model TrailingArm 
  parameter Real[3] scaleFactor={1,1,1} "|Geometry|";
  parameter SI.Position[3] rCU={0.34,0.72,0.01} "|Geometry|";
  parameter SI.Position[3] rUW={0.0,0.9,0} "|Geometry|";
  parameter Real[3] nCU={0.11,1,-0.001} "|Geometry|";
  
  parameter SI.Position[3] rCMU={0,0,0} "|Mass and Inertia|";
  parameter SI.Mass mU=1 "|Mass and Inertia|";
  parameter SI.Inertia i11U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i22U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i33U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i21U=.01 "|Mass and Inertia|";
  parameter SI.Inertia i31U=.01 "|Mass and Inertia|";
  parameter SI.Inertia i32U=.01 "|Mass and Inertia|";
  
protected 
  parameter SI.Position[3] rCU_scaled=Utilities.Functions.EWM(scaleFactor, rCU);
  parameter SI.Position[3] rUW_scaled=Utilities.Functions.EWM(scaleFactor, rUW);
  parameter Real[3] nCU_scaled=Utilities.Functions.EWM(scaleFactor, nCU);
  
public 
  ModelicaAdditions.MultiBody.Joints.Revolute innerJoint(
    n=nCU_scaled, 
    q(start=0), 
    qd(start=0));
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslation(r=
        rUW_scaled - rCU_scaled);
  ModelicaAdditions.MultiBody.Parts.Body body(rCM={-0.1,0,0}, m=10);
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_U;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_C;
  Utilities.Parts.Shape rearEnd(
    widthDirection=nCU_scaled, 
    length=0.17, 
    width=sqrt((rUW_scaled - rCU_scaled)*(rUW_scaled - rCU_scaled))/20, 
    height=sqrt((rUW_scaled - rCU_scaled)*(rUW_scaled - rCU_scaled))/10, 
    material={0.1,0.1,0.1,1}, 
    lengthDirection=Utilities.Functions.EWM({1,-1,1}, (rUW_scaled - rCU_scaled)));
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslation2(r=
        rCU_scaled);
  Modelica.Mechanics.Rotational.Interfaces.Flange_a axis;
  Utilities.Parts.Shape shape(
    widthDirection={0,0,1}, 
    width=0.07, 
    height=0.03, 
    material={0.1,0.2,0.2,0.5}, 
    lengthDirection=rUW_scaled - rCU_scaled + {0,rCU_scaled[2]*0.25,0}, 
    length=sqrt((rUW_scaled - rCU_scaled + {0,rCU_scaled[2]*0.25,0})*(
        rUW_scaled - rCU_scaled + {0,rCU_scaled[2]*0.25,0})), 
    r0=-{0,rCU_scaled[2]*0.25,0});
equation 
  connect(innerJoint.frame_b, frameTranslation.frame_a);
  connect(body.frame_a, innerJoint.frame_b);
  connect(frameTranslation.frame_b, frame_U);
  connect(rearEnd.frame_a, frameTranslation.frame_b);
  connect(frameTranslation2.frame_b, innerJoint.frame_a);
  connect(frameTranslation2.frame_a, frame_C);
  connect(innerJoint.axis, axis);
  connect(shape.frame_a, innerJoint.frame_b);
end TrailingArm;

VehicleDynamics.Chassis.Components.MultiLink4 VehicleDynamics.Chassis.Components.MultiLink4

MultiLink4 - Linkage with four massless links, one more than neccessary

VehicleDynamics.Chassis.Components.MultiLink4

Information


The essence of a multilink is that there are more links than necessary to constrain a motion. This is done because the bushings used to reduce vibrations and nocie to the chassis also give a less controlled motion.

Usage: Premium cars and sportier cars that do not use double wishbones.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} makes a left-hand linkage into a right-hand dito.
  rUL1:   location of lower outer joint, resolved in frame_C
  rCL1:   location of lower inner joint, resolved in frame_C
  rUL2:   location of upper outer joint, resolved in frame_C
  rCL2:   location of upper inner front joint, resolved in frame_C
  rUL3:   location of outer steering joint, resolved in frame_C
  rCL3:   location of inner steering joint, resolved in frame_C
  rCU:    location of inner (front) trailing arm joint, resolved in frame_C
  rUW:    location of wheel centre, resolved in frame_C
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1}To make right hand side Linkage use {1,-1,1}
rCL1[3]{-0.5550,-0.3690,-0.0320}[m]
rCL2[3]{-0.4240,-0.1900,0.1640}[m]
rCL3[3]{-0.3320,-0.1300,0.0570}[m]
rCU[3]{0,0,0}[m]
rUL1[3]{-0.5250,0.0620,-0.0670}[m]
rUL2[3]{-0.4330,0.0680,0.1500}[m]
rUL3[3]{-0.3350,0.0116,0.0400}[m]
rUW[3]{-0.4650,0.1330,0.0200}[m]
rCMU[3]{0,0,0}[m]
mU1[kg]
i11U.1[kg.m2]
i22U.1[kg.m2]
i33U.1[kg.m2]
i21U.01[kg.m2]
i31U.01[kg.m2]
i32U.01[kg.m2]
data_CL3  
data_UL1  
data_CU  

Modelica definition

model MultiLink4 
  "MultiLink4 - Linkage with four massless links, one more than neccessary"
   
  
  extends Chassis.Interfaces.Interface;
  parameter Real[3] scaleFactor={1,1,1} 
    "To make right hand side Linkage use {1,-1,1}";
  
  parameter SI.Position[3] rCL1={-0.5550,-0.3690,-0.0320};
  parameter SI.Position[3] rCL2={-0.4240,-0.1900,0.1640};
  parameter SI.Position[3] rCL3={-0.3320,-0.1300,0.0570};
  parameter SI.Position[3] rCU={0,0,0};
  parameter SI.Position[3] rUL1={-0.5250,0.0620,-0.0670};
  parameter SI.Position[3] rUL2={-0.4330,0.0680,0.1500};
  parameter SI.Position[3] rUL3={-0.3350,0.0116,0.0400};
  parameter SI.Position[3] rUW={-0.4650,0.1330,0.0200};
  
  parameter SI.Position[3] rCMU={0,0,0} "|Mass and Inertia|";
  parameter SI.Mass mU=1 "|Mass and Inertia|";
  parameter SI.Inertia i11U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i22U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i33U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i21U=.01 "|Mass and Inertia|";
  parameter SI.Inertia i31U=.01 "|Mass and Inertia|";
  parameter SI.Inertia i32U=.01 "|Mass and Inertia|";
  
  /*Scaled coordinates*/
protected 
  parameter SI.Position[3] rCL1_scaled=Utilities.Functions.EWM(scaleFactor, rCL1);
  parameter SI.Position[3] rCL2_scaled=Utilities.Functions.EWM(scaleFactor, rCL2);
  parameter SI.Position[3] rCL3_scaled=Utilities.Functions.EWM(scaleFactor, rCL3);
  parameter SI.Position[3] rCU_scaled=Utilities.Functions.EWM(scaleFactor, rCU);
  parameter SI.Position[3] rUL1_scaled=Utilities.Functions.EWM(scaleFactor, rUL1);
  parameter SI.Position[3] rUL2_scaled=Utilities.Functions.EWM(scaleFactor, rUL2);
  parameter SI.Position[3] rUL3_scaled=Utilities.Functions.EWM(scaleFactor, rUL3);
  parameter SI.Position[3] rUW_scaled=Utilities.Functions.EWM(scaleFactor, rUW);
  
public 
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslationUW(r=
        rUW_scaled - rCU_scaled);
  Utilities.Parts.Shape shape1(
    r0=rUW_scaled - rCU_scaled, 
    lengthDirection={-1,-0.05,0}, 
    widthDirection={0,0,1}, 
    length=0.14, 
    width=0.07, 
    height=0.03, 
    material={0.1,0.2,0.2,0.5});
  
  /*
  Chassis.Components.MasslessCutPushRod Link2(
    rB=rCU_scaled - rUL2_scaled, 
    rA=rCL2_scaled, 
    rRod=rUL2_scaled - rCL2_scaled, 
    dataA=data_CL2, 
    dataB=data_UL2) annotation (extent=[-40, -50; 0, -10]);
  Chassis.Components.MasslessCutPushRod Link1(
    rB=rCU_scaled - rUL1_scaled, 
    rA=rCL1_scaled, 
    rRod=rUL1_scaled - rCL1_scaled, 
    dataA=data_CL1, 
    dataB=data_UL1) annotation (extent=[-40, -82; 0, -42]);
  Chassis.Components.MasslessCutPushRod Link3(
    rB=rCU_scaled - rUL3_scaled, 
    rA=rCL3_scaled, 
    rRod=rUL3_scaled - rCL3_scaled, 
    dataA=data_CL3, 
    dataB=data_UL3) annotation (extent=[-40, -20; 0, 20]);
*/
  
  MasslessCutPushRod Link2(
    rB=rCU_scaled - rUL2_scaled, 
    rA=rCL2_scaled, 
    rRod=rUL2_scaled - rCL2_scaled, 
    dataA=data_CL2, 
    dataB=data_UL2);
  MasslessCutPushRod Link1(
    rB=rCU_scaled - rUL1_scaled, 
    rA=rCL1_scaled, 
    rRod=rUL1_scaled - rCL1_scaled, 
    dataA=data_CL1, 
    dataB=data_UL1);
  MasslessCutPushRod Link3(
    rB=rCU_scaled - rUL3_scaled, 
    rA=rCL3_scaled, 
    rRod=rUL3_scaled - rCL3_scaled, 
    dataA=data_CL3, 
    dataB=data_UL3);
  
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslationCU(r=
        rCU_scaled);
  parameter Chassis.Data.BumpBushingData data_CL3;
  Chassis.Data.BumpBushingData data_UL3;
  Chassis.Data.BumpBushingData data_CL2;
  Chassis.Data.BumpBushingData data_UL2;
  Chassis.Data.BumpBushingData data_CL1;
  parameter Chassis.Data.BumpBushingData data_UL1;
  ModelicaAdditions.MultiBody.Parts.Body U(
    rCM=rCMU, 
    m=mU, 
    I11=i11U, 
    I22=i22U, 
    I33=i33U, 
    I21=i21U, 
    I31=i31U, 
    I32=i32U);
  parameter Chassis.Data.BumpBushingData data_CU;
  Chassis.Components.Bushing Bushing1(data=data_CU);
  Utilities.Parts.Shape shape(
    widthDirection={0,0,1}, 
    width=0.07, 
    height=0.03, 
    material={0.1,0.2,0.2,0.5}, 
    lengthDirection=rUW_scaled - rCU_scaled + {0,rCU_scaled[2]*0.25,0}, 
    length=sqrt((rUW_scaled - rCU_scaled + {0,rCU_scaled[2]*0.25,0})*(
        rUW_scaled - rCU_scaled + {0,rCU_scaled[2]*0.25,0})), 
    r0=-{0,rCU_scaled[2]*0.25,0});
equation 
  connect(Link2.frame_a, frame_C);
  connect(frameTranslationUW.frame_b, frame_U);
  connect(Link3.frame_a, frame_C);
  connect(Link1.frame_a, frame_C);
  connect(frameTranslationCU.frame_a, frame_C);
  connect(Bushing1.frame_a, frameTranslationCU.frame_b);
  connect(Bushing1.frame_b, Link3.frame_b);
  connect(Link2.frame_b, Bushing1.frame_b);
  connect(Link1.frame_b, Bushing1.frame_b);
  connect(shape1.frame_a, Bushing1.frame_b);
  connect(U.frame_a, Bushing1.frame_b);
  connect(frameTranslationUW.frame_a, Bushing1.frame_b);
  connect(shape.frame_a, Bushing1.frame_b);
end MultiLink4;

VehicleDynamics.Chassis.Components.MacPherson4 VehicleDynamics.Chassis.Components.MacPherson4

MacPherson strut linkage

VehicleDynamics.Chassis.Components.MacPherson4

Information


The MacPherson strut suspension was invented in the 1940s by Earl S. MacPherson of Ford. It was introduced on the 1950 English Ford and has since become one of the dominating suspensions systems of the world because of its compactness and low cost. Unlike other suspension designs, in MacPherson strut suspension, the telescopic shock absorber also serves as a link to control the position of the wheel and makes the upper control arm obsolete. Since the strut is vertically positioned, the whole suspension is very compact and suitable for front-wheel drive cars, whose engine and transmission are all located inside the front compartment and need front suspensions which engage very little width of the car.

Advantages: Compact and cheap.

Disadvantages: Body roll and wheel's movement lead to variation in camber, although not as severe as swing axle suspension.

Usage: The MacPherson strut is the dominatin front suspension for cars.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} makes a left-hand linkage into a right-hand dito.
  rUL1L2: location of outer ballUtilities.Joints.Joint, resolved in frame_C
  rCL1:   location of inner frontUtilities.Joints.Joint, resolved in frame_C
  rCL2:   location of inner rearUtilities.Joints.Joint, resolved in frame_C
  rCS:    location of strut mount in chassis, resolved in frame_C
  rUS:    location of strut mount in upright, resolved in frame_C
  rUW:    location of frame_W, resolved in frame_C
  forceTable: To set the force generation table add a component named [name] of class Utilities.Forces.Utilities.ForceTable1D to the model and write forceTable=[name] in the modifiers row
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1}To make right hand side Linkage use {1,-1,1}
rCL1[3]{0.1070,0.55,-0.0380} Vector from origin of frame_C to front link mount in chassis resolved in frame_C (at initial time) [m]
rCL2[3]{-0.3070,0.55,-0.0380} Vector from origin of frame_C to rear link mount in chassis resolved in frame_C (at initial time) [m]
rCS[3]{-0.0295,0.850,0.5670} Vector from origin of frame_C to strut mount in chassis resolved in frame_C (at initial time) [m]
rUS[3]{-0.0070,0.8733,0.1380} Vector from origin of frame_C to strut mount in uppright resolved in frame_C (at initial time) [m]
rUL1L2[3]{-0.0070,0.8733,-0.0380} Vector from origin of frame_C to low spindleUtilities.Joints.Joint resolved in frame_C (at initial time) [m]
rUW[3]{0.0,0.9,0} Vector from origin of frame_C to wheel centre resolved in frame_C (at initial time) [m]
rRL3[3]{-0.12,0.85,0.08} Vector from origin of frame_C to origin of frame_S resolved in frame_C (at initial time) [m]
rUL3[3]{0.0,0.9,0} Vector from origin of frame_C to lower ball of steering rod resolved in frame_C (at initial time) [m]
q0S0.05 Unstretched additional spring length of the strut, compared to the construction geometry [m]
rCMU[3]{0,0,0}[m]
mU1[kg]
i11U0.1[kg.m2]
i22U0.1[kg.m2]
i33U0.1[kg.m2]
i21U0[kg.m2]
i31U0[kg.m2]
i32U0[kg.m2]
rCML1L2[3]{0,0,0}[m]
mL1L21[kg]
i11L1L20.1[kg.m2]
i22L1L20.1[kg.m2]
i33L1L20.1[kg.m2]
i21L1L20[kg.m2]
i31L1L20[kg.m2]
i32L1L20[kg.m2]

Modelica definition

model MacPherson4 "MacPherson strut linkage" 
  import SI = Modelica.SIunits;
  
  extends Chassis.Interfaces.Interface;
  parameter Real[3] scaleFactor={1,1,1} 
    "To make right hand side Linkage use {1,-1,1}";
  parameter SI.Position[3] rCL1={0.1070,0.55,-0.0380} 
    "|Geometry| Vector from origin of frame_C to front link mount in chassis resolved in frame_C (at initial time)";
  parameter SI.Position[3] rCL2={-0.3070,0.55,-0.0380} 
    "|Geometry| Vector from origin of frame_C to rear link mount in chassis resolved in frame_C (at initial time)";
  parameter SI.Position[3] rCS={-0.0295,0.850,0.5670} 
    "|Geometry| Vector from origin of frame_C to strut mount in chassis resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUS={-0.0070,0.8733,0.1380} 
    "|Geometry| Vector from origin of frame_C to strut mount in uppright resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUL1L2={-0.0070,0.8733,-0.0380} 
    "|Geometry| Vector from origin of frame_C to low spindleUtilities.Joints.Joint resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUW={0.0,0.9,0} 
    "|Geometry| Vector from origin of frame_C to wheel centre resolved in frame_C (at initial time)";
  parameter SI.Position[3] rRL3={-0.12,0.85,0.08} 
    "|Geometry| Vector from origin of frame_C to origin of frame_S resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUL3={0.0,0.9,0} 
    "|Geometry| Vector from origin of frame_C to lower ball of steering rod resolved in frame_C (at initial time)";
  parameter SI.Length q0S=0.05 
    "|Geometry| Unstretched additional spring length of the strut, compared to the construction geometry";
  
  parameter SI.Position[3] rCMU={0,0,0} "|Mass and Inertia|Wheel carrier|";
  parameter SI.Mass mU=1 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i11U=0.1 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i22U=0.1 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i33U=0.1 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i21U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i31U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i32U=0 "|Mass and Inertia|Wheel carrier|";
  
  parameter SI.Position[3] rCML1L2={0,0,0} "|Mass and Inertia|Wishbone|";
  parameter SI.Mass mL1L2=1 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i11L1L2=0.1 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i22L1L2=0.1 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i33L1L2=0.1 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i21L1L2=0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i31L1L2=0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i32L1L2=0 "|Mass and Inertia|Wishbone|";
  
  /*Scaled coordinates*/
protected 
  parameter SI.Position[3] rCL1_scaled=Utilities.Functions.EWM(scaleFactor, rCL1);
  parameter SI.Position[3] rCL2_scaled=Utilities.Functions.EWM(scaleFactor, rCL2);
  parameter SI.Position[3] rCS_scaled=Utilities.Functions.EWM(scaleFactor, rCS);
  parameter SI.Position[3] rUS_scaled=Utilities.Functions.EWM(scaleFactor, rUS);
  parameter SI.Position[3] rUL1L2_scaled=Utilities.Functions.EWM(scaleFactor, rUL1L2);
  parameter SI.Position[3] rUW_scaled=Utilities.Functions.EWM(scaleFactor, rUW);
  parameter SI.Position[3] rRL3_scaled=Utilities.Functions.EWM(scaleFactor, rRL3);
  parameter SI.Position[3] rUL3_scaled=Utilities.Functions.EWM(scaleFactor, rUL3);
  parameter SI.Length q0Strut=sqrt((rCS_scaled - rUS_scaled)*(rCS_scaled - rUS_scaled))
       + q0S;
  parameter SI.Length L_frontBar=sqrt((rCL1_scaled - rUL1L2_scaled)*(rCL1_scaled - 
      rUL1L2_scaled)) "length of frontBar";
  parameter SI.Length L_rearBar=sqrt((rCL2_scaled - rUL1L2_scaled)*(rCL2_scaled - 
      rUL1L2_scaled)) "length of rearBar";
  parameter SI.Length L_springRod=sqrt((rUS_scaled - rUL1L2_scaled)*(rUS_scaled - 
      rUL1L2_scaled));
  parameter SI.Length L_outerRod=sqrt((rUW_scaled - rUL1L2_scaled)*(rUW_scaled - 
      rUL1L2_scaled));
  parameter SI.Position rS[3]=rCS_scaled - rUL1L2_scaled;
  parameter SI.Position rU[3]=rUW_scaled - rUL1L2_scaled 
    "Position vector from frame_L1L2 to frame_U, resolved in frame_C";
  parameter Real n_a[3]=cross(rS, rU) 
    "First rotation axis of universalUtilities.Joints.Joint in springJoint, resolved in frame_C";
  
  
protected 
  parameter Chassis.Data.BumpBushingData data_CL1;
  parameter Chassis.Data.BumpBushingData data_CL2;
  Chassis.Components.PairBushing pairBushing(
    rB1={0,0,0}, 
    data2=data_CL2, 
    data1=data_CL1, 
    rB2=rCL2_scaled - rCL1_scaled);
public 
  ModelicaAdditions.MultiBody.Parts.Body body(
    m=mL1L2, 
    rCM=rCML1L2, 
    I11=i11L1L2, 
    I22=i22L1L2, 
    I33=i33L1L2, 
    I21=i21L1L2, 
    I31=i31L1L2, 
    I32=i32L1L2);
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_L12;
  Utilities.Forces.Utilities.ForceTable1D data_S;
  ModelicaAdditions.MultiBody.Parts.FrameTranslation upper(r=rCS_scaled);
  Utilities.Joints.JointUPS MacPherson(n_a=n_a);
  Utilities.Parts.Body springRod(r=rUS_scaled - rUL1L2_scaled, mass=false);
  Utilities.Forces.SpringDamperTableLine3D strut(s_rel0=q0Strut, data=data_S);
  Utilities.Parts.Body outerRod(r=rUW_scaled - rUL1L2_scaled, mass=false);
  ModelicaAdditions.MultiBody.Parts.Body U(
    rCM=rCMU, 
    m=mU, 
    I11=i11U, 
    I22=i22U, 
    I33=i33U, 
    I21=i21U, 
    I31=i31U, 
    I32=i32U);
  Utilities.Parts.Body steeringRod(r=rUL3_scaled - rRL3_scaled, shape=
        "cylinder");
  Utilities.Joints.JointRSU steeringJoint(
    n_b={1,0,0}, 
    n_a=rCS_scaled - rUL1L2_scaled, 
    r_a=rUL3_scaled - rUL1L2_scaled);
  ModelicaAdditions.MultiBody.Parts.FrameTranslation lower(r=rCL1_scaled);
  Utilities.Parts.Body frontBar(r=rUL1L2_scaled - rCL1_scaled);
  Utilities.Parts.Body rearBar(r=rCL2_scaled - rUL1L2_scaled, widthDirection
      =cross(rCL2_scaled - rUL1L2_scaled, {0,0,1}));
protected 
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_ta1;
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_S;
  Utilities.Parts.Body steeringLever(r=rUL3_scaled - rUL1L2_scaled);
equation 
  connect(lower.frame_a, frame_C);
  connect(upper.frame_a, frame_C);
  connect(MacPherson.frame_b, upper.frame_b);
  connect(steeringJoint.frame_b, frame_S);
  connect(outerRod.frame_b, frame_U);
  connect(MacPherson.frame_pb, strut.frame_b);
  connect(springRod.frame_b, strut.frame_a);
  connect(frame_ta1, outerRod.frame_a);
  connect(U.frame_a, frame_ta1);
  connect(frame_ta1, steeringJoint.frame_ta);
  connect(MacPherson.frame_pa, steeringJoint.frame_a);
  connect(springRod.frame_a, frame_ta1);
  connect(rearBar.frame_a, frontBar.frame_b);
  connect(frontBar.frame_b, MacPherson.frame_a);
  connect(steeringJoint.frame_c, steeringRod.frame_a);
  connect(pairBushing.frame_b, frontBar.frame_a);
  connect(pairBushing.frame_a, lower.frame_b);
  connect(pairBushing.frame_b, body.frame_a);
  connect(frame_L12, frontBar.frame_b);
  connect(steeringLever.frame_a, steeringJoint.frame_ta);
end MacPherson4;

VehicleDynamics.Chassis.Components.MultiLink42 VehicleDynamics.Chassis.Components.MultiLink42

MultiLink4 - Linkage with four links, one more than neccessary

VehicleDynamics.Chassis.Components.MultiLink42

Information


The essence of a multilink is that there are more links than necessary to constrain a motion. This is done because the bushings used to reduce vibrations and nocie to the chassis also give a less controlled motion.

Usage: Premium cars and sportier cars that do not use double wishbones.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} makes a left-hand linkage into a right-hand dito.
  rUL1:   location of lower outer joint, resolved in frame_C
  rCL1:   location of lower inner joint, resolved in frame_C
  rUL2:   location of upper outer joint, resolved in frame_C
  rCL2:   location of upper inner front joint, resolved in frame_C
  rUL3:   location of outer steering joint, resolved in frame_C
  rCL3:   location of inner steering joint, resolved in frame_C
  rCU:    location of inner (front) trailing arm joint, resolved in frame_C
  rUW:    location of wheel centre, resolved in frame_C
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1}To make right hand side Linkage use {1,-1,1}
rCL1[3]{-0.5550,-0.3690,-0.0320}[m]
rCL2[3]{-0.4240,-0.1900,0.1640}[m]
rCL3[3]{-0.3320,-0.1300,0.0570}[m]
rCU[3]{0,0,0}[m]
rUL1[3]{-0.5250,0.0620,-0.0670}[m]
rUL2[3]{-0.4330,0.0680,0.1500}[m]
rUL3[3]{-0.3350,0.0116,0.0400}[m]
rUW[3]{-0.4650,0.1330,0.0200}[m]
rCMU[3]{0,0,0}[m]
mU1[kg]
i11U.1[kg.m2]
i22U.1[kg.m2]
i33U.1[kg.m2]
i21U.01[kg.m2]
i31U.01[kg.m2]
i32U.01[kg.m2]
data_CL3  
data_UL1  
data_CU  

Modelica definition

model MultiLink42 
  "MultiLink4 - Linkage with four links, one more than neccessary" 
  
  extends Chassis.Interfaces.Interface;
  parameter Real[3] scaleFactor={1,1,1} 
    "To make right hand side Linkage use {1,-1,1}";
  
  parameter SI.Position[3] rCL1={-0.5550,-0.3690,-0.0320};
  parameter SI.Position[3] rCL2={-0.4240,-0.1900,0.1640};
  parameter SI.Position[3] rCL3={-0.3320,-0.1300,0.0570};
  parameter SI.Position[3] rCU={0,0,0};
  parameter SI.Position[3] rUL1={-0.5250,0.0620,-0.0670};
  parameter SI.Position[3] rUL2={-0.4330,0.0680,0.1500};
  parameter SI.Position[3] rUL3={-0.3350,0.0116,0.0400};
  parameter SI.Position[3] rUW={-0.4650,0.1330,0.0200};
  
  parameter SI.Position[3] rCMU={0,0,0} "|Mass and Inertia|";
  parameter SI.Mass mU=1 "|Mass and Inertia|";
  parameter SI.Inertia i11U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i22U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i33U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i21U=.01 "|Mass and Inertia|";
  parameter SI.Inertia i31U=.01 "|Mass and Inertia|";
  parameter SI.Inertia i32U=.01 "|Mass and Inertia|";
  
  /*Scaled coordinates*/
protected 
  parameter SI.Position[3] rCL1_scaled=Utilities.Functions.EWM(scaleFactor, rCL1);
  parameter SI.Position[3] rCL2_scaled=Utilities.Functions.EWM(scaleFactor, rCL2);
  parameter SI.Position[3] rCL3_scaled=Utilities.Functions.EWM(scaleFactor, rCL3);
  parameter SI.Position[3] rCU_scaled=Utilities.Functions.EWM(scaleFactor, rCU);
  parameter SI.Position[3] rUL1_scaled=Utilities.Functions.EWM(scaleFactor, rUL1);
  parameter SI.Position[3] rUL2_scaled=Utilities.Functions.EWM(scaleFactor, rUL2);
  parameter SI.Position[3] rUL3_scaled=Utilities.Functions.EWM(scaleFactor, rUL3);
  parameter SI.Position[3] rUW_scaled=Utilities.Functions.EWM(scaleFactor, rUW);
  
public 
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslationUW(r=
        rUW_scaled - rCU_scaled);
  Utilities.Parts.Shape shape(
    widthDirection={0,0,1}, 
    width=0.07, 
    height=0.03, 
    material={0.1,0.2,0.2,0.5}, 
    lengthDirection=rUW_scaled - rCU_scaled + {0,rCU_scaled[2]*0.25,0}, 
    length=sqrt((rUW_scaled - rCU_scaled + {0,rCU_scaled[2]*0.25,0})*(
        rUW_scaled - rCU_scaled + {0,rCU_scaled[2]*0.25,0})), 
    r0=-{0,rCU_scaled[2]*0.25,0});
  Utilities.Parts.Shape shape1(
    r0=rUW_scaled - rCU_scaled, 
    lengthDirection={-1,-0.05,0}, 
    widthDirection={0,0,1}, 
    length=0.14, 
    width=0.07, 
    height=0.03, 
    material={0.1,0.2,0.2,0.5});
  
  /*
  Chassis.Components.MasslessCutPushRod Link2(
    rB=rCU_scaled - rUL2_scaled, 
    rA=rCL2_scaled, 
    rRod=rUL2_scaled - rCL2_scaled, 
    dataA=data_CL2, 
    dataB=data_UL2) annotation (extent=[-40, -50; 0, -10]);
  Chassis.Components.MasslessCutPushRod Link1(
    rB=rCU_scaled - rUL1_scaled, 
    rA=rCL1_scaled, 
    rRod=rUL1_scaled - rCL1_scaled, 
    dataA=data_CL1, 
    dataB=data_UL1) annotation (extent=[-40, -82; 0, -42]);
  Chassis.Components.MasslessCutPushRod Link3(
    rB=rCU_scaled - rUL3_scaled, 
    rA=rCL3_scaled, 
    rRod=rUL3_scaled - rCL3_scaled, 
    dataA=data_CL3, 
    dataB=data_UL3) annotation (extent=[-40, -20; 0, 20]);
*/
  
  CutPushRod Link2(
    rB=rCU_scaled - rUL2_scaled, 
    rA=rCL2_scaled, 
    rRod=rUL2_scaled - rCL2_scaled, 
    dataA=data_CL2, 
    dataB=data_UL2);
  CutPushRod Link1(
    rB=rCU_scaled - rUL1_scaled, 
    rA=rCL1_scaled, 
    rRod=rUL1_scaled - rCL1_scaled, 
    dataA=data_CL1, 
    dataB=data_UL1);
  CutPushRod Link3(
    rB=rCU_scaled - rUL3_scaled, 
    rA=rCL3_scaled, 
    rRod=rUL3_scaled - rCL3_scaled, 
    dataA=data_CL3, 
    dataB=data_UL3);
  
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslationCU(r=
        rCU_scaled);
  parameter Chassis.Data.BumpBushingData data_CL3;
  Chassis.Data.BumpBushingData data_UL3;
  Chassis.Data.BumpBushingData data_CL2;
  Chassis.Data.BumpBushingData data_UL2;
  Chassis.Data.BumpBushingData data_CL1;
  parameter Chassis.Data.BumpBushingData data_UL1;
  ModelicaAdditions.MultiBody.Parts.Body U(
    rCM=rCMU, 
    m=mU, 
    I11=i11U, 
    I22=i22U, 
    I33=i33U, 
    I21=i21U, 
    I31=i31U, 
    I32=i32U);
  parameter Chassis.Data.BumpBushingData data_CU;
  Chassis.Components.Bushing Bushing1(data=data_CU);
equation 
  connect(Link2.frame_a, frame_C);
  connect(frameTranslationUW.frame_b, frame_U);
  connect(Link3.frame_a, frame_C);
  connect(Link1.frame_a, frame_C);
  connect(frameTranslationCU.frame_a, frame_C);
  connect(Bushing1.frame_a, frameTranslationCU.frame_b);
  connect(Bushing1.frame_b, Link3.frame_b);
  connect(Link2.frame_b, Bushing1.frame_b);
  connect(Link1.frame_b, Bushing1.frame_b);
  connect(shape1.frame_a, Bushing1.frame_b);
  connect(shape.frame_a, Bushing1.frame_b);
  connect(U.frame_a, Bushing1.frame_b);
  connect(frameTranslationUW.frame_a, Bushing1.frame_b);
end MultiLink42;

VehicleDynamics.Chassis.Components.DoubleWishBone VehicleDynamics.Chassis.Components.DoubleWishBone

MacPherson strut linkage

VehicleDynamics.Chassis.Components.DoubleWishBone

Information


The MacPherson strut suspension was invented in the 1940s by Earl S. MacPherson of Ford. It was introduced on the 1950 English Ford and has since become one of the dominating suspensions systems of the world because of its compactness and low cost. Unlike other suspension designs, in MacPherson strut suspension, the telescopic shock absorber also serves as a link to control the position of the wheel and makes the upper control arm obsolete. Since the strut is vertically positioned, the whole suspension is very compact and suitable for front-wheel drive cars, whose engine and transmission are all located inside the front compartment and need front suspensions which engage very little width of the car.

Advantages: Compact and cheap.

Disadvantages: Body roll and wheel's movement lead to variation in camber, although not as severe as swing axle suspension.

Usage: The MacPherson strut is the dominatin front suspension for cars.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} makes a left-hand linkage into a right-hand dito.
  rUL1L2: location of outer ballUtilities.Joints.Joint, resolved in frame_C
  rCL1:   location of inner frontUtilities.Joints.Joint, resolved in frame_C
  rCL4:   location of inner rearUtilities.Joints.Joint, resolved in frame_C
  rCS:    location of strut mount in chassis, resolved in frame_C
  rUS:    location of strut mount in upright, resolved in frame_C
  rUW:    location of frame_W, resolved in frame_C
  forceTable: To set the force generation table add a component named [name] of class Utilities.Forces.Utilities.ForceTable1D to the model and write forceTable=[name] in the modifiers row
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1}To make right hand side Linkage use {1,-1,1}
rCL3[3]{0.1070,0.55,-0.0380} Vector from origin of frame_C to front link mount in chassis resolved in frame_C (at initial time) [m]
rCL4[3]{-0.3070,0.55,-0.0380} Vector from origin of frame_C to rear link mount in chassis resolved in frame_C (at initial time) [m]
rCL1[3]{0.12,0.55,-0.14}Vector to low front link abutment resolved in frame_C
rCL2[3]{-0.125,0.55,-0.14}Vector to low rear link abutment resolved in frame_C
rUL1L2[3]{0.0,0.85,-0.14}Vector to low spindle joint resolved in frame_C
rUL3L4[3]{-0.0070,0.8733,-0.0380} Vector from origin of frame_C to low spindleUtilities.Joints.Joint resolved in frame_C (at initial time) [m]
rUW[3]{0.0,0.9,0} Vector from origin of frame_C to wheel centre resolved in frame_C (at initial time) [m]
rRL5[3]{-0.12,0.85,0.08} Vector from origin of frame_C to origin of frame_S resolved in frame_C (at initial time) [m]
rUL5[3]{0.0,0.9,0} Vector from origin of frame_C to lower ball of steering rod resolved in frame_C (at initial time) [m]
rCMU[3]{0,0,0}[m]
mU0[kg]
i11U0[kg.m2]
i22U0[kg.m2]
i33U0[kg.m2]
i21U0[kg.m2]
i31U0[kg.m2]
i32U0[kg.m2]

Modelica definition

model DoubleWishBone "MacPherson strut linkage" 
  import SI = Modelica.SIunits;
  
  extends Chassis.Interfaces.Interface;
  parameter Real[3] scaleFactor={1,1,1} 
    "To make right hand side Linkage use {1,-1,1}";
  parameter SI.Position[3] rCL3={0.1070,0.55,-0.0380} 
    "|Geometry| Vector from origin of frame_C to front link mount in chassis resolved in frame_C (at initial time)";
  parameter SI.Position[3] rCL4={-0.3070,0.55,-0.0380} 
    "|Geometry| Vector from origin of frame_C to rear link mount in chassis resolved in frame_C (at initial time)";
  parameter Real[3] rCL1={0.12,0.55,-0.14} 
    "Vector to low front link abutment resolved in frame_C";
  parameter Real[3] rCL2={-0.125,0.55,-0.14} 
    "Vector to low rear link abutment resolved in frame_C";
  parameter Real[3] rUL1L2={0.0,0.85,-0.14} 
    "Vector to low spindle joint resolved in frame_C";
  parameter SI.Position[3] rUL3L4={-0.0070,0.8733,-0.0380} 
    "|Geometry| Vector from origin of frame_C to low spindleUtilities.Joints.Joint resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUW={0.0,0.9,0} 
    "|Geometry| Vector from origin of frame_C to wheel centre resolved in frame_C (at initial time)";
  parameter SI.Position[3] rRL5={-0.12,0.85,0.08} 
    "|Geometry| Vector from origin of frame_C to origin of frame_S resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUL5={0.0,0.9,0} 
    "|Geometry| Vector from origin of frame_C to lower ball of steering rod resolved in frame_C (at initial time)";
  
  parameter SI.Position[3] rCMU={0,0,0} "|Mass and Inertia|Wheel carrier|";
  parameter SI.Mass mU=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i11U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i22U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i33U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i21U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i31U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i32U=0 "|Mass and Inertia|Wheel carrier|";
  
  /*  parameter SI.Position[3] rCML3L4={0,0,0} "|Mass and Inertia|LowerWishbone|";
  parameter SI.Mass mL3L4=0 "|Mass and Inertia|Lower Wishbone|";
  parameter SI.Inertia i11L3L4=.0 "|Mass and Inertia|LowerWishbone|";
  parameter SI.Inertia i22L3L4=.0 "|Mass and Inertia|LowerWishbone|";
  parameter SI.Inertia i33L3L4=.0 "|Mass and Inertia|LowerWishbone|";
  parameter SI.Inertia i21L3L4=.0 "|Mass and Inertia|LowerWishbone|";
  parameter SI.Inertia i31L3L4=.0 "|Mass and Inertia|LowerWishbone|";
  parameter SI.Inertia i32L3L4=.0 "|Mass and Inertia|LowerWishbone|";
  
  parameter SI.Position[3] rCML1L2={0,0,0} "|Mass and Inertia|Wishbone|";
  parameter SI.Mass mL1L2=0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i11L1L2=.0 "|Mass and Inertia|Upper Wishbone|";
  parameter SI.Inertia i22L1L2=.0 "|Mass and Inertia|Upper Wishbone|";
  parameter SI.Inertia i33L1L2=.0 "|Mass and Inertia|Upper Wishbone|";
  parameter SI.Inertia i21L1L2=.0 "|Mass and Inertia|Upper Wishbone|";
  parameter SI.Inertia i31L1L2=.0 "|Mass and Inertia|Upper Wishbone|";
  parameter SI.Inertia i32L1L2=.0 "|Mass and Inertia|Upper Wishbone|";
*/
  /*Scaled coordinates*/
protected 
  parameter SI.Position[3] rCL3_scaled=Utilities.Functions.EWM(scaleFactor, rCL3);
  parameter SI.Position[3] rCL4_scaled=Utilities.Functions.EWM(scaleFactor, rCL4);
  parameter Real[3] rCL1_scaled=Utilities.Functions.EWM(scaleFactor, rCL1);
  parameter Real[3] rCL2_scaled=Utilities.Functions.EWM(scaleFactor, rCL2);
  parameter Real[3] rUL1L2_scaled=Utilities.Functions.EWM(scaleFactor, rUL1L2);
  parameter SI.Position[3] rUL3L4_scaled=Utilities.Functions.EWM(scaleFactor, rUL3L4);
  parameter SI.Position[3] rUW_scaled=Utilities.Functions.EWM(scaleFactor, rUW);
  parameter SI.Position[3] rRL5_scaled=Utilities.Functions.EWM(scaleFactor, rRL5);
  parameter SI.Position[3] rUL5_scaled=Utilities.Functions.EWM(scaleFactor, rUL5);
  parameter SI.Position rU[3]=rUW_scaled - rUL3L4_scaled 
    "Position vector from frame_L3L4 to frame_U, resolved in frame_C";
  parameter Real n_a[3]=cross(rCL1, rU) 
    "First rotation axis of universalUtilities.Joints.Joint in springJoint, resolved in frame_C";
  
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_L3L4;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_S;
  Utilities.Parts.Body uprightShape(r=rUL1L2_scaled - rUL3L4_scaled);
  ModelicaAdditions.MultiBody.Parts.FrameTranslation upper(r=rCL1_scaled);
  Utilities.Joints.JointUS uprightJoint(n_a=n_a, L=sqrt((rUL1L2_scaled - 
        rUL3L4_scaled)*(rUL1L2_scaled - rUL3L4_scaled)));
  Utilities.Parts.Body outerRod(r=rUW_scaled - rUL3L4_scaled);
  ModelicaAdditions.MultiBody.Parts.Body U(
    rCM=rCMU, 
    m=mU, 
    I11=i11U, 
    I22=i22U, 
    I33=i33U, 
    I21=i21U, 
    I31=i31U, 
    I32=i32U);
  Utilities.Parts.Body steeringRod(
    material={0,0,1,1}, 
    r=rUL5_scaled - rRL5_scaled, 
    shape="cylinder", 
    height=0.03, 
    animation=true) 
    "{sqrt((rUL3L4_scaled - rRL5_scaled)*(rUL3L4_scaled - rRL5_scaled)),0,0}";
  Utilities.Joints.JointRSU steeringJoint(
    n_b={1,0,0}, 
    n_a=rUL1L2_scaled - rUL3L4_scaled, 
    r_a=rUL5_scaled - rUL3L4_scaled);
  ModelicaAdditions.MultiBody.Joints.Revolute lowerInnerJoint(
    q(stateSelect=StateSelect.always), 
    qd(stateSelect=StateSelect.always), 
    n=rCL3_scaled - rCL4_scaled);
  ModelicaAdditions.MultiBody.Parts.FrameTranslation lower(r=rCL3_scaled);
  Utilities.Parts.Body lowerFrontBar(r=rUL3L4_scaled - rCL3_scaled, height=
        0.03);
  Utilities.Parts.Body lowerRearBar(
    r=rCL4_scaled - rUL3L4_scaled, 
    widthDirection=cross(rCL4_scaled - rUL3L4_scaled, {0,0,1}), 
    height=0.03);
  
protected 
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_ta1;
public 
  ModelicaAdditions.MultiBody.Joints.Revolute upperInnerJoint(n=rCL1_scaled
         - rCL2_scaled);
  Utilities.Parts.Body upperFrontBar(r=rUL1L2_scaled - rCL1_scaled, height=
        0.03);
  Utilities.Parts.Body upperRearBar(
    r=rCL2_scaled - rUL1L2_scaled, 
    widthDirection=cross(rCL2_scaled - rUL1L2_scaled, {0,0,1}), 
    height=0.03);
  Utilities.Parts.Body steeringLever(r=rUL5_scaled - rUL3L4_scaled);
  Utilities.Parts.Shape shape1(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
  Utilities.Parts.Shape shape2(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
  Utilities.Parts.Shape shape3(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
  Utilities.Parts.Shape shape4(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
  Utilities.Parts.Shape shape5(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
  Utilities.Parts.Shape shape6(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
  Utilities.Parts.Shape shape7(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
  Utilities.Parts.Shape shape8(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
equation 
  connect(lower.frame_a, frame_C);
  connect(lowerInnerJoint.frame_b, lowerFrontBar.frame_a);
  connect(lowerFrontBar.frame_b, uprightJoint.frame_a);
  connect(lowerRearBar.frame_a, lowerFrontBar.frame_b);
  connect(lowerFrontBar.frame_b, frame_L3L4);
  connect(upper.frame_a, frame_C);
  connect(steeringJoint.frame_b, frame_S);
  connect(steeringJoint.frame_c, steeringRod.frame_a);
  connect(outerRod.frame_b, frame_U);
  connect(lower.frame_b, lowerInnerJoint.frame_a);
  connect(frame_ta1, outerRod.frame_a);
  connect(U.frame_a, frame_ta1);
  connect(frame_ta1, steeringJoint.frame_ta);
  connect(uprightShape.frame_a, frame_ta1);
  connect(upperInnerJoint.frame_a, upper.frame_b);
  connect(upperFrontBar.frame_b, uprightJoint.frame_b);
  connect(uprightJoint.frame_c, steeringJoint.frame_a);
  connect(upperRearBar.frame_a, upperFrontBar.frame_b);
  connect(upperFrontBar.frame_a, upperInnerJoint.frame_b);
  connect(steeringLever.frame_a, steeringJoint.frame_ta);
  connect(shape3.frame_a, lowerInnerJoint.frame_b);
  connect(shape4.frame_a, lowerRearBar.frame_b);
  connect(shape1.frame_a, upperInnerJoint.frame_b);
  connect(shape2.frame_a, upperRearBar.frame_b);
  connect(shape5.frame_a, steeringRod.frame_a);
  connect(shape6.frame_a, steeringRod.frame_b);
  connect(shape7.frame_a, uprightJoint.frame_a);
  connect(shape8.frame_a, uprightJoint.frame_b);
end DoubleWishBone;

VehicleDynamics.Chassis.Components.RackSteering VehicleDynamics.Chassis.Components.RackSteering

RackSteering - standard steering system

VehicleDynamics.Chassis.Components.RackSteering

Information


A geometrical approach shows that the outer wheel should turn less when the car turns. This effect is often reffered to as Ackermann steering but was devided by Lankensperger. The steering rack is connected to one upright/spindle/kingping at each end via a rod allows the oter wheel to turn less than the inner wheel.

Advantages: Allows the wheels to rotate accorting to the Ackermann steering geometry.

Disadvantages: -

Usage: Most vehicles.

The following parameters are used to define the component, see nomenclature for further information: The right hand side parameters, ending with _2, are by default symmetric to the left hand dito ending with _1.

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} mirrors it around the xz-plane.
  ratioWheelToRack=22: rack-pinion gear ratio [m/rad]
  rX_1:   location of frame X_1, resolved in frame_C
  rXL1_1: location of left rod end, resolved in frame_C
  rRL_1:  location of left rack end, resolved in frame_C
  rX_2:   location of frame X_2, resolved in frame_C,
  rXL1_2: location of right rod end, resolved in frame_C
  rRL_2:  location of right rack end, resolved in frame_C
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1}To make right hand side Linkage use {1,-1,1}
rXL_1[3]{-0.12,0.85,0.08}Vector to . resolved in innerFrame [m]
rRL_1[3]{-0.16,0.54,0.085}[m]
rX_1[3]{0.0,0.9,0}[m]
rXL_2[3]Utilities.Functions.EWM({1,-1,1}, rXL_1)[m]
rRL_2[3]Utilities.Functions.EWM({1,-1,1}, rRL_1)[m]
rX_2[3]Utilities.Functions.EWM({1,-1,1}, rX_1)[m]
ratioWheelToRack22rotatational to translational ratio [m/rad]

Modelica definition

model RackSteering "RackSteering - standard steering system " 
  
  parameter Real[3] scaleFactor={1,1,1} 
    "To make right hand side Linkage use {1,-1,1}";
  parameter SI.Position[3] rXL_1={-0.12,0.85,0.08} 
    "Vector to . resolved in innerFrame";
  //{-0.1280,0.6430,0.0744} 
  parameter SI.Position[3] rRL_1={-0.16,0.54,0.085};
  //{-0.1600,0.3070,0.0950};
  parameter SI.Position[3] rX_1={0.0,0.9,0};
  //{0.0059,0.6905,-0.0710} + {-0.0060,0.0365,0.1110};
  parameter SI.Position[3] rXL_2=Utilities.Functions.EWM({1,-1,1}, rXL_1);
  parameter SI.Position[3] rRL_2=Utilities.Functions.EWM({1,-1,1}, rRL_1);
  parameter SI.Position[3] rX_2=Utilities.Functions.EWM({1,-1,1}, rX_1);
  
  parameter Real ratioWheelToRack=22 
    "rotatational to translational ratio [m/rad]";
  
protected 
  parameter SI.Position[3] rXL_1_scaled=Utilities.Functions.EWM(scaleFactor, rXL_1);
  parameter SI.Position[3] rRL_1_scaled=Utilities.Functions.EWM(scaleFactor, rRL_1);
  parameter SI.Position[3] rX_1_scaled=Utilities.Functions.EWM(scaleFactor, rX_1);
  parameter SI.Position[3] rXL_2_scaled=Utilities.Functions.EWM(scaleFactor, rXL_2);
  parameter SI.Position[3] rRL_2_scaled=Utilities.Functions.EWM(scaleFactor, rRL_2);
  parameter SI.Position[3] rX_2_scaled=Utilities.Functions.EWM(scaleFactor, rX_2);
  parameter SI.Position[3] rr=rRL_2_scaled - (rRL_1_scaled + rRL_2_scaled)/2;
  parameter SI.Position[3] rl=rRL_1_scaled - (rRL_1_scaled + rRL_2_scaled)/2;
  
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_C;
public 
  Modelica.Mechanics.Rotational.IdealGearR2T wheelToRack(ratio=1/
        ratioWheelToRack);
  Modelica.Mechanics.Rotational.Interfaces.Flange_a flange_a;
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_X_1;
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_X_2;
  ModelicaAdditions.MultiBody.Joints.Prismatic Prismatic(n=-(rRL_1_scaled - 
        rRL_2_scaled));
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslation(r=(
        rRL_1_scaled + rRL_2_scaled)/2);
  Utilities.Parts.Body leftRack(r=rl);
  Utilities.Parts.Body rightRack(r=rr);
equation 
  connect(wheelToRack.flange_a, flange_a);
  connect(Prismatic.frame_a, frameTranslation.frame_b);
  connect(frameTranslation.frame_a, frame_C);
  connect(wheelToRack.flange_b, Prismatic.axis);
  connect(Prismatic.frame_b, leftRack.frame_a);
  connect(rightRack.frame_a, Prismatic.frame_b);
  connect(leftRack.frame_b, frame_X_1);
  connect(rightRack.frame_b, frame_X_2);
end RackSteering;

VehicleDynamics.Chassis.Components.MonoDamperBelleVilleAntiRoll VehicleDynamics.Chassis.Components.MonoDamperBelleVilleAntiRoll

OnBoard linkage that decouples roll and bounce (pitch).

VehicleDynamics.Chassis.Components.MonoDamperBelleVilleAntiRoll

Information


The MonoStrut with BelleVilleAntiRoll is an attempt to decouple pitch and roll motion of cars. In racing this is desired while it makes tuning more convinient. The left and right links are coupled to the same pivot element and when it rotates, both wheels travels symmertrically. To allow assymetrick motion (roll), the pivot element also can travel along the revolute axis.

Usage: In some formula race cars.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} makes a left-hand linkage into a right-hand dito.
  rCP:    location of pivot point, resolved in frame_C
  rCS:    location of strut mount in chassis, resolved in frame_C
  rPS:    location of strut mount in pivot element, resolved in frame_C
  nCP:    direction of pivot revolute and translation, resolved in frame_C
  rPL_1:  location of left link mount in pivot element, resolved in frame_C
  rPX_1:  location of left link outer mount, resolved in frame_C
  rX_1:   location of frame_X_1, resolved in frame_C
  rPL_2:  location of right link mount in pivot element, resolved in frame_C
  rPX_2:  location of right link outer mount, resolved in frame_C
  rX_2:   location of frame_X_2, resolved in frame_C
  forceTable: To set the force generation table add a component named [name] of class Forces.Utilities.ForceTable1D to the model and write forceTable=[name] in the modifiers row
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1} 
rCP[3]{-0.2,0,0.3} 
rCS[3]{-0.1,0,0.4} 
rPS[3]{-1,0,0.4} 
nCP[3]{0,1,0} 
q0S0.05 
rPL_1[3]{0,0.3,0.4} 
rXL_1[3]{0.0129,0.3172,-0.0330} 
rX_1[3]{0.0,0.85,-0.14}vector to frame_X_1 resolved in frame_C
rPL_2[3]Utilities.Functions.EWM({1,-1,1}, rPL_1) 
rXL_2[3]Utilities.Functions.EWM({1,-1,1}, rXL_1) 
rX_2[3]Utilities.Functions.EWM({1,-1,1}, rXL_1) 

Modelica definition

model MonoDamperBelleVilleAntiRoll 
  "OnBoard linkage that decouples roll and bounce (pitch)." 
  parameter Real[3] scaleFactor={1,1,1};
  
  parameter Real[3] rCP={-0.2,0,0.3};
  parameter Real[3] rCS={-0.1,0,0.4};
  parameter Real[3] rPS={-1,0,0.4};
  parameter Real[3] nCP={0,1,0};
  parameter Real q0S=0.05;
  
  parameter Real[3] rPL_1={0,0.3,0.4};
  parameter Real[3] rXL_1={0.0129,0.3172,-0.0330};
  parameter Real[3] rX_1={0.0,0.85,-0.14} 
    "vector to frame_X_1 resolved in frame_C";
  parameter Real[3] rPL_2=Utilities.Functions.EWM({1,-1,1}, rPL_1);
  parameter Real[3] rXL_2=Utilities.Functions.EWM({1,-1,1}, rXL_1);
  parameter Real[3] rX_2=Utilities.Functions.EWM({1,-1,1}, rXL_1);
  
protected 
  parameter Real[3] rCP_scaled=Utilities.Functions.EWM(scaleFactor, rCP);
  parameter Real[3] rCS_scaled=Utilities.Functions.EWM(scaleFactor, rCS);
  parameter Real[3] rPS_scaled=Utilities.Functions.EWM(scaleFactor, rPS);
  parameter Real[3] nCP_scaled=Utilities.Functions.EWM(scaleFactor, nCP);
  
  parameter Real[3] rPL_1_scaled=Utilities.Functions.EWM(scaleFactor, rPL_1);
  parameter Real[3] rXL_1_scaled=Utilities.Functions.EWM(scaleFactor, rXL_1);
  parameter Real[3] rX_1_scaled=Utilities.Functions.EWM(scaleFactor, rX_1);
  parameter Real[3] rPL_2_scaled=Utilities.Functions.EWM(scaleFactor, rPL_2);
  parameter Real[3] rXL_2_scaled=Utilities.Functions.EWM(scaleFactor, rXL_2);
  parameter Real[3] rX_2_scaled=Utilities.Functions.EWM(scaleFactor, rX_2);
  
  
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_a FromChassis;
  ModelicaAdditions.MultiBody.Joints.Prismatic Prismatic1(
    n=nCP, 
    startValueFixed=true, 
    q(stateSelect=StateSelect.prefer));
  Utilities.Parts.Body DamperLever(r=rPS_scaled - rCP_scaled);
  ModelicaAdditions.MultiBody.Joints.Revolute Revolute3(
    n=nCP, 
    startValueFixed=true, 
    q(stateSelect=StateSelect.prefer));
  ModelicaAdditions.MultiBody.Parts.FrameTranslation RCrank(r=rCP_scaled);
  Chassis.Components.Strut rightStrut(
    rA={0,0,0}, 
    s0=sqrt((rCS_scaled - rPS_scaled)*(rCS_scaled - rPS_scaled)) + q0S, 
    data=data, 
    rB=rCS_scaled);
  ModelicaAdditions.MultiBody.Interfaces.Frame_a FromChassis1;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a FromChassis2;
  Utilities.Forces.Utilities.ForceTable1D data;
  Utilities.Forces.Utilities.ForceTable1D data_A;
  Utilities.Forces.SpringDamperTable1D SpringDamperTable1D1(data=data_A);
  CutLink leftLink(
    rA=rPL_1_scaled - rCP_scaled, 
    rB=rXL_1_scaled - rX_1_scaled, 
    rRod=rXL_1_scaled - rPL_1_scaled);
  CutLink rightLink(
    rA=rPL_2_scaled - rCP_scaled, 
    rB=rXL_2_scaled - rX_2_scaled, 
    rRod=rXL_2_scaled - rPL_2_scaled);
  Utilities.Parts.Shape shape(
    material={0,0,0.7,0.5}, 
    shape="cylinder", 
    length=0.1, 
    r0={0,-0.05,0}, 
    lengthDirection={0,1,0});
equation 
  connect(Prismatic1.frame_b, Revolute3.frame_a);
  connect(Revolute3.frame_b, DamperLever.frame_a);
  connect(RCrank.frame_b, Prismatic1.frame_a);
  connect(DamperLever.frame_b, rightStrut.frame_a);
  connect(RCrank.frame_a, FromChassis1);
  connect(SpringDamperTable1D1.flange_a, Prismatic1.axis);
  connect(SpringDamperTable1D1.flange_b, Prismatic1.bearing);
  connect(leftLink.frame_b, FromChassis);
  connect(leftLink.frame_a, Revolute3.frame_b);
  connect(rightLink.frame_b, FromChassis2);
  connect(rightLink.frame_a, Revolute3.frame_b);
  connect(rightStrut.frame_b, FromChassis1);
  connect(shape.frame_a, RCrank.frame_b);
end MonoDamperBelleVilleAntiRoll;

VehicleDynamics.Chassis.Components.TwinDamperTorsionAntiRoll VehicleDynamics.Chassis.Components.TwinDamperTorsionAntiRoll

Onboard linkage with separate struts and anti-roll linkage.

VehicleDynamics.Chassis.Components.TwinDamperTorsionAntiRoll

Information


The Components is typically used to mount the struts inside a formula body. The upgoing motion from the suspension linkages is redirected via a pivot element on each side. to these, the struts and anti-roll bars are connected.

Usage: In some formula race cars.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} makes a left-hand linkage into a right-hand dito.
  rCP_1:  location of left pivot point, resolved in frame_C
  rCS_1:  location of left strut mount in chassis, resolved in frame_C
  rPS_1:  location of left strut mount in pivot element, resolved in frame_C
  nCP_1:  direction of left pivot revolute, resolved in frame_C
  rPL_1:  location of left link mount in pivot element, resolved in frame_C
  rPX_1:  location of left link outer mount, resolved in frame_C
  rX_1:   location of frame_X_1, resolved in frame_C
  rCP_2:  location of right pivot point, resolved in frame_C
  rCS_2:  location of right strut mount in chassis, resolved in frame_C
  rPS_2:  location of right strut mount in pivot element, resolved in frame_C
  nCP_2:  direction of right pivot revolute, resolved in frame_C
  rPL_2:  location of right link mount in pivot element, resolved in frame_C
  rPX_2:  location of right link outer mount, resolved in frame_C
  rX_2:   location of frame_X_2, resolved in frame_C
  forceTable: To set the force generation table add a component named [name] of class Forces.Utilities.ForceTable1D to the model and write forceTable=[name] in the modifiers row
  Mass and inertia properties not yet solved!  
The class models two dampers, connected with a torsion anti roll.
 Parameterisation:
The parameterisation is by default made to generate a symmetric model. Therfore, all rRight* parameters are by default the rleft* parameters mirrored along the y-axis.

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1} 
rCP_1[3]{0.45,0.5,0.1}vector to left pivot's chassis mount point resolved in frame_C
rCS_1[3]{0.45,0.5,0.1}vector to left strut's chassis mount point resolved in frame_C
rPS_1[3]{0,0.50,0.15}vector to left strut's pivot element mount point resolved in frame_C
rPL1_1[3]{0.04,0.60,0.15}vector to link1's pivot element mount point resolved in frame_C
rX_1[3]{0.0,0.85,-0.14}vector to frame_X_1 resolved in frame_C
rXL1_1[3]{0.0,0.8,-0.14}vector to link1's outer mount point resolved in frame_C
rPL2_1[3]{0,0.5,0.18}vector to outer anti roll rod end resolved in frame_C
rAL2_1[3]{.24,0.47,0.21}vector to inner anti roll rod end/left anti roll lever resolved in frame_C
rCA_1[3]{.24,.45,0}vector to left torsion beam end resolved in frame_C
nP_1[3]cross((rXL1_1 - rPL1_1), (rPL2_1 - rAL2_1)) 
q0S_10.048 
rCP_2[3]Utilities.Functions.EWM({1,-1,1}, rCP_1) 
rCS_2[3]Utilities.Functions.EWM({1,-1,1}, rCS_1) 
rPS_2[3]Utilities.Functions.EWM({1,-1,1}, rPS_1) 
rPL1_2[3]Utilities.Functions.EWM({1,-1,1}, rPL1_1) 
rX_2[3]Utilities.Functions.EWM({1,-1,1}, rX_1) 
rXL1_2[3]Utilities.Functions.EWM({1,-1,1}, rXL1_1) 
rPL2_2[3]Utilities.Functions.EWM({1,-1,1}, rPL2_1) 
rAL2_2[3]Utilities.Functions.EWM({1,-1,1}, rAL2_1) 
rCA_2[3]Utilities.Functions.EWM({1,-1,1}, rCA_1) 
nP_2[3]Utilities.Functions.EWM({1,-1,1}, nP_1) 
q0S_2q0S_1 

Modelica definition

model TwinDamperTorsionAntiRoll 
  "Onboard linkage with separate struts and anti-roll linkage." 
  
  import Car;
  parameter Real[3] scaleFactor={1,1,1};
  
  parameter Real[3] rCP_1={0.45,0.5,0.1} 
    "vector to left pivot's chassis mount point resolved in frame_C";
  parameter Real[3] rCS_1={0.45,0.5,0.1} 
    "vector to left strut's chassis mount point resolved in frame_C";
  parameter Real[3] rPS_1={0,0.50,0.15} 
    "vector to left strut's pivot element mount point resolved in frame_C";
  parameter Real[3] rPL1_1={0.04,0.60,0.15} 
    "vector to link1's pivot element mount point resolved in frame_C";
  parameter Real[3] rX_1={0.0,0.85,-0.14} 
    "vector to frame_X_1 resolved in frame_C";
  parameter Real[3] rXL1_1={0.0,0.8,-0.14} 
    "vector to link1's outer mount point resolved in frame_C";
  parameter Real[3] rPL2_1={0,0.5,0.18} 
    "vector to outer anti roll rod end resolved in frame_C";
  parameter Real[3] rAL2_1={.24,0.47,0.21} 
    "vector to inner anti roll rod end/left anti roll lever resolved in frame_C";
  parameter Real[3] rCA_1={.24,.45,0} 
    "vector to left torsion beam end resolved in frame_C";
  parameter Real[3] nP_1=cross((rXL1_1 - rPL1_1), (rPL2_1 - rAL2_1));
  
  //{0,.1,1} "direction of rotation of left pivot element resolved in frame_C";
  parameter Real q0S_1=0.048;
  
  parameter Real[3] rCP_2=Utilities.Functions.EWM({1,-1,1}, rCP_1);
  parameter Real[3] rCS_2=Utilities.Functions.EWM({1,-1,1}, rCS_1);
  parameter Real[3] rPS_2=Utilities.Functions.EWM({1,-1,1}, rPS_1);
  parameter Real[3] rPL1_2=Utilities.Functions.EWM({1,-1,1}, rPL1_1);
  parameter Real[3] rX_2=Utilities.Functions.EWM({1,-1,1}, rX_1);
  parameter Real[3] rXL1_2=Utilities.Functions.EWM({1,-1,1}, rXL1_1);
  parameter Real[3] rPL2_2=Utilities.Functions.EWM({1,-1,1}, rPL2_1);
  parameter Real[3] rAL2_2=Utilities.Functions.EWM({1,-1,1}, rAL2_1);
  parameter Real[3] rCA_2=Utilities.Functions.EWM({1,-1,1}, rCA_1);
  parameter Real[3] nP_2=Utilities.Functions.EWM({1,-1,1}, nP_1);
  parameter Real q0S_2=q0S_1;
  
protected 
  parameter Real[3] rCP_1_scaled=Utilities.Functions.EWM(scaleFactor, rCP_1);
  parameter Real[3] rCS_1_scaled=Utilities.Functions.EWM(scaleFactor, rCS_1);
  parameter Real[3] rPS_1_scaled=Utilities.Functions.EWM(scaleFactor, rPS_1);
  parameter Real[3] rPL1_1_scaled=Utilities.Functions.EWM(scaleFactor, rPL1_1);
  parameter Real[3] rX_1_scaled=Utilities.Functions.EWM(scaleFactor, rX_1);
  parameter Real[3] rXL1_1_scaled=Utilities.Functions.EWM(scaleFactor, rXL1_1);
  parameter Real[3] rPL2_1_scaled=Utilities.Functions.EWM(scaleFactor, rPL2_1);
  parameter Real[3] rAL2_1_scaled=Utilities.Functions.EWM(scaleFactor, rAL2_1);
  parameter Real[3] rCA_1_scaled=Utilities.Functions.EWM(scaleFactor, rCA_1);
  parameter Real[3] nP_1_scaled=Utilities.Functions.EWM(scaleFactor, nP_1);
  
  parameter Real[3] rCP_2_scaled=Utilities.Functions.EWM(scaleFactor, rCP_2);
  parameter Real[3] rCS_2_scaled=Utilities.Functions.EWM(scaleFactor, rCS_2);
  parameter Real[3] rPS_2_scaled=Utilities.Functions.EWM(scaleFactor, rPS_2);
  parameter Real[3] rPL1_2_scaled=Utilities.Functions.EWM(scaleFactor, rPL1_2);
  parameter Real[3] rX_2_scaled=Utilities.Functions.EWM(scaleFactor, rX_2);
  parameter Real[3] rXL1_2_scaled=Utilities.Functions.EWM(scaleFactor, rXL1_2);
  parameter Real[3] rPL2_2_scaled=Utilities.Functions.EWM(scaleFactor, rPL2_2);
  parameter Real[3] rAL2_2_scaled=Utilities.Functions.EWM(scaleFactor, rAL2_2);
  parameter Real[3] rCA_2_scaled=Utilities.Functions.EWM(scaleFactor, rCA_2);
  parameter Real[3] nP_2_scaled=Utilities.Functions.EWM(scaleFactor, nP_2);
  
public 
  Chassis.Components.AntiRollBar AntiRollBar(
    rCA_1=rCA_1, 
    rAL_1=rAL2_1, 
    rXL_1=rPL2_1, 
    rX_1=rPL2_1, 
    rCA_2=rCA_2, 
    rAL_2=rAL2_2, 
    rXL_2=rPL2_2, 
    rX_2=rPL2_2, 
    data=data_A);
  
  ModelicaAdditions.MultiBody.Parts.FrameTranslation RRightCrank(r=
        rCP_2_scaled);
  ModelicaAdditions.MultiBody.Parts.FrameTranslation RLeftCrank(r=
        rCP_1_scaled);
  ModelicaAdditions.MultiBody.Interfaces.Frame_a FromChassis;
  ModelicaAdditions.MultiBody.Joints.Revolute LeftCrank(
    n=nP_1_scaled, 
    startValueFixed=true, 
    q(stateSelect=StateSelect.prefer));
  ModelicaAdditions.MultiBody.Joints.Revolute RightCrank(
    n=nP_2_scaled, 
    startValueFixed=true, 
    q(stateSelect=StateSelect.prefer));
  Chassis.Components.Strut Strut_2(
    rB={0,0,0}, 
    s0=sqrt((rCS_2_scaled - rPS_2_scaled)*(rCS_2_scaled - rPS_2_scaled)) + 
        q0S_2, 
    data=data_S_2, 
    rA=rCS_2_scaled);
  Chassis.Components.Strut Strut_1(
    rB={0,0,0}, 
    s0=sqrt((rCS_1_scaled - rPS_1_scaled)*(rCS_1_scaled - rPS_1_scaled)) + 
        q0S_1, 
    data=data_S_1, 
    rA=rCS_1_scaled);
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_X_2;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_X_1;
  Utilities.Parts.Body LeftStrutLever(r=rPS_1_scaled - rCP_1_scaled);
  Utilities.Parts.Body LeftAntiRollLever(r=rPL2_1_scaled - rCP_1_scaled);
  Utilities.Parts.Body RightLeftStrutLever(r=rPS_2_scaled - rCP_2_scaled);
  Utilities.Parts.Body RightAntiRollLever(r=rPL2_2_scaled - rCP_2_scaled);
  Utilities.Forces.Utilities.ForceTable1D data_S_2;
  Utilities.Forces.Utilities.ForceTable1D data_S_1;
  Utilities.Forces.Utilities.ForceTable1D data_A;
  CutLink leftLink(rB=rXL1_1_scaled - rX_1_scaled, rRod=rXL1_1_scaled - 
        rPL1_1_scaled);
  CutLink rightLink(rB=rXL1_2_scaled - rX_2_scaled, rRod=rXL1_2_scaled - 
        rPL1_2_scaled);
  Utilities.Parts.Body LeftStrutLever1(r=rPL1_1_scaled - rCP_1_scaled);
  Utilities.Parts.Body RightLeftStrutLever1(r=rPL1_2_scaled - rCP_2_scaled);
equation 
  connect(FromChassis, RLeftCrank.frame_a);
  connect(RRightCrank.frame_a, FromChassis);
  connect(RLeftCrank.frame_b, LeftCrank.frame_a);
  connect(RightCrank.frame_a, RRightCrank.frame_b);
  connect(LeftCrank.frame_b, LeftAntiRollLever.frame_a);
  connect(LeftStrutLever.frame_a, LeftCrank.frame_b);
  connect(LeftStrutLever.frame_b, Strut_1.frame_b);
  connect(RightLeftStrutLever.frame_b, Strut_2.frame_b);
  connect(RightCrank.frame_b, RightLeftStrutLever.frame_a);
  connect(RightAntiRollLever.frame_a, RightCrank.frame_b);
  connect(AntiRollBar.frame_C, FromChassis);
  connect(LeftAntiRollLever.frame_b, AntiRollBar.frame_X_1);
  connect(RightAntiRollLever.frame_b, AntiRollBar.frame_X_2);
  connect(leftLink.frame_b, frame_X_1);
  connect(Strut_1.frame_a, FromChassis);
  connect(Strut_2.frame_a, FromChassis);
  connect(rightLink.frame_b, frame_X_2);
  connect(LeftStrutLever1.frame_a, LeftCrank.frame_b);
  connect(LeftStrutLever1.frame_b, leftLink.frame_a);
  connect(RightLeftStrutLever1.frame_a, RightCrank.frame_b);
  connect(RightLeftStrutLever1.frame_b, rightLink.frame_a);
end TwinDamperTorsionAntiRoll;

VehicleDynamics.Chassis.Components.BushingAntiRollBar VehicleDynamics.Chassis.Components.BushingAntiRollBar

AntiRollBar - standard anti-roll linkage.

VehicleDynamics.Chassis.Components.BushingAntiRollBar

Information


To a torsion bar with levers in each end, two connecting rods are attached, these are normally attached at the left and right suspension linkage to reduce roll motion. This component is modelled with rigid elements, except for a torsion bar. The force generation fue to deflection is modelled from table values.

Usage: Most vehicles with independent suspensions, both front and rear.

The following parameters are used to define the component, see nomenclature for further information: The right hand side parameters, ending with _2, are by default symmetric to the left hand dito ending with _1.

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} mirrors it around the xz-plane.
  ratioWheelToRack=22: rack-pinion gear ratio [m/rad]
  rX_1:   location of frame X_1, resolved in frame_C
  rXL1_1: location of left link end, resolved in frame_C
  rAL_1:  location of left torsion bar end, resolved in frame_C
  rX_2:   location of frame X_2, resolved in frame_C,
  rXL1_2: location of right link end, resolved in frame_C
  rAL_2:  location of right torsion bar end, resolved in frame_C
  forceTable: To set the force generation table add a component named [name] of class Utilities.Forces.Utilities.ForceTable1D to the model and write forceTable=[name] in the modifiers row
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1} 
rCA_1[3]{-0.2405,0.3420,0.0330}vector to left torsion beam end resolved in frame_C [m]
rAL_1[3]{-0.0439,0.5115,0.0203}vector to left inner anti roll rod end/left anti roll lever resolved in frame_C [m]
rXL_1[3]{-0.0564,0.5401,0.2183}vector to left outer anti roll rod end resolved in frame_C [m]
rX_1[3]{0.0059,0.6905,-0.0710} + {-0.0060,0.0365,0.1110}vector to left anti roll mount resolved in frame_C [m]
rCA_2[3]Utilities.Functions.EWM({1,-1,1}, rCA_1)[m]
rAL_2[3]Utilities.Functions.EWM({1,-1,1}, rAL_1)[m]
rXL_2[3]Utilities.Functions.EWM({1,-1,1}, rXL_1)[m]
rX_2[3]Utilities.Functions.EWM({1,-1,1}, rX_1)[m]
data  

Modelica definition

model BushingAntiRollBar "AntiRollBar - standard anti-roll linkage." 
  
  parameter Real[3] scaleFactor={1,1,1};
  parameter SI.Position[3] rCA_1={-0.2405,0.3420,0.0330} 
    "vector to left torsion beam end resolved in frame_C";
  parameter SI.Position[3] rAL_1={-0.0439,0.5115,0.0203} 
    "vector to left inner anti roll rod end/left anti roll lever resolved in frame_C";
  parameter SI.Position[3] rXL_1={-0.0564,0.5401,0.2183} 
    "vector to left outer anti roll rod end resolved in frame_C";
  parameter SI.Position[3] rX_1={0.0059,0.6905,-0.0710} + {-0.0060,0.0365,0.1110} 
    "vector to left anti roll mount resolved in frame_C";
  
  parameter SI.Position[3] rCA_2=Utilities.Functions.EWM({1,-1,1}, rCA_1);
  parameter SI.Position[3] rAL_2=Utilities.Functions.EWM({1,-1,1}, rAL_1);
  parameter SI.Position[3] rXL_2=Utilities.Functions.EWM({1,-1,1}, rXL_1);
  parameter SI.Position[3] rX_2=Utilities.Functions.EWM({1,-1,1}, rX_1);
  
protected 
  parameter SI.Position[3] rCA_1_scaled=Utilities.Functions.EWM(scaleFactor, rCA_1);
  parameter SI.Position[3] rAL_1_scaled=Utilities.Functions.EWM(scaleFactor, rAL_1);
  parameter SI.Position[3] rXL_1_scaled=Utilities.Functions.EWM(scaleFactor, rXL_1);
  parameter SI.Position[3] rX_1_scaled=Utilities.Functions.EWM(scaleFactor, rX_1);
  
  parameter SI.Position[3] rCA_2_scaled=Utilities.Functions.EWM(scaleFactor, rCA_2);
  parameter SI.Position[3] rAL_2_scaled=Utilities.Functions.EWM(scaleFactor, rAL_2);
  parameter SI.Position[3] rXL_2_scaled=Utilities.Functions.EWM(scaleFactor, rXL_2);
  parameter SI.Position[3] rX_2_scaled=Utilities.Functions.EWM(scaleFactor, rX_2);
  
public 
  ModelicaAdditions.MultiBody.Joints.Revolute rightRevolute(
    n=rAL_1_scaled - rAL_2_scaled, 
    q(stateSelect=StateSelect.never), 
    qd(stateSelect=StateSelect.never));
  ModelicaAdditions.MultiBody.Joints.Revolute leftRevolute(
    n=rAL_1_scaled - rAL_2_scaled, 
    q(stateSelect=StateSelect.never), 
    qd(stateSelect=StateSelect.never));
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslation(r=(
        rCA_1_scaled + rCA_2_scaled)/2);
  Utilities.Parts.Body leftBar(r=rCA_1_scaled - (rCA_1_scaled + rCA_2_scaled)
        /2);
  Utilities.Parts.Body rightBar(r=rCA_2_scaled - (rCA_1_scaled + 
        rCA_2_scaled)/2);
  Utilities.Parts.Body rightLever(r=rAL_2_scaled - rCA_2_scaled);
  Utilities.Parts.Body leftLever(r=rAL_1_scaled - rCA_1_scaled);
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_X_2;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_X_1;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_C;
  ModelicaAdditions.MultiBody.Parts.FrameTranslation rightFrameTranslation(r
      =rXL_2_scaled - rX_2_scaled);
  ModelicaAdditions.MultiBody.Parts.FrameTranslation leftFrameTranslation(r=
        rXL_1_scaled - rX_1_scaled);
  Utilities.Forces.SpringDamperTableRot1D springDamper(data=data, fc=data.fc
        *[1, 0; 0, 1.2]);
  parameter Utilities.Forces.Utilities.ForceTable1D data;
  Chassis.Components.CutPushRod rightPushRod(rRod=rXL_2_scaled - 
        rAL_2_scaled);
  Chassis.Components.CutPushRod leftPushRod(rRod=rXL_1_scaled - rAL_1_scaled);
equation 
  connect(frameTranslation.frame_b, leftRevolute.frame_a);
  connect(rightRevolute.frame_a, frameTranslation.frame_b);
  connect(rightBar.frame_a, rightRevolute.frame_b);
  connect(leftRevolute.frame_b, leftBar.frame_a);
  connect(leftLever.frame_a, leftBar.frame_b);
  connect(rightLever.frame_a, rightBar.frame_b);
  connect(frameTranslation.frame_a, frame_C);
  connect(rightFrameTranslation.frame_a, frame_X_2);
  connect(leftFrameTranslation.frame_a, frame_X_1);
  connect(springDamper.flange_a, rightRevolute.axis);
  connect(springDamper.flange_b, leftRevolute.axis);
  connect(rightPushRod.frame_a, rightLever.frame_b);
  connect(rightPushRod.frame_b, rightFrameTranslation.frame_b);
  connect(leftPushRod.frame_a, leftLever.frame_b);
  connect(leftPushRod.frame_b, leftFrameTranslation.frame_b);
end BushingAntiRollBar;

VehicleDynamics.Chassis.Components.FiveLink VehicleDynamics.Chassis.Components.FiveLink

Five links constrain the motion of the upright and reduces the degrees of freedom to one.

VehicleDynamics.Chassis.Components.FiveLink

Information


Suspension frame consisting of two links in a triangular, wishbone-like, shape. The inner ends are normally mounted in the chassis at two points alowing the WishBone to revolute around the mounting points. The outer ends meet and are attached to a ball joint, providing a lateral-longitudinal location.

The Wishbone is also called A-arm and A-frame.

The following parameters are used to define the component, see nomenclature for further information:

  rUL1L2: location of outer ball joint, resolved in frame_C
  rCL1:   location of inner front joint, resolved in frame_C
  rCL2:   location of inner rear joint, resolved in frame_C
  Mass and inertia properties not yet solved!  
Thus rCL1-rCL2 gives the axis around which the wishbone revolutes.

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1}To make right hand side Linkage use {1,-1,1}
rCL1[3]{-0.5550,-0.3690,-0.0320}[m]
rCL2[3]{-0.4240,-0.1900,0.1640}[m]
rCL3[3]{-0.3320,-0.1300,0.0570}[m]
rCL4[3]{-0.4240,-0.1900,0.2640}[m]
rCL5[3]{-0.3320,-0.1300,0.1570}[m]
rUL1[3]{-0.5250,0.0620,-0.0670}[m]
rUL2[3]{-0.4330,0.0680,0.1500}[m]
rUL3[3]{-0.3350,0.0116,0.0400}[m]
rUL4[3]{-0.4330,0.0680,0.2800}[m]
rUL5[3]{-0.3350,0.0116,0.1900}[m]
rUW[3]{-0.4650,0.1330,0.0200}[m]
rCMU[3]{0,0,0}[m]
mU1[kg]
i11U.1[kg.m2]
i22U.1[kg.m2]
i33U.1[kg.m2]
i21U.01[kg.m2]
i31U.01[kg.m2]
i32U.01[kg.m2]

Modelica definition

model FiveLink 
  "Five links constrain the motion of the upright and reduces the degrees of freedom to one."
   
  
  extends Chassis.Interfaces.Interface;
  parameter Real[3] scaleFactor={1,1,1} 
    "To make right hand side Linkage use {1,-1,1}";
  
  parameter SI.Position[3] rCL1={-0.5550,-0.3690,-0.0320};
  parameter SI.Position[3] rCL2={-0.4240,-0.1900,0.1640};
  parameter SI.Position[3] rCL3={-0.3320,-0.1300,0.0570};
  parameter SI.Position[3] rCL4={-0.4240,-0.1900,0.2640};
  parameter SI.Position[3] rCL5={-0.3320,-0.1300,0.1570};
  parameter SI.Position[3] rUL1={-0.5250,0.0620,-0.0670};
  parameter SI.Position[3] rUL2={-0.4330,0.0680,0.1500};
  parameter SI.Position[3] rUL3={-0.3350,0.0116,0.0400};
  parameter SI.Position[3] rUL4={-0.4330,0.0680,0.2800};
  parameter SI.Position[3] rUL5={-0.3350,0.0116,0.1900};
  parameter SI.Position[3] rUW={-0.4650,0.1330,0.0200};
  
  parameter SI.Position[3] rCMU={0,0,0} "|Mass and Inertia|";
  parameter SI.Mass mU=1 "|Mass and Inertia|";
  parameter SI.Inertia i11U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i22U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i33U=.1 "|Mass and Inertia|";
  parameter SI.Inertia i21U=.01 "|Mass and Inertia|";
  parameter SI.Inertia i31U=.01 "|Mass and Inertia|";
  parameter SI.Inertia i32U=.01 "|Mass and Inertia|";
  
  /*Scaled coordinates*/
protected 
  parameter SI.Position[3] rCL1_scaled=Utilities.Functions.EWM(scaleFactor, rCL1);
  parameter SI.Position[3] rCL2_scaled=Utilities.Functions.EWM(scaleFactor, rCL2);
  parameter SI.Position[3] rCL3_scaled=Utilities.Functions.EWM(scaleFactor, rCL3);
  parameter SI.Position[3] rCL4_scaled=Utilities.Functions.EWM(scaleFactor, rCL4);
  parameter SI.Position[3] rCL5_scaled=Utilities.Functions.EWM(scaleFactor, rCL5);
  parameter SI.Position[3] rUL1_scaled=Utilities.Functions.EWM(scaleFactor, rUL1);
  parameter SI.Position[3] rUL2_scaled=Utilities.Functions.EWM(scaleFactor, rUL2);
  parameter SI.Position[3] rUL3_scaled=Utilities.Functions.EWM(scaleFactor, rUL3);
  parameter SI.Position[3] rUL4_scaled=Utilities.Functions.EWM(scaleFactor, rUL4);
  parameter SI.Position[3] rUL5_scaled=Utilities.Functions.EWM(scaleFactor, rUL5);
  parameter SI.Position[3] rUW_scaled=Utilities.Functions.EWM(scaleFactor, rUW);
  
protected 
  Link link1(
    rA=rCL1, 
    rB=rUW - rUL1, 
    rRod=rUL1 - rCL1);
  CutLink link2(
    rA=rCL2, 
    rB=rUW - rUL2, 
    rRod=rUL2 - rCL2);
  CutLink link3(
    rA=rCL3, 
    rB=rUW - rUL3, 
    rRod=rUL3 - rCL3);
  CutLink link4(
    rA=rCL4, 
    rB=rUW - rUL4, 
    rRod=rUL4 - rCL4);
  CutLink link5(
    rA=rCL5, 
    rB=rUW - rUL5, 
    rRod=rUL5 - rCL5);
  ModelicaAdditions.MultiBody.Parts.Body U(
    rCM=rCMU, 
    m=mU, 
    I11=i11U, 
    I22=i22U, 
    I33=i33U, 
    I21=i21U, 
    I31=i31U, 
    I32=i32U);
public 
  Utilities.Parts.Body shape1(mass=false, r=rUL1 - rUW);
  Utilities.Parts.Body shape2(r=rUL2 - rUW, mass=false);
  Utilities.Parts.Body shape3(r=rUL3 - rUW, mass=false);
  Utilities.Parts.Body shape4(r=rUL4 - rUW, mass=false);
  Utilities.Parts.Body shape5(r=rUL5 - rUW, mass=false);
equation 
  connect(link1.frame_a, frame_C);
  connect(link2.frame_a, frame_C);
  connect(link3.frame_a, frame_C);
  connect(link4.frame_a, frame_C);
  connect(link5.frame_a, frame_C);
  connect(link5.frame_b, frame_U);
  connect(link4.frame_b, frame_U);
  connect(link3.frame_b, frame_U);
  connect(link2.frame_b, frame_U);
  connect(link1.frame_b, frame_U);
  connect(U.frame_a, frame_U);
  connect(shape1.frame_a, link1.frame_b);
  connect(shape2.frame_a, frame_U);
  connect(shape3.frame_a, frame_U);
  connect(shape4.frame_a, frame_U);
  connect(shape5.frame_a, frame_U);
end FiveLink;

VehicleDynamics.Chassis.Components.MasslessCutPushRod VehicleDynamics.Chassis.Components.MasslessCutPushRod

Two bushings connected by a massless rod

VehicleDynamics.Chassis.Components.MasslessCutPushRod

Parameters

NameDefaultDescription
rA[3]{0,0,0}Position vector from frame_a to center of bushingA, resolved in frame_a [m]
rB[3]{0,0,0}Position vector from center of bushingb to frame_b, resolved in frame_b [m]
rRod[3]{1,0,0}Position vector from rod.frame_a to rod.frame_b, resolved in frame_a at the initial configuration [m]

Modelica definition

model MasslessCutPushRod "Two bushings connected by a massless rod" 
  
  import SI = Modelica.SIunits;
  parameter SI.Position[3] rA={0,0,0} 
    "Position vector from frame_a to center of bushingA, resolved in frame_a";
  parameter SI.Position[3] rB={0,0,0} 
    "Position vector from center of bushingb to frame_b, resolved in frame_b";
  parameter SI.Position[3] rRod={1,0,0} 
    "Position vector from rod.frame_a to rod.frame_b, resolved in frame_a at the initial configuration";
  /*
  parameter Boolean autoInit=false 
    "|Initialization| = true: Compute nxRod, nyRod such that bushingB rotations are zero."
    ;
  parameter Real nxRod[3]={1,0,0} 
    "|Initialization| if autoInit = false, x-axis vector of rod.frame_b, resolved in frame_a at the initial configuration"
    ;
  parameter Real nyRod[3]={0,1,0} 
    "|Initialization| if autoInit = false, y-axis vector of rod.frame_b, resolved in frame_a at the initial configuration"
    ;
*/
  final parameter SI.Position rRod2[3]=rotA.S_rel*rRod;
  final parameter Real nxRod[3]=rotA.S_rel*dataB.nx;
  final parameter Real nyRod[3]=rotA.S_rel*dataB.ny;
  
  
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_a;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_b;
  Utilities.Parts.Body rodShape(lengthDirection=rRod2, r=rRod2);
  Chassis.Data.BumpBushingData dataA;
  Chassis.Data.BumpBushingData dataB;
  Utilities.Parts.FrameAxesNoAcceleration rotA(
    nx=dataA.nx, 
    ny=dataA.ny, 
    r=rA);
  Utilities.Forces.SpringDamperLinearBump3D bushingB(
    r_rela0=dataB.r_rela0, 
    r_min=dataB.r_min, 
    r_max=dataB.r_max, 
    bumpFactor=dataB.bumpFactor, 
    phi_rela0=dataB.phi_rela0, 
    C=dataB.C, 
    D=dataB.D, 
    linear=dataB.linear, 
    eps=dataB.eps, 
    animation=false);
  Utilities.Parts.FrameAxesNoAcceleration rotB(
    nx=dataB.nx, 
    ny=dataB.ny, 
    r=-rB);
  Utilities.Parts.FrameAxesNoAcceleration rod(
    r=rRod2, 
    nx=nxRod, 
    ny=nyRod);
  Utilities.Forces.SpringDamperLinearBump3D_freeMotion bushingA(
    C=dataB.C, 
    D=dataB.D, 
    r_rela0=dataA.r_rela0, 
    r_min=dataA.r_min, 
    r_max=dataA.r_max, 
    bumpFactor=dataA.bumpFactor, 
    phi_rela0=dataA.phi_rela0, 
    linear=dataA.linear, 
    eps=dataA.eps, 
    animation=false);
initial equation 
  /*
  if autoInit then
    [rod.nx, rod.ny] = transpose(frame_b.S)*frame_a.S[:, 1:2];
  else
    [rod.nx, rod.ny] = [nxRod2, nyRod2];
  end if;
*/
equation 
  connect(rotA.frame_a, frame_a);
  connect(frame_b, rotB.frame_a);
  connect(rod.frame_a, rodShape.frame_a);
  connect(rod.frame_b, bushingB.frame_a);
  connect(rotB.frame_b, bushingB.frame_b);
  connect(rotA.frame_b, bushingA.frame_a);
  connect(bushingA.frame_b, rod.frame_a);
end MasslessCutPushRod;

VehicleDynamics.Chassis.Components.CutPushRod VehicleDynamics.Chassis.Components.CutPushRod

Two bushings connected by a massless rod

VehicleDynamics.Chassis.Components.CutPushRod

Parameters

NameDefaultDescription
rA[3]{0,0,0}Position vector from frame_a to center of bushingA, resolved in frame_a [m]
rB[3]{0,0,0}Position vector from center of bushingb to frame_b, resolved in frame_b [m]
rRod[3]{1,0,0}Position vector from rod.frame_a to rod.frame_b, resolved in frame_a at the initial configuration [m]

Modelica definition

model CutPushRod "Two bushings connected by a massless rod" 
  import SI = Modelica.SIunits;
  parameter SI.Position[3] rA={0,0,0} 
    "Position vector from frame_a to center of bushingA, resolved in frame_a";
  parameter SI.Position[3] rB={0,0,0} 
    "Position vector from center of bushingb to frame_b, resolved in frame_b";
  parameter SI.Position[3] rRod={1,0,0} 
    "Position vector from rod.frame_a to rod.frame_b, resolved in frame_a at the initial configuration";
  /*
  parameter Boolean autoInit=false 
    "|Initialization| = true: Compute nxRod, nyRod such that bushingB rotations are zero."
    ;
  parameter Real nxRod[3]={1,0,0} 
    "|Initialization| if autoInit = false, x-axis vector of rod.frame_b, resolved in frame_a at the initial configuration"
    ;
  parameter Real nyRod[3]={0,1,0} 
    "|Initialization| if autoInit = false, y-axis vector of rod.frame_b, resolved in frame_a at the initial configuration"
    ;
*/
  final parameter SI.Position rRod2[3]=rotA.S_rel*rRod;
  final parameter Real nxRod[3]=rotA.S_rel*dataB.nx;
  final parameter Real nyRod[3]=rotA.S_rel*dataB.ny;
  
  
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_a;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_b;
  Utilities.Parts.Body rodShape(r=rRod2);
  Chassis.Data.BumpBushingData dataA(
    r_min={-1,-1,-1}, 
    r_max={1,1,1}, 
    phi_min={-1,-1,-1}, 
    phi_max={1,1,1});
  Chassis.Data.BumpBushingData dataB(
    r_min={-1,-1,-1}, 
    r_max={1,1,1}, 
    phi_min={-1,-1,-1}, 
    phi_max={1,1,1});
  Utilities.Parts.FrameAxesNoAcceleration rotA(
    nx=dataA.nx, 
    ny=dataA.ny, 
    r=rA);
  Utilities.Forces.SpringDamperLinearBump3D bushingB(
    r_rela0=dataB.r_rela0, 
    r_min=dataB.r_min, 
    r_max=dataB.r_max, 
    bumpFactor=dataB.bumpFactor, 
    phi_rela0=dataB.phi_rela0, 
    C=dataB.C, 
    D=dataB.D, 
    linear=dataB.linear, 
    eps=dataB.eps, 
    width=dataB.width, 
    length=dataB.length, 
    height=dataB.height);
  Utilities.Parts.FrameAxesNoAcceleration rotB(
    nx=dataB.nx, 
    ny=dataB.ny, 
    r=-rB);
  Utilities.Parts.FrameAxesNoAcceleration rod(
    r=rRod2, 
    nx=nxRod, 
    ny=nyRod);
  Utilities.Forces.SpringDamperLinearBump3D bushingA(
    r_rela0=dataA.r_rela0, 
    r_min=dataA.r_min, 
    r_max=dataA.r_max, 
    bumpFactor=dataA.bumpFactor, 
    phi_rela0=dataA.phi_rela0, 
    linear=dataA.linear, 
    eps=dataA.eps, 
    animation=true, 
    C=dataA.C, 
    D=dataA.D, 
    width=dataA.width, 
    length=dataA.length, 
    height=dataA.height);
  Utilities.Joints.FreeMotion FreeMotion1;
initial equation 
equation 
  connect(rotA.frame_a, frame_a);
  connect(frame_b, rotB.frame_a);
  connect(rod.frame_a, rodShape.frame_a);
  connect(rod.frame_b, bushingB.frame_a);
  connect(rotB.frame_b, bushingB.frame_b);
  connect(rotA.frame_b, bushingA.frame_a);
  connect(bushingA.frame_b, rod.frame_a);
  connect(FreeMotion1.frame_a, rotA.frame_b);
  connect(FreeMotion1.frame_b, bushingA.frame_b);
end CutPushRod;

VehicleDynamics.Chassis.Components.Bushing VehicleDynamics.Chassis.Components.Bushing

CutBusing - to be used as a cut in a closed loop.

VehicleDynamics.Chassis.Components.Bushing

Information


The bushing is linear within a specified range. Outside this range, bumpstops are modellled as a much stiffer spring-dampers. The range is defined with parameters as well as the ratio between stiffness inside outside range. The stiffness inside the range is read from record like for a normal linear SpringDamper3D.

The following parameters are used to define the component, see nomenclature for further information:

  r_rela0:    Unstretched translational spring vector.
  r_min:      Vector to bump stop from reference point in negative direction of coordinate system.
  r_max:      Vector to bump stop from reference point in positive direction of coordinate system.
  bumpFactor: Scale-factor of spring force at after bump.
  phi_rela0:  Unstretched rotational spring vector.
  

Parameters

NameDefaultDescription
rA[3]data.rAvector from frame_A to bushing centre [m]
rB[3]data.rBvector from frame_B to bushing centre [m]
nx[3]data.nxx direction of bushing, resolved in frame_A
ny[3]data.nyy direction of bushing, resolved in frame_A
r_rela0[3]data.r_rela0Unstretched translational spring vector [m]
r_min[3]data.r_minvector to bump stop from reference point in negative direction, resolved in frame_A [m]
r_max[3]data.r_maxvector to bump stop from reference point in positive direction, resolved in frame_A [m]
phi_rela0[3]data.phi_rela0Unstretched rotational spring vector [rad]
phi_min[3]data.phi_minrotational vector to bump stop from reference point in negative direction, resolved in frame_A [rad]
phi_max[3]data.phi_maxrotational vector to bump stop from reference point in positive direction, resolved in frame_A [rad]
bumpFactordata.bumpFactorscaleFactor of spring force at after bump
C[6, 6]data.CStiffness matrix
D[6, 6]data.DDamping matrix
lineardata.linearturn on/off linearisation of cosine and sine in rotation vector equation
epsdata.epsGuard against division by zero
data  

Modelica definition

model Bushing "CutBusing - to be used as a cut in a closed loop." 
  
  parameter SI.Position[3] rA=data.rA 
    "|General geometry|Position|vector from frame_A to bushing centre";
  parameter SI.Position[3] rB=data.rB 
    "|General geometry|Position|vector from frame_B to bushing centre";
  parameter Real[3] nx=data.nx 
    "|General geometry|Orientation|x direction of bushing, resolved in frame_A";
  parameter Real[3] ny=data.ny 
    "|General geometry|Orientation|y direction of bushing, resolved in frame_A";
  
  parameter SI.Position[3] r_rela0=data.r_rela0 
    "|General geometry|Pretention|Unstretched translational spring vector";
  parameter SI.Position[3] r_min=data.r_min 
    "|Forces|Bump|vector to bump stop from reference point in negative direction, resolved in frame_A";
  parameter SI.Position[3] r_max=data.r_max 
    "|Forces|Bump|vector to bump stop from reference point in positive direction, resolved in frame_A";
  
  parameter SI.Angle[3] phi_rela0=data.phi_rela0 
    "|General geometry|Pretention|Unstretched rotational spring vector";
  parameter SI.Angle[3] phi_min=data.phi_min 
    "|Forces|Bump|rotational vector to bump stop from reference point in negative direction, resolved in frame_A";
  parameter SI.Angle[3] phi_max=data.phi_max 
    "|Forces|Bump|rotational vector to bump stop from reference point in positive direction, resolved in frame_A";
  parameter Real bumpFactor=data.bumpFactor 
    "|Forces|Bump|scaleFactor of spring force at after bump";
  
  parameter Real[6, 6] C=data.C "|Forces|Linear|Stiffness matrix";
  parameter Real[6, 6] D=data.D "|Forces|Linear|Damping matrix";
  
  parameter Boolean linear=data.linear 
    "|Advanced||turn on/off linearisation of cosine and sine in rotation vector equation";
  
  parameter Real eps=data.eps "|Advanced||Guard against division by zero";
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_b;
  Utilities.Joints.FreeMotion freeMotion(r_rela(start=rA - rB));
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_a;
  Utilities.Forces.SpringDamperLinearBump3D springDamper(
    C=C, 
    D=D, 
    r_rela0=data.r_rela0, 
    r_min=data.r_min, 
    r_max=data.r_max, 
    bumpFactor=data.bumpFactor, 
    phi_rela0=data.phi_rela0, 
    linear=data.linear, 
    eps=data.eps);
  ModelicaAdditions.MultiBody.Parts.FrameAxes r_A(
    r=data.rA, 
    nx=data.nx, 
    ny=data.ny);
  ModelicaAdditions.MultiBody.Parts.FrameAxes r_B(
    r=data.rB, 
    nx=data.nx, 
    ny=data.ny);
  parameter Chassis.Data.BumpBushingData data;
equation 
  connect(r_A.frame_a, frame_a);
  connect(r_A.frame_b, springDamper.frame_a);
  connect(r_B.frame_b, springDamper.frame_b);
  connect(r_B.frame_a, frame_b);
  connect(freeMotion.frame_a, r_A.frame_b);
  connect(freeMotion.frame_b, springDamper.frame_b);
end Bushing;

VehicleDynamics.Chassis.Components.PairBushing VehicleDynamics.Chassis.Components.PairBushing

A pair of bushings, to be used with e.g. WishBones.

VehicleDynamics.Chassis.Components.PairBushing

Information


The bushings are linear within a specified range. Outside this range, bumpstops are modellled as a much stiffer spring-dampers. The range is defined with parameters as well as the ratio between stiffness inside outside range. The stiffness inside the range is read from record like for a normal linear SpringDamper3D.

The following parameters are used to define the component, see nomenclature for further information:

  rB1:         Vector to bushing 1.
  rB2:         Vector to bushing 2.
  r_rela01:    Unstretched translational spring vector.
  r_min1:      Vector to bump stop from reference point in negative direction of coordinate system.
  r_max1:      Vector to bump stop from reference point in positive direction of coordinate system.
  bumpFactor1: Scale-factor of spring force at after bump.
  phi_rela01:  Unstretched rotational spring vector.
  r_rela02:    Unstretched translational spring vector.
  r_min2:      Vector to bump stop from reference point in negative direction of coordinate system.
  r_max2:      Vector to bump stop from reference point in positive direction of coordinate system.
  bumpFactor2: Scale-factor of spring force at after bump.
  phi_rela02:  Unstretched rotational spring vector.
  

Parameters

NameDefaultDescription
rB1[3]{0.3,0,0}vector to bushing 1 [m]
rB2[3]{0.3,0,0}vector to bushing 2 [m]
nx1[3]data1.nxx direction of bushing, resolved in frame_A
ny1[3]data1.nyy direction of bushing, resolved in frame_A
r_rela01[3]data1.r_rela0Unstretched translational spring vector [m]
r_min1[3]data1.r_minvector to bump stop from reference point in negative direction, resolved in frame_A [m]
r_max1[3]data1.r_maxvector to bump stop from reference point in positive direction, resolved in frame_A [m]
phi_rela01[3]data1.phi_rela0Unstretched rotational spring vector [rad]
phi_min1[3]data1.phi_minrotational vector to bump stop from reference point in negative direction, resolved in frame_A [rad]
phi_max1[3]data1.phi_maxrotational vector to bump stop from reference point in positive direction, resolved in frame_A [rad]
bumpFactor1data1.bumpFactorscaleFactor of spring force at after bump
C1[6, 6]data1.CStiffness matrix
D1[6, 6]data1.DDamping matrix
linear1data1.linearturn on/off linearisation of cosine and sine in rotation vector equation
eps1data1.epsGuard against division by zero
ny2[3]data2.nyy direction of bushing, resolved in frame_A
r_rela02[3]data2.r_rela0Unstretched translational spring vector [m]
r_min2[3]data2.r_minvector to bump stop from reference point in negative direction, resolved in frame_A [m]
r_max2[3]data2.r_maxvector to bump stop from reference point in positive direction, resolved in frame_A [m]
phi_rela02[3]data2.phi_rela0Unstretched rotational spring vector [rad]
phi_min2[3]data2.phi_minrotational vector to bump stop from reference point in negative direction, resolved in frame_A [rad]
phi_max2[3]data2.phi_maxrotational vector to bump stop from reference point in positive direction, resolved in frame_A [rad]
bumpFactor2data2.bumpFactorscaleFactor of spring force at after bump
C2[6, 6]data2.CStiffness matrix
D2[6, 6]data2.DDamping matrix
linear2data2.linearturn on/off linearisation of cosine and sine in rotation vector equation
eps2data2.epsGuard against division by zero
data2  
data1  

Modelica definition

model PairBushing 
  "A pair of bushings, to be used with e.g. WishBones." 
  
  parameter SI.Position rB1[3]={0.3,0,0} "vector to bushing 1";
  parameter SI.Position rB2[3]={0.3,0,0} "vector to bushing 2";
  
  parameter Real[3] nx1=data1.nx 
    "|General geometry|Orientation|x direction of bushing, resolved in frame_A";
  parameter Real[3] ny1=data1.ny 
    "|General geometry|Orientation|y direction of bushing, resolved in frame_A";
  
  parameter SI.Position[3] r_rela01=data1.r_rela0 
    "|General geometry|Pretention|Unstretched translational spring vector";
  parameter SI.Position[3] r_min1=data1.r_min 
    "|Forces|Bump|vector to bump stop from reference point in negative direction, resolved in frame_A";
  parameter SI.Position[3] r_max1=data1.r_max 
    "|Forces|Bump|vector to bump stop from reference point in positive direction, resolved in frame_A";
  
  parameter SI.Angle[3] phi_rela01=data1.phi_rela0 
    "|General geometry|Pretention|Unstretched rotational spring vector";
  parameter SI.Angle[3] phi_min1=data1.phi_min 
    "|Forces|Bump|rotational vector to bump stop from reference point in negative direction, resolved in frame_A";
  parameter SI.Angle[3] phi_max1=data1.phi_max 
    "|Forces|Bump|rotational vector to bump stop from reference point in positive direction, resolved in frame_A";
  parameter Real bumpFactor1=data1.bumpFactor 
    "|Forces|Bump|scaleFactor of spring force at after bump";
  
  parameter Real[6, 6] C1=data1.C "|Forces|Linear|Stiffness matrix";
  parameter Real[6, 6] D1=data1.D "|Forces|Linear|Damping matrix";
  
  parameter Boolean linear1=data1.linear 
    "|Advanced||turn on/off linearisation of cosine and sine in rotation vector equation";
  
  parameter Real eps1=data1.eps "|Advanced||Guard against division by zero";
  parameter Real[3] ny2=data2.ny 
    "|General geometry|Orientation|y direction of bushing, resolved in frame_A";
  
  parameter SI.Position[3] r_rela02=data2.r_rela0 
    "|General geometry|Pretention|Unstretched translational spring vector";
  parameter SI.Position[3] r_min2=data2.r_min 
    "|Forces|Bump|vector to bump stop from reference point in negative direction, resolved in frame_A";
  parameter SI.Position[3] r_max2=data2.r_max 
    "|Forces|Bump|vector to bump stop from reference point in positive direction, resolved in frame_A";
  
  parameter SI.Angle[3] phi_rela02=data2.phi_rela0 
    "|General geometry|Pretention|Unstretched rotational spring vector";
  parameter SI.Angle[3] phi_min2=data2.phi_min 
    "|Forces|Bump|rotational vector to bump stop from reference point in negative direction, resolved in frame_A";
  parameter SI.Angle[3] phi_max2=data2.phi_max 
    "|Forces|Bump|rotational vector to bump stop from reference point in positive direction, resolved in frame_A";
  parameter Real bumpFactor2=data2.bumpFactor 
    "|Forces|Bump|scaleFactor of spring force at after bump";
  
  parameter Real[6, 6] C2=data2.C "|Forces|Linear|Stiffness matrix";
  parameter Real[6, 6] D2=data2.D "|Forces|Linear|Damping matrix";
  
  parameter Boolean linear2=data2.linear 
    "|Advanced||turn on/off linearisation of cosine and sine in rotation vector equation";
  
  parameter Real eps2=data2.eps "|Advanced||Guard against division by zero";
  
  
  Utilities.Joints.FreeMotion freeMotion;
  ModelicaAdditions.MultiBody.Parts.FrameAxes FrameAxes2_1(r=rB2);
  ModelicaAdditions.MultiBody.Parts.FrameAxes FrameAxes2_2(r=rB2);
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_a;
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_b;
  Utilities.Forces.SpringDamperLinearBump3D bushing1(
    r_rela0=r_rela01, 
    r_min=r_min1, 
    r_max=r_max1, 
    bumpFactor=bumpFactor1, 
    phi_rela0=phi_rela01, 
    C=[1000000, 0, 0, 0, 0, 0; 0, 1000000, 0, 0, 0, 0; 0, 0, 1000000, 0, 0, 0; 
        0, 0, 0, 100, 0, 0; 0, 0, 0, 0, 1, 0; 0, 0, 0, 0, 0, 1], 
    linear=linear1, 
    eps=eps1);
  Utilities.Forces.SpringDamperLinearBump3D bushing2(
    r_rela0=r_rela02, 
    r_min=r_min2, 
    r_max=r_max2, 
    bumpFactor=bumpFactor2, 
    phi_rela0=phi_rela02, 
    C=bushing1.C, 
    D=bushing1.D, 
    linear=linear2, 
    eps=eps2);
  ModelicaAdditions.MultiBody.Parts.FrameAxes FrameAxes1_1(r=rB1);
  ModelicaAdditions.MultiBody.Parts.FrameAxes FrameAxes1_2(r=rB1);
  parameter Chassis.Data.BumpBushingData data2;
  parameter Chassis.Data.BumpBushingData data1;
equation 
  connect(FrameAxes2_1.frame_a, frame_a);
  connect(FrameAxes2_1.frame_b, bushing2.frame_a);
  connect(bushing2.frame_b, FrameAxes2_2.frame_b);
  connect(freeMotion.frame_b, FrameAxes2_2.frame_a);
  connect(FrameAxes1_1.frame_a, frame_a);
  connect(FrameAxes1_1.frame_b, bushing1.frame_a);
  connect(FrameAxes1_2.frame_a, freeMotion.frame_b);
  connect(bushing1.frame_b, FrameAxes1_2.frame_b);
  connect(frame_b, freeMotion.frame_b);
  connect(freeMotion.frame_a, frame_a);
end PairBushing;

VehicleDynamics.Chassis.Components.CutBushing VehicleDynamics.Chassis.Components.CutBushing

CutBusing - to be used as a cut in a closed loop.

VehicleDynamics.Chassis.Components.CutBushing

Information


The bushing is linear within a specified range. Outside this range, bumpstops are modellled as a much stiffer spring-dampers. The range is defined with parameters as well as the ratio between stiffness inside outside range. The stiffness inside the range is read from record like for a normal linear SpringDamper3D.

The following parameters are used to define the component, see nomenclature for further information:

  r_rela0:    Unstretched translational spring vector.
  r_min:      Vector to bump stop from reference point in negative direction of coordinate system.
  r_max:      Vector to bump stop from reference point in positive direction of coordinate system.
  bumpFactor: Scale-factor of spring force at after bump.
  phi_rela0:  Unstretched rotational spring vector.
  

Parameters

NameDefaultDescription
rA[3]data.rAvector from frame_A to bushing centre [m]
rB[3]data.rBvector from frame_B to bushing centre [m]
nx[3]data.nxx direction of bushing, resolved in frame_A
ny[3]data.nyy direction of bushing, resolved in frame_A
r_rela0[3]data.r_rela0Unstretched translational spring vector [m]
r_min[3]data.r_minvector to bump stop from reference point in negative direction, resolved in frame_A [m]
r_max[3]data.r_maxvector to bump stop from reference point in positive direction, resolved in frame_A [m]
phi_rela0[3]data.phi_rela0Unstretched rotational spring vector [rad]
phi_min[3]data.phi_minrotational vector to bump stop from reference point in negative direction, resolved in frame_A [rad]
phi_max[3]data.phi_maxrotational vector to bump stop from reference point in positive direction, resolved in frame_A [rad]
bumpFactordata.bumpFactorscaleFactor of spring force at after bump
C[6, 6]data.CStiffness matrix
D[6, 6]data.DDamping matrix
lineardata.linearturn on/off linearisation of cosine and sine in rotation vector equation
epsdata.epsGuard against division by zero
data  

Modelica definition

model CutBushing "CutBusing - to be used as a cut in a closed loop." 
  parameter SI.Position[3] rA=data.rA 
    "|General geometry|Position|vector from frame_A to bushing centre";
  parameter SI.Position[3] rB=data.rB 
    "|General geometry|Position|vector from frame_B to bushing centre";
  parameter Real[3] nx=data.nx 
    "|General geometry|Orientation|x direction of bushing, resolved in frame_A";
  parameter Real[3] ny=data.ny 
    "|General geometry|Orientation|y direction of bushing, resolved in frame_A";
  
  parameter SI.Position[3] r_rela0=data.r_rela0 
    "|General geometry|Pretention|Unstretched translational spring vector";
  parameter SI.Position[3] r_min=data.r_min 
    "|Forces|Bump|vector to bump stop from reference point in negative direction, resolved in frame_A";
  parameter SI.Position[3] r_max=data.r_max 
    "|Forces|Bump|vector to bump stop from reference point in positive direction, resolved in frame_A";
  
  parameter SI.Angle[3] phi_rela0=data.phi_rela0 
    "|General geometry|Pretention|Unstretched rotational spring vector";
  parameter SI.Angle[3] phi_min=data.phi_min 
    "|Forces|Bump|rotational vector to bump stop from reference point in negative direction, resolved in frame_A";
  parameter SI.Angle[3] phi_max=data.phi_max 
    "|Forces|Bump|rotational vector to bump stop from reference point in positive direction, resolved in frame_A";
  parameter Real bumpFactor=data.bumpFactor 
    "|Forces|Bump|scaleFactor of spring force at after bump";
  
  parameter Real[6, 6] C=data.C "|Forces|Linear|Stiffness matrix";
  parameter Real[6, 6] D=data.D "|Forces|Linear|Damping matrix";
  
  parameter Boolean linear=data.linear 
    "|Advanced||turn on/off linearisation of cosine and sine in rotation vector equation";
  
  parameter Real eps=data.eps "|Advanced||Guard against division by zero";
  
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_a;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_b;
  Utilities.Forces.SpringDamperLinearBump3D springDamper(
    r_rela0=r_rela0, 
    r_min=r_min, 
    r_max=r_max, 
    bumpFactor=bumpFactor, 
    phi_rela0=phi_rela0, 
    C=C, 
    D=D, 
    linear=linear, 
    eps=eps);
  ModelicaAdditions.MultiBody.Parts.FrameAxes r_A(
    r=rA, 
    nx=nx, 
    ny=ny);
  ModelicaAdditions.MultiBody.Parts.FrameAxes r_B(
    nx=nx, 
    ny=ny, 
    r=rB);
  parameter Chassis.Data.BumpBushingData data;
equation 
  connect(r_A.frame_a, frame_a);
  connect(r_A.frame_b, springDamper.frame_a);
  connect(r_B.frame_b, springDamper.frame_b);
  connect(r_B.frame_a, frame_b);
end CutBushing;

VehicleDynamics.Chassis.Components.CutLink VehicleDynamics.Chassis.Components.CutLink

Two bushings connected by a massless rod

VehicleDynamics.Chassis.Components.CutLink

Parameters

NameDefaultDescription
kinematicConstrainttrue = false, if used together with DependentRevolute to solve loop analytically
rA[3]{0,0,0}Position vector from frame_a to center of bushingA, resolved in frame_a [m]
rB[3]{0,0,0}Position vector from center of bushingb to frame_b, resolved in frame_b [m]
rRod[3]{1,0,0}Position vector from rod.frame_a to rod.frame_b, resolved in frame_a at the initial configuration [m]

Modelica definition

model CutLink "Two bushings connected by a massless rod" 
  import SI = Modelica.SIunits;
  parameter Boolean kinematicConstraint=true 
    "|Advanced|| = false, if used together with DependentRevolute to solve loop analytically";
  parameter SI.Position[3] rA={0,0,0} 
    "Position vector from frame_a to center of bushingA, resolved in frame_a";
  parameter SI.Position[3] rB={0,0,0} 
    "Position vector from center of bushingb to frame_b, resolved in frame_b";
  parameter SI.Position[3] rRod={1,0,0} 
    "Position vector from rod.frame_a to rod.frame_b, resolved in frame_a at the initial configuration";
  /*
  parameter Boolean autoInit=false 
    "|Initialization| = true: Compute nxRod, nyRod such that bushingB rotations are zero."
    ;
  parameter Real nxRod[3]={1,0,0} 
    "|Initialization| if autoInit = false, x-axis vector of rod.frame_b, resolved in frame_a at the initial configuration"
    ;
  parameter Real nyRod[3]={0,1,0} 
    "|Initialization| if autoInit = false, y-axis vector of rod.frame_b, resolved in frame_a at the initial configuration"
    ;
*/
  
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_a;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_b;
  Utilities.Parts.Body rod(
    r=rRod, 
    shape="cylinder", 
    height=0.02, 
    width=0.02) "{sqrt((rRod)*(rRod)),0,0}";
  ModelicaAdditions.MultiBody.Parts.FrameTranslation rotA(r=rA);
  ModelicaAdditions.MultiBody.Parts.FrameTranslation rotB(r=-rB);
  Utilities.Joints.JointUS link(L=sqrt((rRod)*(rRod)), kinematicConstraint=
        kinematicConstraint);
  Utilities.Parts.Shape shapeA(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
  Utilities.Parts.Shape shapeB(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
initial equation 
equation 
  
  connect(rotA.frame_a, frame_a);
  connect(frame_b, rotB.frame_a);
  connect(link.frame_a, rotA.frame_b);
  connect(link.frame_b, rotB.frame_b);
  connect(rod.frame_a, link.frame_c);
  connect(shapeA.frame_a, rotA.frame_b);
  connect(shapeB.frame_a, rod.frame_b);
end CutLink;

VehicleDynamics.Chassis.Components.Link VehicleDynamics.Chassis.Components.Link

Two bushings connected by a massless rod

VehicleDynamics.Chassis.Components.Link

Parameters

NameDefaultDescription
rA[3]{0,0,0}Position vector from frame_a to center of bushingA, resolved in frame_a [m]
rB[3]{0,0,0}Position vector from center of bushingb to frame_b, resolved in frame_b [m]
rRod[3]{1,0,0}Position vector from rod.frame_a to rod.frame_b, resolved in frame_a at the initial configuration [m]

Modelica definition

model Link "Two bushings connected by a massless rod" 
  import SI = Modelica.SIunits;
  parameter SI.Position[3] rA={0,0,0} 
    "Position vector from frame_a to center of bushingA, resolved in frame_a";
  parameter SI.Position[3] rB={0,0,0} 
    "Position vector from center of bushingb to frame_b, resolved in frame_b";
  parameter SI.Position[3] rRod={1,0,0} 
    "Position vector from rod.frame_a to rod.frame_b, resolved in frame_a at the initial configuration";
  /*
  parameter Boolean autoInit=false 
    "|Initialization| = true: Compute nxRod, nyRod such that bushingB rotations are zero."
    ;
  parameter Real nxRod[3]={1,0,0} 
    "|Initialization| if autoInit = false, x-axis vector of rod.frame_b, resolved in frame_a at the initial configuration"
    ;
  parameter Real nyRod[3]={0,1,0} 
    "|Initialization| if autoInit = false, y-axis vector of rod.frame_b, resolved in frame_a at the initial configuration"
    ;
*/
  
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_a;
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_b;
  Utilities.Parts.Body rod(
    r=rRod, 
    shape="cylinder", 
    material={0.5,0.5,0.5,0.5});
  Chassis.Data.BumpBushingData dataA(
    r_min={-1,-1,-1}, 
    r_max={1,1,1}, 
    phi_min={-1,-1,-1}, 
    phi_max={1,1,1});
  Chassis.Data.BumpBushingData dataB(
    r_min={-1,-1,-1}, 
    r_max={1,1,1}, 
    phi_min={-1,-1,-1}, 
    phi_max={1,1,1});
  ModelicaAdditions.MultiBody.Parts.FrameTranslation rotA(r=rA);
  ModelicaAdditions.MultiBody.Parts.FrameTranslation rotB(r=rB);
  ModelicaAdditions.MultiBody.Joints.Universal jointB(nx=cross(rRod, {0,0,1}), 
       ny=cross(rRod, jointB.nx));
  Utilities.Joints.Spherical jointA;
  Utilities.Parts.Shape shapeA(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
  Utilities.Parts.Shape shapeB(
    shape="sphere", 
    r0={-0.015,0,0}, 
    lengthDirection={1,0,0}, 
    material={0,0,0.7,0.5});
initial equation 
equation 
  
  connect(rotB.frame_b, frame_b);
  connect(rotA.frame_a, frame_a);
  connect(shapeA.frame_a, rotA.frame_b);
  connect(shapeB.frame_a, rod.frame_b);
  connect(jointB.frame_b, rotB.frame_a);
  connect(jointB.frame_a, rod.frame_b);
  connect(jointA.frame_b, rod.frame_a);
  connect(jointA.frame_a, rotA.frame_b);
end Link;

VehicleDynamics.Chassis.Components.AntiRollBar VehicleDynamics.Chassis.Components.AntiRollBar

AntiRollBar - standard anti-roll linkage.

VehicleDynamics.Chassis.Components.AntiRollBar

Information


To a torsion bar with levers in each end, two connecting rods are attached, these are normally attached at the left and right suspension linkage to reduce roll motion. This component is modelled with rigid elements, except for a torsion bar. The force generation fue to deflection is modelled from table values.

Usage: Most vehicles with independent suspensions, both front and rear.

The following parameters are used to define the component, see nomenclature for further information: The right hand side parameters, ending with _2, are by default symmetric to the left hand dito ending with _1.

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} mirrors it around the xz-plane.
  ratioWheelToRack=22: rack-pinion gear ratio [m/rad]
  rX_1:   location of frame X_1, resolved in frame_C
  rXL1_1: location of left link end, resolved in frame_C
  rAL_1:  location of left torsion bar end, resolved in frame_C
  rX_2:   location of frame X_2, resolved in frame_C,
  rXL1_2: location of right link end, resolved in frame_C
  rAL_2:  location of right torsion bar end, resolved in frame_C
  forceTable: To set the force generation table add a component named [name] of class Forces.Utilities.ForceTable1D to the model and write forceTable=[name] in the modifiers row
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1} 
rCA_1[3]{-0.2405,0.3420,0.0330}vector to left torsion beam end resolved in frame_C
rAL_1[3]{-0.0439,0.5115,0.0203}vector to left inner anti roll rod end/left anti roll lever resolved in frame_C
rXL_1[3]{-0.0564,0.5401,0.2183}vector to left outer anti roll rod end resolved in frame_C
rX_1[3]{0.0059,0.6905,-0.0710} + {-0.0060,0.0365,0.1110}vector to left anti roll mount resolved in frame_C
rCA_2[3]Utilities.Functions.EWM({1,-1,1}, rCA_1) 
rAL_2[3]Utilities.Functions.EWM({1,-1,1}, rAL_1) 
rXL_2[3]Utilities.Functions.EWM({1,-1,1}, rXL_1) 
rX_2[3]Utilities.Functions.EWM({1,-1,1}, rX_1) 
data  

Modelica definition

model AntiRollBar "AntiRollBar - standard anti-roll linkage." 
  
  parameter Real[3] scaleFactor={1,1,1};
  parameter Real[3] rCA_1={-0.2405,0.3420,0.0330} 
    "vector to left torsion beam end resolved in frame_C";
  parameter Real[3] rAL_1={-0.0439,0.5115,0.0203} 
    "vector to left inner anti roll rod end/left anti roll lever resolved in frame_C";
  parameter Real[3] rXL_1={-0.0564,0.5401,0.2183} 
    "vector to left outer anti roll rod end resolved in frame_C";
  parameter Real[3] rX_1={0.0059,0.6905,-0.0710} + {-0.0060,0.0365,0.1110} 
    "vector to left anti roll mount resolved in frame_C";
  
  parameter Real[3] rCA_2=Utilities.Functions.EWM({1,-1,1}, rCA_1);
  parameter Real[3] rAL_2=Utilities.Functions.EWM({1,-1,1}, rAL_1);
  parameter Real[3] rXL_2=Utilities.Functions.EWM({1,-1,1}, rXL_1);
  parameter Real[3] rX_2=Utilities.Functions.EWM({1,-1,1}, rX_1);
  
protected 
  parameter Real[3] rCA_1_scaled=Utilities.Functions.EWM(scaleFactor, rCA_1);
  parameter Real[3] rAL_1_scaled=Utilities.Functions.EWM(scaleFactor, rAL_1);
  parameter Real[3] rXL_1_scaled=Utilities.Functions.EWM(scaleFactor, rXL_1);
  parameter Real[3] rX_1_scaled=Utilities.Functions.EWM(scaleFactor, rX_1);
  
  parameter Real[3] rCA_2_scaled=Utilities.Functions.EWM(scaleFactor, rCA_2);
  parameter Real[3] rAL_2_scaled=Utilities.Functions.EWM(scaleFactor, rAL_2);
  parameter Real[3] rXL_2_scaled=Utilities.Functions.EWM(scaleFactor, rXL_2);
  parameter Real[3] rX_2_scaled=Utilities.Functions.EWM(scaleFactor, rX_2);
  
public 
  ModelicaAdditions.MultiBody.Joints.Revolute rightRevolute(
    q(start=0), 
    n=rAL_1_scaled - rAL_2_scaled, 
    qd(start=0));
  ModelicaAdditions.MultiBody.Joints.Revolute leftRevolute(
    n=rAL_1_scaled - rAL_2_scaled, 
    q(start=0), 
    qd(start=0));
  ModelicaAdditions.MultiBody.Parts.FrameTranslation frameTranslation(r=(
        rCA_1_scaled + rCA_2_scaled)/2);
  Utilities.Parts.Body leftBar(r=rCA_1_scaled - (rCA_1_scaled + rCA_2_scaled)
        /2);
  Utilities.Parts.Body rightBar(r=rCA_2_scaled - (rCA_1_scaled + 
        rCA_2_scaled)/2);
  Utilities.Parts.Body rightLever(r=rAL_2_scaled - rCA_2_scaled);
  Utilities.Parts.Body leftLever(r=rAL_1_scaled - rCA_1_scaled);
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_X_2;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_X_1;
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_C;
  Utilities.Forces.SpringDamperTableRot1D springDamper(data=data);
  parameter Utilities.Forces.Utilities.ForceTable1D data;
  CutLink rightLink(rB=-rXL_2_scaled + rX_2_scaled, rRod=rXL_2_scaled - 
        rAL_2_scaled);
  CutLink leftLink(rB=-rXL_1_scaled + rX_1_scaled, rRod=rXL_1_scaled - 
        rAL_1_scaled);
equation 
  connect(frameTranslation.frame_b, leftRevolute.frame_a);
  connect(rightRevolute.frame_a, frameTranslation.frame_b);
  connect(rightBar.frame_a, rightRevolute.frame_b);
  connect(leftRevolute.frame_b, leftBar.frame_a);
  connect(leftLever.frame_a, leftBar.frame_b);
  connect(rightLever.frame_a, rightBar.frame_b);
  connect(frameTranslation.frame_a, frame_C);
  connect(springDamper.flange_a, rightRevolute.axis);
  connect(springDamper.flange_b, leftRevolute.axis);
  connect(rightLink.frame_b, frame_X_2);
  connect(rightLink.frame_a, rightLever.frame_b);
  connect(leftLink.frame_a, leftLever.frame_b);
  connect(leftLink.frame_b, frame_X_1);
end AntiRollBar;

VehicleDynamics.Chassis.Components.BeamAxle VehicleDynamics.Chassis.Components.BeamAxle

BeamAxle, used in rigid axle suspensions

VehicleDynamics.Chassis.Components.BeamAxle

Information


Until the late 70s, most cars still used this simple non-independent suspensions, especially at the rear axle. Basically, it is a rigid axle fixed between left and right wheels. The car body is suspended by leaf springs or coil springs on the axle / wheels unit. On a smoth road, the wheels remains uncambered as the car rolls but if a wheel hits a bump, the shock will be transfeered to the other wheel as well, giving a large unsprung mass and camber wffects on both wheels. If the beam axle is also the driving axle, it is called live axle. A live axle consists of the final drive / differential, drive shafts and a strong tube enclosing these components. Since the live axle is rigidly connected to the wheels, the unsprung mass is often very high for this solution. Without drive, the axle is called dead axle, this in normally a lot lighter. The BeamAxle is normally used toghether with a Watt linkage or a Panhard rod to contrain the motion of the axle. Advantage: Disadvantage: Who use it ?

Advantages: Cheap. Body roll does not influence the camber of wheels.

Disadvantages: Non-independent, bad ride quality, both wheels cambered on bump.

Usage: Some American sedans, and most Trucks.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} makes a left-hand linkage into a right-hand dito.
  rUW_1:    location of frame_W_1, resolved in frame_C
  rUW_2:    location of frame_W_2, resolved in frame_C
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1} 
rUW_1[3]{0,0.9,0}Vector to left wheel centre resolved in frame_C
rUW_2[3]Utilities.Functions.EWM({1,-1,1}, rUW_1)Vector to right wheel centre resolved in frame_C

Modelica definition

model BeamAxle "BeamAxle, used in rigid axle suspensions" 
  parameter Real[3] scaleFactor={1,1,1};
  parameter Real[3] rUW_1={0,0.9,0} 
    "Vector to left wheel centre resolved in frame_C";
  parameter Real[3] rUW_2=Utilities.Functions.EWM({1,-1,1}, rUW_1) 
    "Vector to right wheel centre resolved in frame_C";
  
  /*Scaled coordinates*/
protected 
  parameter Real[3] rUW_1_scaled=Utilities.Functions.EWM(scaleFactor, rUW_1);
  parameter Real[3] rUW_2_scaled=Utilities.Functions.EWM(scaleFactor, rUW_2);
  
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_C;
  Utilities.Parts.Body rightBeam(
    width=0.02, 
    height=0.05, 
    r=rUW_2_scaled - (rUW_1_scaled + rUW_2_scaled)/2);
  Utilities.Parts.Body leftBeam(
    width=0.02, 
    height=0.05, 
    r=rUW_1_scaled - (rUW_1_scaled + rUW_2_scaled)/2);
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_U_1;
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_U_2;
  Utilities.Joints.FreeMotion freeMotion(
    phi(start={0,0,0}), 
    w_rela(start={0,0,0}), 
    enforceStates=false, 
    r_rela(start={0,0,0}));
  ModelicaAdditions.MultiBody.Parts.FrameTranslation FrameTranslation1(r=(
        rUW_1_scaled + rUW_2_scaled)/2);
  ModelicaAdditions.MultiBody.Parts.Shape Shape2(
    Shape="sphere", 
    Length=0.2, 
    Width=0.2, 
    Height=0.2, 
    Material={0,0,1,0.5});
  ModelicaAdditions.MultiBody.Parts.Shape Shape1(
    Shape="sphere", 
    Length=0.2, 
    Width=0.2, 
    Height=0.2, 
    Material={0,1,0,0.5});
equation 
  
  connect(leftBeam.frame_a, freeMotion.frame_b);
  connect(rightBeam.frame_a, freeMotion.frame_b);
  connect(rightBeam.frame_b, frame_U_2);
  connect(leftBeam.frame_b, frame_U_1);
  connect(FrameTranslation1.frame_a, frame_C);
  connect(FrameTranslation1.frame_b, freeMotion.frame_a);
  connect(Shape2.frame_a, FrameTranslation1.frame_b);
  connect(Shape1.frame_a, freeMotion.frame_b);
end BeamAxle;

VehicleDynamics.Chassis.Components.MacPherson2 VehicleDynamics.Chassis.Components.MacPherson2

MacPherson strut linkage

VehicleDynamics.Chassis.Components.MacPherson2

Information


The MacPherson strut suspension was invented in the 1940s by Earl S. MacPherson of Ford. It was introduced on the 1950 English Ford and has since become one of the dominating suspensions systems of the world because of its compactness and low cost. Unlike other suspension designs, in MacPherson strut suspension, the telescopic shock absorber also serves as a link to control the position of the wheel and makes the upper control arm obsolete. Since the strut is vertically positioned, the whole suspension is very compact and suitable for front-wheel drive cars, whose engine and transmission are all located inside the front compartment and need front suspensions which engage very little width of the car.

Advantages: Compact and cheap.

Disadvantages: Body roll and wheel's movement lead to variation in camber, although not as severe as swing axle suspension.

Usage: The MacPherson strut is the dominatin front suspension for cars.

The following parameters are used to define the component, see nomenclature for further information:

  scaleFactor: The component can be scaled assymetrically, e.g. {1,-1,1} makes a left-hand linkage into a right-hand dito.
  rUL1L2: location of outer ballUtilities.Joints.Joint, resolved in frame_C
  rCL1:   location of inner frontUtilities.Joints.Joint, resolved in frame_C
  rCL2:   location of inner rearUtilities.Joints.Joint, resolved in frame_C
  rCS:    location of strut mount in chassis, resolved in frame_C
  rUS:    location of strut mount in upright, resolved in frame_C
  rUW:    location of frame_W, resolved in frame_C
  forceTable: To set the force generation table add a component named [name] of class Utilities.Forces.Utilities.ForceTable1D to the model and write forceTable=[name] in the modifiers row
  Mass and inertia properties not yet solved!  

Parameters

NameDefaultDescription
scaleFactor[3]{1,1,1}To make right hand side Linkage use {1,-1,1}
rCL1[3]{0.1070,0.55,-0.0380} Vector from origin of frame_C to front link mount in chassis resolved in frame_C (at initial time) [m]
rCL2[3]{-0.3070,0.55,-0.0380} Vector from origin of frame_C to rear link mount in chassis resolved in frame_C (at initial time) [m]
rCS[3]{-0.0295,0.850,0.5670} Vector from origin of frame_C to strut mount in chassis resolved in frame_C (at initial time) [m]
rUS[3]{-0.0070,0.8733,0.1380} Vector from origin of frame_C to strut mount in uppright resolved in frame_C (at initial time) [m]
rUL1L2[3]{-0.0070,0.8733,-0.0380} Vector from origin of frame_C to low spindleUtilities.Joints.Joint resolved in frame_C (at initial time) [m]
rUW[3]{0.0,0.9,0} Vector from origin of frame_C to wheel centre resolved in frame_C (at initial time) [m]
rRL3[3]{-0.12,0.85,0.08} Vector from origin of frame_C to origin of frame_S resolved in frame_C (at initial time) [m]
rUL3[3]{0.0,0.9,0} Vector from origin of frame_C to lower ball of steering rod resolved in frame_C (at initial time) [m]
q0S0.05 Unstretched additional spring length of the strut, compared to the construction geometry [m]
rCMU[3]{0,0,0}[m]
mU0[kg]
i11U0[kg.m2]
i22U0[kg.m2]
i33U0[kg.m2]
i21U0[kg.m2]
i31U0[kg.m2]
i32U0[kg.m2]
rCML1L2[3]{0,0,0}[m]
mL1L20[kg]
i11L1L2.0[kg.m2]
i22L1L2.0[kg.m2]
i33L1L2.0[kg.m2]
i21L1L2.0[kg.m2]
i31L1L2.0[kg.m2]
i32L1L2.0[kg.m2]

Modelica definition

model MacPherson2 "MacPherson strut linkage" 
  import SI = Modelica.SIunits;
  
  extends Chassis.Interfaces.Interface;
  parameter Real[3] scaleFactor={1,1,1} 
    "To make right hand side Linkage use {1,-1,1}";
  parameter SI.Position[3] rCL1={0.1070,0.55,-0.0380} 
    "|Geometry| Vector from origin of frame_C to front link mount in chassis resolved in frame_C (at initial time)";
  parameter SI.Position[3] rCL2={-0.3070,0.55,-0.0380} 
    "|Geometry| Vector from origin of frame_C to rear link mount in chassis resolved in frame_C (at initial time)";
  parameter SI.Position[3] rCS={-0.0295,0.850,0.5670} 
    "|Geometry| Vector from origin of frame_C to strut mount in chassis resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUS={-0.0070,0.8733,0.1380} 
    "|Geometry| Vector from origin of frame_C to strut mount in uppright resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUL1L2={-0.0070,0.8733,-0.0380} 
    "|Geometry| Vector from origin of frame_C to low spindleUtilities.Joints.Joint resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUW={0.0,0.9,0} 
    "|Geometry| Vector from origin of frame_C to wheel centre resolved in frame_C (at initial time)";
  parameter SI.Position[3] rRL3={-0.12,0.85,0.08} 
    "|Geometry| Vector from origin of frame_C to origin of frame_S resolved in frame_C (at initial time)";
  parameter SI.Position[3] rUL3={0.0,0.9,0} 
    "|Geometry| Vector from origin of frame_C to lower ball of steering rod resolved in frame_C (at initial time)";
  parameter SI.Length q0S=0.05 
    "|Geometry| Unstretched additional spring length of the strut, compared to the construction geometry";
  
  parameter SI.Position[3] rCMU={0,0,0} "|Mass and Inertia|Wheel carrier|";
  parameter SI.Mass mU=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i11U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i22U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i33U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i21U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i31U=0 "|Mass and Inertia|Wheel carrier|";
  parameter SI.Inertia i32U=0 "|Mass and Inertia|Wheel carrier|";
  
  parameter SI.Position[3] rCML1L2={0,0,0} "|Mass and Inertia|Wishbone|";
  parameter SI.Mass mL1L2=0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i11L1L2=.0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i22L1L2=.0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i33L1L2=.0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i21L1L2=.0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i31L1L2=.0 "|Mass and Inertia|Wishbone|";
  parameter SI.Inertia i32L1L2=.0 "|Mass and Inertia|Wishbone|";
  
  /*Scaled coordinates*/
protected 
  parameter SI.Position[3] rCL1_scaled=Utilities.Functions.EWM(scaleFactor, rCL1);
  parameter SI.Position[3] rCL2_scaled=Utilities.Functions.EWM(scaleFactor, rCL2);
  parameter SI.Position[3] rCS_scaled=Utilities.Functions.EWM(scaleFactor, rCS);
  parameter SI.Position[3] rUS_scaled=Utilities.Functions.EWM(scaleFactor, rUS);
  parameter SI.Position[3] rUL1L2_scaled=Utilities.Functions.EWM(scaleFactor, rUL1L2);
  parameter SI.Position[3] rUW_scaled=Utilities.Functions.EWM(scaleFactor, rUW);
  parameter SI.Position[3] rRL3_scaled=Utilities.Functions.EWM(scaleFactor, rRL3);
  parameter SI.Position[3] rUL3_scaled=Utilities.Functions.EWM(scaleFactor, rUL3);
  parameter SI.Length q0Strut=sqrt((rCS_scaled - rUS_scaled)*(rCS_scaled - rUS_scaled))
       + q0S;
  parameter SI.Length L_frontBar=sqrt((rCL1_scaled - rUL1L2_scaled)*(rCL1_scaled - 
      rUL1L2_scaled)) "length of frontBar";
  parameter SI.Length L_rearBar=sqrt((rCL2_scaled - rUL1L2_scaled)*(rCL2_scaled - 
      rUL1L2_scaled)) "length of rearBar";
  parameter SI.Length L_springRod=sqrt((rUS_scaled - rUL1L2_scaled)*(rUS_scaled - 
      rUL1L2_scaled));
  parameter SI.Length L_outerRod=sqrt((rUW_scaled - rUL1L2_scaled)*(rUW_scaled - 
      rUL1L2_scaled));
  parameter SI.Position rS[3]=rCS_scaled - rUL1L2_scaled;
  parameter SI.Position rU[3]=rUW_scaled - rUL1L2_scaled 
    "Position vector from frame_L1L2 to frame_U, resolved in frame_C";
  parameter Real n_a[3]=cross(rS, rU) 
    "First rotation axis of universalUtilities.Joints.Joint in springJoint, resolved in frame_C";
  
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_L12;
  Utilities.Forces.Utilities.ForceTable1D data_S;
  ModelicaAdditions.MultiBody.Parts.FrameTranslation upper(r=rCS_scaled);
  Utilities.Joints.JointUPS MacPherson(n_a=n_a);
  Utilities.Parts.Body springRod(r=rUS_scaled - rUL1L2_scaled, mass=false);
  Utilities.Forces.SpringDamperTableLine3D strut(s_rel0=q0Strut, data=data_S);
  Utilities.Parts.Body outerRod(r=rUW_scaled - rUL1L2_scaled, mass=false);
  ModelicaAdditions.MultiBody.Parts.Body U(
    rCM=rCMU, 
    m=mU, 
    I11=i11U, 
    I22=i22U, 
    I33=i33U, 
    I21=i21U, 
    I31=i31U, 
    I32=i32U);
  Utilities.Parts.Body steeringRod(r=rUL3_scaled - rRL3_scaled, shape=
        "cylinder");
  Utilities.Joints.JointRSU steeringJoint(
    n_b={1,0,0}, 
    n_a=rCS_scaled - rUL1L2_scaled, 
    r_a=rUL3_scaled - rUL1L2_scaled);
  ModelicaAdditions.MultiBody.Joints.Revolute innerJoint(
    q(stateSelect=StateSelect.always), 
    qd(stateSelect=StateSelect.always), 
    n=rCL1_scaled - rCL2_scaled);
  ModelicaAdditions.MultiBody.Parts.FrameTranslation lower(r=rCL1_scaled);
  Utilities.Parts.Body frontBar(r=rUL1L2_scaled - rCL1_scaled);
  Utilities.Parts.Body rearBar(r=rCL2_scaled - rUL1L2_scaled, widthDirection
      =cross(rCL2_scaled - rUL1L2_scaled, {0,0,1}));
  
protected 
  ModelicaAdditions.MultiBody.Interfaces.Frame_b frame_ta1;
public 
  ModelicaAdditions.MultiBody.Interfaces.Frame_a frame_S;
  Utilities.Parts.Body steeringLever(r=rUL3_scaled - rUL1L2_scaled);
equation 
  connect(lower.frame_a, frame_C);
  connect(upper.frame_a, frame_C);
  connect(MacPherson.frame_b, upper.frame_b);
  connect(steeringJoint.frame_b, frame_S);
  connect(outerRod.frame_b, frame_U);
  connect(MacPherson.frame_pb, strut.frame_b);
  connect(springRod.frame_b, strut.frame_a);
  connect(frame_ta1, outerRod.frame_a);
  connect(U.frame_a, frame_ta1);
  connect(frame_ta1, steeringJoint.frame_ta);
  connect(MacPherson.frame_pa, steeringJoint.frame_a);
  connect(springRod.frame_a, frame_ta1);
  connect(rearBar.frame_a, frontBar.frame_b);
  connect(innerJoint.frame_b, frontBar.frame_a);
  connect(lower.frame_b, innerJoint.frame_a);
  connect(frontBar.frame_b, MacPherson.frame_a);
  connect(steeringJoint.frame_c, steeringRod.frame_a);
  connect(frame_L12, frontBar.frame_b);
  connect(steeringLever.frame_a, steeringJoint.frame_ta);
end MacPherson2;

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