Name | Description |
---|---|
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 |
This component contains the visual information of a BMW 3 series sedan.
Name | Default | Description |
---|---|---|
rcmB[3] | data.rcmB | Vector from frame_a to center of mass, resolved in frame_a [m] |
mB | data.mB | Mass of body [kg] |
i11B | data.i11B | (1,1) element of inertia tensor [kg.m2] |
i22B | data.i22B | (2,2) element of inertia tensor [kg.m2] |
i33B | data.i33B | (3,3) element of inertia tensor [kg.m2] |
i21B | data.i21B | (2,1) element of inertia tensor [kg.m2] |
i31B | data.i31B | (3,1) element of inertia tensor [kg.m2] |
i32B | data.i32B | (3,2) element of inertia tensor [kg.m2] |
shape | data.shape | Name of shape |
r0[3] | data.r0 | Vector from frame_a to shape origin. resolved in frame_a [m] |
lengthDirection[3] | data.lengthDirection | Vector in length direction, resolved in frame_a [m] |
widthDirection[3] | data.widthDirection | Vector in width direction, resolved in frame_a [m] |
length | data.length | length of shape [m] |
width | data.width | width of shape|Shape| [m] |
height | data.height | height of shape|Shape| [m] |
material[4] | data.material | Color and specular coefficient |
extra | data.extra | Additional parameter for cone and pipe |
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;
This component contains the visual information of a BMW 3 series sedan.
Name | Default | Description |
---|---|---|
rcmB[3] | data.rcmB | Vector from frame_a to center of mass, resolved in frame_a [m] |
mB | data.mB | Mass of body [kg] |
i11B | data.i11B | (1,1) element of inertia tensor [kg.m2] |
i22B | data.i22B | (2,2) element of inertia tensor [kg.m2] |
i33B | data.i33B | (3,3) element of inertia tensor [kg.m2] |
i21B | data.i21B | (2,1) element of inertia tensor [kg.m2] |
i31B | data.i31B | (3,1) element of inertia tensor [kg.m2] |
i32B | data.i32B | (3,2) element of inertia tensor [kg.m2] |
shape | data.shape | Name of shape |
r0[3] | data.r0 | Vector from frame_a to shape origin. resolved in frame_a [m] |
lengthDirection[3] | data.lengthDirection | Vector in length direction, resolved in frame_a [m] |
widthDirection[3] | data.widthDirection | Vector in width direction, resolved in frame_a [m] |
length | data.length | length of shape [m] |
width | data.width | width of shape|Shape| [m] |
height | data.height | height of shape|Shape| [m] |
material[4] | data.material | Color and specular coefficient |
extra | data.extra | Additional parameter for cone and pipe |
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;
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.
Name | Default | Description |
---|---|---|
wheelbase | 2.55 | Distance from front to rear axis |
trackwidth | 1.6 | Distance between the front wheels |
ratio | 1 | Gear ratio to be used to compensate for the ratio in a steering linkage, should be angle on steering wheel/steer angle |
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;
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!
Name | Default | Description |
---|---|---|
rUW[3] | {0.0,0.9,0} | [m] |
rCU[3] | {0.0,0.85,0} | [m] |
q0Strut | 0.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] |
mU | 1 | [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 |
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;
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!
Name | Default | Description |
---|---|---|
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] |
iSW | 0.2 | Steering inertia [kg.m2] |
ratioWheelToRack | 22 | rotatational to translational ratio [m/rad] |
data_R |
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;
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!
Name | Default | Description |
---|---|---|
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] |
q0S | 0.05 | Unstretched additional spring length of the strut, compared to the construction geometry [m] |
rCMU[3] | {0,0,0} | [m] |
mU | 0 | [kg] |
i11U | 0 | [kg.m2] |
i22U | 0 | [kg.m2] |
i33U | 0 | [kg.m2] |
i21U | 0 | [kg.m2] |
i31U | 0 | [kg.m2] |
i32U | 0 | [kg.m2] |
rCML1L2[3] | {0,0,0} | [m] |
mL1L2 | 0 | [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] |
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;
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!
Name | Default | Description |
---|---|---|
r2t | 1/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 |
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;
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!
Name | Default | Description |
---|---|---|
scaleFactor[3] | {1,1,1} | |
rA[3] | {.0,-.05,0.05} | [m] |
rB[3] | {0.1,0.1,.3} | [m] |
s0 | 0 | Unstreched strut length |
data |
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;
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
Name | Default | Description |
---|---|---|
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] |
mU | 1 | [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] |
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;
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!
Name | Default | Description |
---|---|---|
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] |
mU | 1 | [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 |
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;
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!
Name | Default | Description |
---|---|---|
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] |
q0S | 0.05 | Unstretched additional spring length of the strut, compared to the construction geometry [m] |
rCMU[3] | {0,0,0} | [m] |
mU | 1 | [kg] |
i11U | 0.1 | [kg.m2] |
i22U | 0.1 | [kg.m2] |
i33U | 0.1 | [kg.m2] |
i21U | 0 | [kg.m2] |
i31U | 0 | [kg.m2] |
i32U | 0 | [kg.m2] |
rCML1L2[3] | {0,0,0} | [m] |
mL1L2 | 1 | [kg] |
i11L1L2 | 0.1 | [kg.m2] |
i22L1L2 | 0.1 | [kg.m2] |
i33L1L2 | 0.1 | [kg.m2] |
i21L1L2 | 0 | [kg.m2] |
i31L1L2 | 0 | [kg.m2] |
i32L1L2 | 0 | [kg.m2] |
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;
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!
Name | Default | Description |
---|---|---|
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] |
mU | 1 | [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 |
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;
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!
Name | Default | Description |
---|---|---|
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] |
mU | 0 | [kg] |
i11U | 0 | [kg.m2] |
i22U | 0 | [kg.m2] |
i33U | 0 | [kg.m2] |
i21U | 0 | [kg.m2] |
i31U | 0 | [kg.m2] |
i32U | 0 | [kg.m2] |
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;
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!
Name | Default | Description |
---|---|---|
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] |
ratioWheelToRack | 22 | rotatational to translational ratio [m/rad] |
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;
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!
Name | Default | Description |
---|---|---|
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} | |
q0S | 0.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) |
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;
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.
Name | Default | Description |
---|---|---|
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_1 | 0.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_2 | q0S_1 |
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;
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!
Name | Default | Description |
---|---|---|
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 |
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;
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.
Name | Default | Description |
---|---|---|
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] |
mU | 1 | [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] |
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;
Name | Default | Description |
---|---|---|
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] |
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;
Name | Default | Description |
---|---|---|
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] |
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;
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.
Name | Default | Description |
---|---|---|
rA[3] | data.rA | vector from frame_A to bushing centre [m] |
rB[3] | data.rB | vector from frame_B to bushing centre [m] |
nx[3] | data.nx | x direction of bushing, resolved in frame_A |
ny[3] | data.ny | y direction of bushing, resolved in frame_A |
r_rela0[3] | data.r_rela0 | Unstretched translational spring vector [m] |
r_min[3] | data.r_min | vector to bump stop from reference point in negative direction, resolved in frame_A [m] |
r_max[3] | data.r_max | vector to bump stop from reference point in positive direction, resolved in frame_A [m] |
phi_rela0[3] | data.phi_rela0 | Unstretched rotational spring vector [rad] |
phi_min[3] | data.phi_min | rotational vector to bump stop from reference point in negative direction, resolved in frame_A [rad] |
phi_max[3] | data.phi_max | rotational vector to bump stop from reference point in positive direction, resolved in frame_A [rad] |
bumpFactor | data.bumpFactor | scaleFactor of spring force at after bump |
C[6, 6] | data.C | Stiffness matrix |
D[6, 6] | data.D | Damping matrix |
linear | data.linear | turn on/off linearisation of cosine and sine in rotation vector equation |
eps | data.eps | Guard against division by zero |
data |
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;
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.
Name | Default | Description |
---|---|---|
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.nx | x direction of bushing, resolved in frame_A |
ny1[3] | data1.ny | y direction of bushing, resolved in frame_A |
r_rela01[3] | data1.r_rela0 | Unstretched translational spring vector [m] |
r_min1[3] | data1.r_min | vector to bump stop from reference point in negative direction, resolved in frame_A [m] |
r_max1[3] | data1.r_max | vector to bump stop from reference point in positive direction, resolved in frame_A [m] |
phi_rela01[3] | data1.phi_rela0 | Unstretched rotational spring vector [rad] |
phi_min1[3] | data1.phi_min | rotational vector to bump stop from reference point in negative direction, resolved in frame_A [rad] |
phi_max1[3] | data1.phi_max | rotational vector to bump stop from reference point in positive direction, resolved in frame_A [rad] |
bumpFactor1 | data1.bumpFactor | scaleFactor of spring force at after bump |
C1[6, 6] | data1.C | Stiffness matrix |
D1[6, 6] | data1.D | Damping matrix |
linear1 | data1.linear | turn on/off linearisation of cosine and sine in rotation vector equation |
eps1 | data1.eps | Guard against division by zero |
ny2[3] | data2.ny | y direction of bushing, resolved in frame_A |
r_rela02[3] | data2.r_rela0 | Unstretched translational spring vector [m] |
r_min2[3] | data2.r_min | vector to bump stop from reference point in negative direction, resolved in frame_A [m] |
r_max2[3] | data2.r_max | vector to bump stop from reference point in positive direction, resolved in frame_A [m] |
phi_rela02[3] | data2.phi_rela0 | Unstretched rotational spring vector [rad] |
phi_min2[3] | data2.phi_min | rotational vector to bump stop from reference point in negative direction, resolved in frame_A [rad] |
phi_max2[3] | data2.phi_max | rotational vector to bump stop from reference point in positive direction, resolved in frame_A [rad] |
bumpFactor2 | data2.bumpFactor | scaleFactor of spring force at after bump |
C2[6, 6] | data2.C | Stiffness matrix |
D2[6, 6] | data2.D | Damping matrix |
linear2 | data2.linear | turn on/off linearisation of cosine and sine in rotation vector equation |
eps2 | data2.eps | Guard against division by zero |
data2 | ||
data1 |
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;
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.
Name | Default | Description |
---|---|---|
rA[3] | data.rA | vector from frame_A to bushing centre [m] |
rB[3] | data.rB | vector from frame_B to bushing centre [m] |
nx[3] | data.nx | x direction of bushing, resolved in frame_A |
ny[3] | data.ny | y direction of bushing, resolved in frame_A |
r_rela0[3] | data.r_rela0 | Unstretched translational spring vector [m] |
r_min[3] | data.r_min | vector to bump stop from reference point in negative direction, resolved in frame_A [m] |
r_max[3] | data.r_max | vector to bump stop from reference point in positive direction, resolved in frame_A [m] |
phi_rela0[3] | data.phi_rela0 | Unstretched rotational spring vector [rad] |
phi_min[3] | data.phi_min | rotational vector to bump stop from reference point in negative direction, resolved in frame_A [rad] |
phi_max[3] | data.phi_max | rotational vector to bump stop from reference point in positive direction, resolved in frame_A [rad] |
bumpFactor | data.bumpFactor | scaleFactor of spring force at after bump |
C[6, 6] | data.C | Stiffness matrix |
D[6, 6] | data.D | Damping matrix |
linear | data.linear | turn on/off linearisation of cosine and sine in rotation vector equation |
eps | data.eps | Guard against division by zero |
data |
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;
Name | Default | Description |
---|---|---|
kinematicConstraint | true | = 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] |
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;
Name | Default | Description |
---|---|---|
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] |
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;
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!
Name | Default | Description |
---|---|---|
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 |
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;
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!
Name | Default | Description |
---|---|---|
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 |
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;
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!
Name | Default | Description |
---|---|---|
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] |
q0S | 0.05 | Unstretched additional spring length of the strut, compared to the construction geometry [m] |
rCMU[3] | {0,0,0} | [m] |
mU | 0 | [kg] |
i11U | 0 | [kg.m2] |
i22U | 0 | [kg.m2] |
i33U | 0 | [kg.m2] |
i21U | 0 | [kg.m2] |
i31U | 0 | [kg.m2] |
i32U | 0 | [kg.m2] |
rCML1L2[3] | {0,0,0} | [m] |
mL1L2 | 0 | [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] |
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;