ActiveSuspension
IconActiveSuspension
Usage
ActiveSuspension(wheel_mass=25, wheel_stiffness=1e2, wheel_damping=1e4, car_mass=1000, suspension_stiffness=1e4, suspension_damping=10, human_and_seat_mass=100, seat_stiffness=1000, seat_damping=1, wheel_initial_position=0.5, suspension_initial_position=1, seat_initial_position=1.5, Kp=20, Ti=5, Td=1)
Parameters:
Name | Description | Units | Default value |
---|---|---|---|
wheel_mass | kg | 25 | |
wheel_stiffness | N/m | 100 | |
wheel_damping | s-1 | 10000 | |
car_mass | kg | 1000 | |
suspension_stiffness | N/m | 10000 | |
suspension_damping | s-1 | 10 | |
human_and_seat_mass | kg | 100 | |
seat_stiffness | N/m | 1000 | |
seat_damping | s-1 | 1 | |
wheel_initial_position | m | 0.5 | |
suspension_initial_position | m | 1 | |
seat_initial_position | m | 1.5 | |
Kp | – | 20 | |
Ti | – | 5 | |
Td | – | 1 |
Behavior
\[ \begin{equation} \left[ \begin{array}{c} \mathtt{pid.u\_ff}\left( t \right) = 0 \\ AnalysisPoint\left( \mathtt{pid.y}\left( t \right), u, \left[ \begin{array}{c} \mathtt{force.f}\left( t \right) \\ \end{array} \right] \right) \\ AnalysisPoint\left( \mathtt{seat\_pos.s}\left( t \right), y, \left[ \begin{array}{c} \mathtt{pid.u\_m}\left( t \right) \\ \end{array} \right] \right) \\ \mathtt{road.s}\left( t \right) = \mathtt{road\_data.y}\left( t \right) \\ \mathrm{connect}\left( road_{+}flange, wheel_{+}flange_{sd} \right) \\ \mathrm{connect}\left( wheel_{+}flange_{m}, car_{and\_suspension_{+}flange\_sd} \right) \\ \mathrm{connect}\left( car_{and\_suspension_{+}flange\_m}, seat_{+}flange_{sd}, force_{+}flange_{a} \right) \\ \mathrm{connect}\left( seat_{+}flange_{m}, force_{+}flange_{b}, seat_{pos_{+}flange} \right) \\ \mathtt{pid.u\_s}\left( t \right) = \mathtt{set\_point.y}\left( t \right) \\ \mathrm{connect}\left( pid_{+}y(t), force_{+}f(t) \right) \\ \mathrm{connect}\left( seat_{pos_{+}s(t)}, pid_{+}u_{m(t)} \right) \\ \mathrm{connect}\left( flange_{m}, mass_{+}flange_{b}, spring_{damper_{+}flange\_a} \right) \\ \mathrm{connect}\left( spring_{damper_{+}flange\_b}, flange_{sd} \right) \\ \mathtt{wheel.mass.flange\_a.s}\left( t \right) = - \frac{1}{2} \mathtt{wheel.mass.L} + \mathtt{wheel.mass.s}\left( t \right) \\ \mathtt{wheel.mass.flange\_b.s}\left( t \right) = \frac{1}{2} \mathtt{wheel.mass.L} + \mathtt{wheel.mass.s}\left( t \right) \\ \mathtt{wheel.mass.v}\left( t \right) = \frac{\mathrm{d} \mathtt{wheel.mass.s}\left( t \right)}{\mathrm{d}t} \\ \mathtt{wheel.mass.a}\left( t \right) = \frac{\mathrm{d} \mathtt{wheel.mass.v}\left( t \right)}{\mathrm{d}t} \\ \left( \mathtt{wheel.mass.a}\left( t \right) + \mathtt{wheel.mass.g} \sin\left( \mathtt{wheel.mass.theta} \right) \right) \mathtt{wheel.mass.m} = \mathtt{wheel.mass.flange\_b.f}\left( t \right) + \mathtt{wheel.mass.flange\_a.f}\left( t \right) \\ \mathtt{wheel.spring\_damper.s\_rel}\left( t \right) = \mathtt{wheel.spring\_damper.flange\_b.s}\left( t \right) - \mathtt{wheel.spring\_damper.flange\_a.s}\left( t \right) \\ \mathtt{wheel.spring\_damper.v\_rel}\left( t \right) = \frac{\mathrm{d} \mathtt{wheel.spring\_damper.s\_rel}\left( t \right)}{\mathrm{d}t} \\ \mathtt{wheel.spring\_damper.flange\_b.f}\left( t \right) = \mathtt{wheel.spring\_damper.f}\left( t \right) \\ \mathtt{wheel.spring\_damper.flange\_a.f}\left( t \right) = - \mathtt{wheel.spring\_damper.f}\left( t \right) \\ \mathtt{wheel.spring\_damper.f\_c}\left( t \right) = \mathtt{wheel.spring\_damper.c} \left( - \mathtt{wheel.spring\_damper.s\_rel0} + \mathtt{wheel.spring\_damper.s\_rel}\left( t \right) \right) \\ \mathtt{wheel.spring\_damper.f\_d}\left( t \right) = \mathtt{wheel.spring\_damper.d} \mathtt{wheel.spring\_damper.v\_rel}\left( t \right) \\ \mathtt{wheel.spring\_damper.f}\left( t \right) = \mathtt{wheel.spring\_damper.f\_c}\left( t \right) + \mathtt{wheel.spring\_damper.f\_d}\left( t \right) \\ \mathtt{wheel.spring\_damper.lossPower}\left( t \right) = \mathtt{wheel.spring\_damper.f\_d}\left( t \right) \mathtt{wheel.spring\_damper.v\_rel}\left( t \right) \\ \mathrm{connect}\left( flange_{m}, mass_{+}flange_{b}, spring_{damper_{+}flange\_a} \right) \\ \mathrm{connect}\left( spring_{damper_{+}flange\_b}, flange_{sd} \right) \\ \mathtt{car\_and\_suspension.mass.flange\_a.s}\left( t \right) = - \frac{1}{2} \mathtt{car\_and\_suspension.mass.L} + \mathtt{car\_and\_suspension.mass.s}\left( t \right) \\ \mathtt{car\_and\_suspension.mass.flange\_b.s}\left( t \right) = \frac{1}{2} \mathtt{car\_and\_suspension.mass.L} + \mathtt{car\_and\_suspension.mass.s}\left( t \right) \\ \mathtt{car\_and\_suspension.mass.v}\left( t \right) = \frac{\mathrm{d} \mathtt{car\_and\_suspension.mass.s}\left( t \right)}{\mathrm{d}t} \\ \mathtt{car\_and\_suspension.mass.a}\left( t \right) = \frac{\mathrm{d} \mathtt{car\_and\_suspension.mass.v}\left( t \right)}{\mathrm{d}t} \\ \left( \mathtt{car\_and\_suspension.mass.a}\left( t \right) + \mathtt{car\_and\_suspension.mass.g} \sin\left( \mathtt{car\_and\_suspension.mass.theta} \right) \right) \mathtt{car\_and\_suspension.mass.m} = \mathtt{car\_and\_suspension.mass.flange\_a.f}\left( t \right) + \mathtt{car\_and\_suspension.mass.flange\_b.f}\left( t \right) \\ \mathtt{car\_and\_suspension.spring\_damper.s\_rel}\left( t \right) = \mathtt{car\_and\_suspension.spring\_damper.flange\_b.s}\left( t \right) - \mathtt{car\_and\_suspension.spring\_damper.flange\_a.s}\left( t \right) \\ \mathtt{car\_and\_suspension.spring\_damper.v\_rel}\left( t \right) = \frac{\mathrm{d} \mathtt{car\_and\_suspension.spring\_damper.s\_rel}\left( t \right)}{\mathrm{d}t} \\ \mathtt{car\_and\_suspension.spring\_damper.flange\_b.f}\left( t \right) = \mathtt{car\_and\_suspension.spring\_damper.f}\left( t \right) \\ \mathtt{car\_and\_suspension.spring\_damper.flange\_a.f}\left( t \right) = - \mathtt{car\_and\_suspension.spring\_damper.f}\left( t \right) \\ \mathtt{car\_and\_suspension.spring\_damper.f\_c}\left( t \right) = \mathtt{car\_and\_suspension.spring\_damper.c} \left( - \mathtt{car\_and\_suspension.spring\_damper.s\_rel0} + \mathtt{car\_and\_suspension.spring\_damper.s\_rel}\left( t \right) \right) \\ \mathtt{car\_and\_suspension.spring\_damper.f\_d}\left( t \right) = \mathtt{car\_and\_suspension.spring\_damper.d} \mathtt{car\_and\_suspension.spring\_damper.v\_rel}\left( t \right) \\ \mathtt{car\_and\_suspension.spring\_damper.f}\left( t \right) = \mathtt{car\_and\_suspension.spring\_damper.f\_d}\left( t \right) + \mathtt{car\_and\_suspension.spring\_damper.f\_c}\left( t \right) \\ \mathtt{car\_and\_suspension.spring\_damper.lossPower}\left( t \right) = \mathtt{car\_and\_suspension.spring\_damper.v\_rel}\left( t \right) \mathtt{car\_and\_suspension.spring\_damper.f\_d}\left( t \right) \\ \mathrm{connect}\left( flange_{m}, mass_{+}flange_{b}, spring_{damper_{+}flange\_a} \right) \\ \mathrm{connect}\left( spring_{damper_{+}flange\_b}, flange_{sd} \right) \\ \mathtt{seat.mass.flange\_a.s}\left( t \right) = - \frac{1}{2} \mathtt{seat.mass.L} + \mathtt{seat.mass.s}\left( t \right) \\ \mathtt{seat.mass.flange\_b.s}\left( t \right) = \frac{1}{2} \mathtt{seat.mass.L} + \mathtt{seat.mass.s}\left( t \right) \\ \mathtt{seat.mass.v}\left( t \right) = \frac{\mathrm{d} \mathtt{seat.mass.s}\left( t \right)}{\mathrm{d}t} \\ \mathtt{seat.mass.a}\left( t \right) = \frac{\mathrm{d} \mathtt{seat.mass.v}\left( t \right)}{\mathrm{d}t} \\ \left( \mathtt{seat.mass.a}\left( t \right) + \mathtt{seat.mass.g} \sin\left( \mathtt{seat.mass.theta} \right) \right) \mathtt{seat.mass.m} = \mathtt{seat.mass.flange\_b.f}\left( t \right) + \mathtt{seat.mass.flange\_a.f}\left( t \right) \\ \mathtt{seat.spring\_damper.s\_rel}\left( t \right) = \mathtt{seat.spring\_damper.flange\_b.s}\left( t \right) - \mathtt{seat.spring\_damper.flange\_a.s}\left( t \right) \\ \mathtt{seat.spring\_damper.v\_rel}\left( t \right) = \frac{\mathrm{d} \mathtt{seat.spring\_damper.s\_rel}\left( t \right)}{\mathrm{d}t} \\ \mathtt{seat.spring\_damper.flange\_b.f}\left( t \right) = \mathtt{seat.spring\_damper.f}\left( t \right) \\ \mathtt{seat.spring\_damper.flange\_a.f}\left( t \right) = - \mathtt{seat.spring\_damper.f}\left( t \right) \\ \mathtt{seat.spring\_damper.f\_c}\left( t \right) = \mathtt{seat.spring\_damper.c} \left( - \mathtt{seat.spring\_damper.s\_rel0} + \mathtt{seat.spring\_damper.s\_rel}\left( t \right) \right) \\ \mathtt{seat.spring\_damper.f\_d}\left( t \right) = \mathtt{seat.spring\_damper.d} \mathtt{seat.spring\_damper.v\_rel}\left( t \right) \\ \mathtt{seat.spring\_damper.f}\left( t \right) = \mathtt{seat.spring\_damper.f\_d}\left( t \right) + \mathtt{seat.spring\_damper.f\_c}\left( t \right) \\ \mathtt{seat.spring\_damper.lossPower}\left( t \right) = \mathtt{seat.spring\_damper.f\_d}\left( t \right) \mathtt{seat.spring\_damper.v\_rel}\left( t \right) \\ \mathtt{road\_data.y}\left( t \right) = ifelse\left( rem\left( t, \mathtt{road\_data.loop} \right) < \mathtt{road\_data.offset}, 0, ifelse\left( - \mathtt{road\_data.offset} + rem\left( t, \mathtt{road\_data.loop} \right) > \mathtt{road\_data.freq}, 0, \mathtt{road\_data.bump} \left( 1 - \cos\left( \frac{6.2832 \left( - \mathtt{road\_data.offset} + t \right)}{\mathtt{road\_data.freq}} \right) \right) \right) \right) \\ \mathtt{road.v}\left( t \right) = \frac{\mathrm{d} \mathtt{road.s}\left( t \right)}{\mathrm{d}t} \\ \mathtt{road.a}\left( t \right) = \frac{\mathrm{d} \mathtt{road.v}\left( t \right)}{\mathrm{d}t} \\ \mathtt{road.flange.s}\left( t \right) = \mathtt{road.s}\left( t \right) \\ \mathtt{force.flange\_a.f}\left( t \right) = \mathtt{force.f}\left( t \right) \\ \mathtt{force.flange\_b.f}\left( t \right) = - \mathtt{force.f}\left( t \right) \\ \mathtt{pid.u\_s}\left( t \right) = \mathtt{pid.add\_p.u1}\left( t \right) \\ \mathtt{pid.u\_s}\left( t \right) = \mathtt{pid.add\_i.u1}\left( t \right) \\ \mathtt{pid.u\_s}\left( t \right) = \mathtt{pid.add\_d.u1}\left( t \right) \\ \mathtt{pid.u\_m}\left( t \right) = \mathtt{pid.add\_p.u2}\left( t \right) \\ \mathtt{pid.u\_m}\left( t \right) = \mathtt{pid.add\_i.u2}\left( t \right) \\ \mathtt{pid.u\_m}\left( t \right) = \mathtt{pid.add\_d.u2}\left( t \right) \\ \mathtt{pid.u\_ff}\left( t \right) = \mathtt{pid.add\_ff.u2}\left( t \right) \\ \mathtt{pid.y}\left( t \right) = \mathtt{pid.limiter.y}\left( t \right) \\ \mathtt{pid.add\_p.y}\left( t \right) = \mathtt{pid.proportional.u}\left( t \right) \\ \mathtt{pid.add\_d.y}\left( t \right) = \mathtt{pid.derivative.u}\left( t \right) \\ \mathtt{pid.add\_i.y}\left( t \right) = \mathtt{pid.integrator.u}\left( t \right) \\ \mathtt{pid.proportional.y}\left( t \right) = \mathtt{pid.add\_pid.u1}\left( t \right) \\ \mathtt{pid.derivative.y}\left( t \right) = \mathtt{pid.add\_pid.u2}\left( t \right) \\ \mathtt{pid.integrator.y}\left( t \right) = \mathtt{pid.add\_pid.u3}\left( t \right) \\ \mathtt{pid.add\_pid.y}\left( t \right) = \mathtt{pid.gain\_pid.u}\left( t \right) \\ \mathtt{pid.gain\_pid.y}\left( t \right) = \mathtt{pid.add\_ff.u1}\left( t \right) \\ \mathtt{pid.add\_ff.y}\left( t \right) = \mathtt{pid.add\_sat.u2}\left( t \right) \\ \mathtt{pid.add\_ff.y}\left( t \right) = \mathtt{pid.limiter.u}\left( t \right) \\ \mathtt{pid.limiter.y}\left( t \right) = \mathtt{pid.add\_sat.u1}\left( t \right) \\ \mathtt{pid.add\_sat.y}\left( t \right) = \mathtt{pid.gain\_track.u}\left( t \right) \\ \mathtt{pid.gain\_track.y}\left( t \right) = \mathtt{pid.add\_i.u3}\left( t \right) \\ \mathtt{pid.add\_p.y}\left( t \right) = \mathtt{pid.add\_p.k1} \mathtt{pid.add\_p.u1}\left( t \right) + \mathtt{pid.add\_p.k2} \mathtt{pid.add\_p.u2}\left( t \right) \\ \mathtt{pid.add\_d.y}\left( t \right) = \mathtt{pid.add\_d.k1} \mathtt{pid.add\_d.u1}\left( t \right) + \mathtt{pid.add\_d.k2} \mathtt{pid.add\_d.u2}\left( t \right) \\ \mathtt{pid.add\_i.y}\left( t \right) = \mathtt{pid.add\_i.k1} \mathtt{pid.add\_i.u1}\left( t \right) + \mathtt{pid.add\_i.k2} \mathtt{pid.add\_i.u2}\left( t \right) + \mathtt{pid.add\_i.k3} \mathtt{pid.add\_i.u3}\left( t \right) \\ \mathtt{pid.proportional.y}\left( t \right) = \mathtt{pid.proportional.k} \mathtt{pid.proportional.u}\left( t \right) \\ \frac{\mathrm{d} \mathtt{pid.derivative.x}\left( t \right)}{\mathrm{d}t} = \frac{\mathtt{pid.derivative.u}\left( t \right) - \mathtt{pid.derivative.x}\left( t \right)}{\mathtt{pid.derivative.T}} \\ \mathtt{pid.derivative.y}\left( t \right) = \frac{\mathtt{pid.derivative.k} \left( \mathtt{pid.derivative.u}\left( t \right) - \mathtt{pid.derivative.x}\left( t \right) \right)}{\mathtt{pid.derivative.T}} \\ \frac{\mathrm{d} \mathtt{pid.integrator.x}\left( t \right)}{\mathrm{d}t} = \mathtt{pid.integrator.k} \mathtt{pid.integrator.u}\left( t \right) \\ \mathtt{pid.integrator.y}\left( t \right) = \mathtt{pid.integrator.x}\left( t \right) \\ \mathtt{pid.add\_pid.y}\left( t \right) = \mathtt{pid.add\_pid.k1} \mathtt{pid.add\_pid.u1}\left( t \right) + \mathtt{pid.add\_pid.k2} \mathtt{pid.add\_pid.u2}\left( t \right) + \mathtt{pid.add\_pid.k3} \mathtt{pid.add\_pid.u3}\left( t \right) \\ \mathtt{pid.gain\_pid.y}\left( t \right) = \mathtt{pid.gain\_pid.k} \mathtt{pid.gain\_pid.u}\left( t \right) \\ \mathtt{pid.add\_ff.y}\left( t \right) = \mathtt{pid.add\_ff.k1} \mathtt{pid.add\_ff.u1}\left( t \right) + \mathtt{pid.add\_ff.k2} \mathtt{pid.add\_ff.u2}\left( t \right) \\ \mathtt{pid.limiter.y}\left( t \right) = clamp\left( \mathtt{pid.limiter.u}\left( t \right), \mathtt{pid.limiter.y\_min}, \mathtt{pid.limiter.y\_max} \right) \\ \mathtt{pid.add\_sat.y}\left( t \right) = \mathtt{pid.add\_sat.k1} \mathtt{pid.add\_sat.u1}\left( t \right) + \mathtt{pid.add\_sat.k2} \mathtt{pid.add\_sat.u2}\left( t \right) \\ \mathtt{pid.gain\_track.y}\left( t \right) = \mathtt{pid.gain\_track.k} \mathtt{pid.gain\_track.u}\left( t \right) \\ \mathtt{set\_point.y}\left( t \right) = \mathtt{set\_point.k} \\ 0 = \mathtt{seat\_pos.flange.f}\left( t \right) \\ \mathtt{seat\_pos.flange.s}\left( t \right) = \mathtt{seat\_pos.s}\left( t \right) \\ \end{array} \right] \end{equation} \]
Source
component ActiveSuspension
wheel = MassSpringDamper(m = wheel_mass, d = wheel_damping, c = wheel_stiffness, g = -10, theta = pi / 2, s0 = wheel_initial_position) [{
"Dyad": {"placement": {"icon": {"x1": 825, "y1": 675, "x2": 925, "y2": 775, "rot": 90}}}
}]
car_and_suspension = MassSpringDamper(m = car_mass, d = suspension_damping, c = suspension_stiffness, g = -10, theta = pi / 2, s0 = suspension_initial_position) [{
"Dyad": {"placement": {"icon": {"x1": 825, "y1": 500, "x2": 925, "y2": 600, "rot": 90}}}
}]
seat = MassSpringDamper(m = human_and_seat_mass, d = seat_damping, c = seat_stiffness, g = -10, theta = pi / 2, s0 = seat_initial_position) [{
"Dyad": {"placement": {"icon": {"x1": 825, "y1": 325, "x2": 925, "y2": 425, "rot": 90}}}
}]
road_data = RoadData() [{"Dyad": {"placement": {"icon": {"x1": 500, "y1": 730, "x2": 600, "y2": 830}}}}]
road = SimplePosition() [{"Dyad": {"placement": {"icon": {"x1": 650, "y1": 730, "x2": 750, "y2": 830}}}}]
force = TranslationalComponents.Force() [{
"Dyad": {
"placement": {"icon": {"x1": 650, "y1": 325, "x2": 750, "y2": 425, "rot": 270}}
}
}]
pid = BlockComponents.LimPID(k = Kp, Ti = Ti, Td = Td) [{
"Dyad": {
"placement": {
"icon": {"x1": 350, "y1": 340, "x2": 450, "y2": 435, "iconName": "default", "rot": 0},
"diagram": {"x1": 420, "y1": 410, "x2": 520, "y2": 315, "iconName": "default", "rot": 720}
}
}
}]
set_point = BlockComponents.Constant(k = 1.5) [{
"Dyad": {
"placement": {
"icon": {"x1": 50, "y1": 325, "x2": 150, "y2": 425, "iconName": "default", "rot": 0},
"diagram": {"x1": 210, "y1": 330, "x2": 310, "y2": 430, "iconName": "default", "rot": 0}
}
}
}]
seat_pos = TranslationalComponents.PositionSensor() [{
"Dyad": {
"placement": {"icon": {"x1": 700, "y1": 150, "x2": 800, "y2": 250, "rot": 180}}
}
}]
parameter wheel_mass::Dyad.Mass = 25
parameter wheel_stiffness::TranslationalSpringConstant = 1e2
parameter wheel_damping::DampingCoefficient = 1e4
parameter car_mass::Dyad.Mass = 1000
parameter suspension_stiffness::TranslationalSpringConstant = 1e4
parameter suspension_damping::DampingCoefficient = 10
parameter human_and_seat_mass::Dyad.Mass = 100
parameter seat_stiffness::TranslationalSpringConstant = 1000
parameter seat_damping::DampingCoefficient = 1
parameter wheel_initial_position::Dyad.Position = 0.5
parameter suspension_initial_position::Dyad.Position = 1
parameter seat_initial_position::Dyad.Position = 1.5
parameter Kp::Real = 20
parameter Ti::Real = 5
parameter Td::Real = 1
relations
u: analysis_point(pid.y, force.f)
y: analysis_point(seat_pos.s, pid.u_m)
pid.u_ff = 0
connect(road.s, road_data.y) [{"Dyad": {"edges": [{"S": 2, "M": [], "E": 1}], "junctions": []}}]
connect(road.flange, wheel.flange_sd) [{"Dyad": {"edges": [{"S": 2, "M": [], "E": 1}], "junctions": []}}]
connect(wheel.flange_m, car_and_suspension.flange_sd) [{"Dyad": {"edges": [{"S": 2, "M": [], "E": 1}], "junctions": []}}]
connect(car_and_suspension.flange_m, seat.flange_sd, force.flange_a) [{
"Dyad": {
"edges": [
{"S": -1, "M": [], "E": 1},
{"S": -1, "M": [], "E": 2},
{"S": -1, "M": [{"x": 700, "y": 440}], "E": 3}
],
"junctions": [{"x": 875, "y": 440}]
}
}]
connect(seat.flange_m, force.flange_b, seat_pos.flange) [{
"Dyad": {
"edges": [
{"S": -1, "M": [], "E": 1},
{"S": -1, "M": [{"x": 700, "y": 310}], "E": 2},
{"S": -1, "M": [{"x": 880, "y": 200}], "E": 3}
],
"junctions": [{"x": 875, "y": 310}]
}
}]
connect(pid.u_s, set_point.y) [{"Dyad": {"edges": [{"S": 2, "M": [], "E": 1}], "junctions": []}}]
connect(pid.y, force.f) [{"Dyad": {"edges": [{"S": 2, "M": [], "E": 1}], "junctions": []}}]
#
connect(seat_pos.s, pid.u_m) [{
"Dyad": {"edges": [{"S": 2, "M": [{"x": 490, "y": 200}], "E": 1}], "junctions": []}
}]
metadata {
"Dyad": {
"tests": {
"case1": {
"stop": 10,
"expect": {
"signals": [
"wheel.mass.s",
"seat.mass.s",
"car_and_suspension.mass.s",
"wheel.mass.v",
"car_and_suspension.mass.v",
"seat.mass.v",
"pid.y"
]
}
}
}
}
}
end
Flattened Source
component ActiveSuspension
wheel = MassSpringDamper(m = wheel_mass, d = wheel_damping, c = wheel_stiffness, g = -10, theta = pi / 2, s0 = wheel_initial_position) [{
"Dyad": {"placement": {"icon": {"x1": 825, "y1": 675, "x2": 925, "y2": 775, "rot": 90}}}
}]
car_and_suspension = MassSpringDamper(m = car_mass, d = suspension_damping, c = suspension_stiffness, g = -10, theta = pi / 2, s0 = suspension_initial_position) [{
"Dyad": {"placement": {"icon": {"x1": 825, "y1": 500, "x2": 925, "y2": 600, "rot": 90}}}
}]
seat = MassSpringDamper(m = human_and_seat_mass, d = seat_damping, c = seat_stiffness, g = -10, theta = pi / 2, s0 = seat_initial_position) [{
"Dyad": {"placement": {"icon": {"x1": 825, "y1": 325, "x2": 925, "y2": 425, "rot": 90}}}
}]
road_data = RoadData() [{"Dyad": {"placement": {"icon": {"x1": 500, "y1": 730, "x2": 600, "y2": 830}}}}]
road = SimplePosition() [{"Dyad": {"placement": {"icon": {"x1": 650, "y1": 730, "x2": 750, "y2": 830}}}}]
force = TranslationalComponents.Force() [{
"Dyad": {
"placement": {"icon": {"x1": 650, "y1": 325, "x2": 750, "y2": 425, "rot": 270}}
}
}]
pid = BlockComponents.LimPID(k = Kp, Ti = Ti, Td = Td) [{
"Dyad": {
"placement": {
"icon": {"x1": 350, "y1": 340, "x2": 450, "y2": 435, "iconName": "default", "rot": 0},
"diagram": {"x1": 420, "y1": 410, "x2": 520, "y2": 315, "iconName": "default", "rot": 720}
}
}
}]
set_point = BlockComponents.Constant(k = 1.5) [{
"Dyad": {
"placement": {
"icon": {"x1": 50, "y1": 325, "x2": 150, "y2": 425, "iconName": "default", "rot": 0},
"diagram": {"x1": 210, "y1": 330, "x2": 310, "y2": 430, "iconName": "default", "rot": 0}
}
}
}]
seat_pos = TranslationalComponents.PositionSensor() [{
"Dyad": {
"placement": {"icon": {"x1": 700, "y1": 150, "x2": 800, "y2": 250, "rot": 180}}
}
}]
parameter wheel_mass::Dyad.Mass = 25
parameter wheel_stiffness::TranslationalSpringConstant = 1e2
parameter wheel_damping::DampingCoefficient = 1e4
parameter car_mass::Dyad.Mass = 1000
parameter suspension_stiffness::TranslationalSpringConstant = 1e4
parameter suspension_damping::DampingCoefficient = 10
parameter human_and_seat_mass::Dyad.Mass = 100
parameter seat_stiffness::TranslationalSpringConstant = 1000
parameter seat_damping::DampingCoefficient = 1
parameter wheel_initial_position::Dyad.Position = 0.5
parameter suspension_initial_position::Dyad.Position = 1
parameter seat_initial_position::Dyad.Position = 1.5
parameter Kp::Real = 20
parameter Ti::Real = 5
parameter Td::Real = 1
relations
u: analysis_point(pid.y, force.f)
y: analysis_point(seat_pos.s, pid.u_m)
pid.u_ff = 0
connect(road.s, road_data.y) [{"Dyad": {"edges": [{"S": 2, "M": [], "E": 1}], "junctions": []}}]
connect(road.flange, wheel.flange_sd) [{"Dyad": {"edges": [{"S": 2, "M": [], "E": 1}], "junctions": []}}]
connect(wheel.flange_m, car_and_suspension.flange_sd) [{"Dyad": {"edges": [{"S": 2, "M": [], "E": 1}], "junctions": []}}]
connect(car_and_suspension.flange_m, seat.flange_sd, force.flange_a) [{
"Dyad": {
"edges": [
{"S": -1, "M": [], "E": 1},
{"S": -1, "M": [], "E": 2},
{"S": -1, "M": [{"x": 700, "y": 440}], "E": 3}
],
"junctions": [{"x": 875, "y": 440}]
}
}]
connect(seat.flange_m, force.flange_b, seat_pos.flange) [{
"Dyad": {
"edges": [
{"S": -1, "M": [], "E": 1},
{"S": -1, "M": [{"x": 700, "y": 310}], "E": 2},
{"S": -1, "M": [{"x": 880, "y": 200}], "E": 3}
],
"junctions": [{"x": 875, "y": 310}]
}
}]
connect(pid.u_s, set_point.y) [{"Dyad": {"edges": [{"S": 2, "M": [], "E": 1}], "junctions": []}}]
connect(pid.y, force.f) [{"Dyad": {"edges": [{"S": 2, "M": [], "E": 1}], "junctions": []}}]
#
connect(seat_pos.s, pid.u_m) [{
"Dyad": {"edges": [{"S": 2, "M": [{"x": 490, "y": 200}], "E": 1}], "junctions": []}
}]
metadata {
"Dyad": {
"tests": {
"case1": {
"stop": 10,
"expect": {
"signals": [
"wheel.mass.s",
"seat.mass.s",
"car_and_suspension.mass.s",
"wheel.mass.v",
"car_and_suspension.mass.v",
"seat.mass.v",
"pid.y"
]
}
}
}
}
}
end
Test Cases
Test Case case1
plt
plt
plt
plt
plt
plt
plt
Related
- Examples
- Experiments
- Analyses