LIBRARY
examples.FourBar ​
Planar four-bar linkage closed with a RevolutePlanarLoopConstraint.
Five revolute joints form the loop; j4 is replaced with a RevolutePlanarLoopConstraint because the cut forces along the parallel joint axes cannot be uniquely computed. Two of the revolute joints are damped through rotational dampers on their axis splines. The first joint gets a small non-zero initial angle to start the motion.
Usage ​
MultibodyComponents.examples.FourBar()
Behavior ​
Source ​
dyad
"""
Planar four-bar linkage closed with a `RevolutePlanarLoopConstraint`.
Five revolute joints form the loop; `j4` is replaced with a
`RevolutePlanarLoopConstraint` because the cut forces along the parallel
joint axes cannot be uniquely computed. Two of the revolute joints are
damped through rotational dampers on their axis splines. The first joint
gets a small non-zero initial angle to start the motion.
"""
example component FourBar
world = MultibodyComponents.World(default_body_diameter = 0.06, axis_radius = 0.01) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 660, "y1": 190, "x2": 760, "y2": 290, "rot": 0}
},
"tags": []
}
}
j1 = MultibodyComponents.Revolute(phi(initial = 0.1)) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 810, "y1": 190, "x2": 910, "y2": 290, "rot": 0}
},
"tags": []
}
}
j2 = MultibodyComponents.Revolute() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 1080, "y1": 190, "x2": 1180, "y2": 290, "rot": 0}
},
"tags": []
}
}
j3 = MultibodyComponents.Revolute() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 35, "y1": 90, "x2": 135, "y2": 190, "rot": 0}
},
"tags": []
}
}
j4 = MultibodyComponents.RevolutePlanarLoopConstraint() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 285, "y1": 90, "x2": 385, "y2": 190, "rot": 0}
},
"tags": []
}
}
j5 = MultibodyComponents.Revolute() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 535, "y1": 90, "x2": 635, "y2": 190, "rot": 0}
},
"tags": []
}
}
b1 = MultibodyComponents.BodyShape(m = 1, r = [1.5, 0, 0]) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 940, "y1": 190, "x2": 1040, "y2": 290, "rot": 0}
},
"tags": []
}
}
b2 = MultibodyComponents.BodyShape(m = 1, r = [0, 1.5, 0]) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 1210, "y1": 190, "x2": 1310, "y2": 290, "rot": 0}
},
"tags": []
}
}
b3 = MultibodyComponents.BodyShape(m = 1, r = [-1.5, 0, 0]) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 160, "y1": 90, "x2": 260, "y2": 190, "rot": 0}
},
"tags": []
}
}
b4 = MultibodyComponents.BodyShape(m = 1, r = [0, -1.5, 0]) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 410, "y1": 90, "x2": 510, "y2": 190, "rot": 0}
},
"tags": []
}
}
damper1 = RotationalComponents.Components.Damper(d = 0.1) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 920, "y1": 80, "x2": 870, "y2": 120, "rot": 0}
},
"tags": []
}
}
damper2 = RotationalComponents.Components.Damper(d = 0.1) {
"Dyad": {
"placement": {
"diagram": {
"iconName": "default",
"x1": 1080,
"y1": 330,
"x2": 1120,
"y2": 370,
"rot": 180
}
},
"tags": []
}
}
relations
connect(world.frame_b, j1.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(j1.frame_b, b1.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(b1.frame_b, j2.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(j2.frame_b, b2.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(b2.frame_b, j3.frame_a) {
"Dyad": {
"edges": [
{
"S": 1,
"M": [
{"x": 1335, "y": 240},
{"x": 1335, "y": 470},
{"x": 20, "y": 470},
{"x": 20, "y": 140}
],
"E": 2
}
],
"renderStyle": "standard"
}
}
connect(j3.frame_b, b3.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(b3.frame_b, j4.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(j4.frame_b, b4.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(b4.frame_b, j5.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(j5.frame_b, world.frame_b) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 775, "y": 140}], "E": -1}, {"S": -1, "M": [], "E": 2}],
"junctions": [{"x": 775, "y": 240}],
"renderStyle": "standard"
}
}
connect(j1.axis, damper1.spline_a) {
"Dyad": {
"edges": [
{
"S": 1,
"M": [{"x": 860, "y": 200}, {"x": 1040, "y": 200}, {"x": 1040, "y": 100}],
"E": 2
}
],
"renderStyle": "standard"
}
}
connect(j1.support, damper1.spline_b) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 825, "y": 100}], "E": 2}],
"renderStyle": "standard"
}
}
connect(j2.axis, damper2.spline_a) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 1130, "y": 350}], "E": 2}],
"renderStyle": "standard"
}
}
connect(j2.support, damper2.spline_b) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 1060, "y": 240}, {"x": 1060, "y": 350}], "E": 2}],
"renderStyle": "standard"
}
}
endFlattened Source
dyad
"""
Planar four-bar linkage closed with a `RevolutePlanarLoopConstraint`.
Five revolute joints form the loop; `j4` is replaced with a
`RevolutePlanarLoopConstraint` because the cut forces along the parallel
joint axes cannot be uniquely computed. Two of the revolute joints are
damped through rotational dampers on their axis splines. The first joint
gets a small non-zero initial angle to start the motion.
"""
example component FourBar
world = MultibodyComponents.World(default_body_diameter = 0.06, axis_radius = 0.01) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 660, "y1": 190, "x2": 760, "y2": 290, "rot": 0}
},
"tags": []
}
}
j1 = MultibodyComponents.Revolute(phi(initial = 0.1)) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 810, "y1": 190, "x2": 910, "y2": 290, "rot": 0}
},
"tags": []
}
}
j2 = MultibodyComponents.Revolute() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 1080, "y1": 190, "x2": 1180, "y2": 290, "rot": 0}
},
"tags": []
}
}
j3 = MultibodyComponents.Revolute() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 35, "y1": 90, "x2": 135, "y2": 190, "rot": 0}
},
"tags": []
}
}
j4 = MultibodyComponents.RevolutePlanarLoopConstraint() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 285, "y1": 90, "x2": 385, "y2": 190, "rot": 0}
},
"tags": []
}
}
j5 = MultibodyComponents.Revolute() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 535, "y1": 90, "x2": 635, "y2": 190, "rot": 0}
},
"tags": []
}
}
b1 = MultibodyComponents.BodyShape(m = 1, r = [1.5, 0, 0]) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 940, "y1": 190, "x2": 1040, "y2": 290, "rot": 0}
},
"tags": []
}
}
b2 = MultibodyComponents.BodyShape(m = 1, r = [0, 1.5, 0]) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 1210, "y1": 190, "x2": 1310, "y2": 290, "rot": 0}
},
"tags": []
}
}
b3 = MultibodyComponents.BodyShape(m = 1, r = [-1.5, 0, 0]) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 160, "y1": 90, "x2": 260, "y2": 190, "rot": 0}
},
"tags": []
}
}
b4 = MultibodyComponents.BodyShape(m = 1, r = [0, -1.5, 0]) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 410, "y1": 90, "x2": 510, "y2": 190, "rot": 0}
},
"tags": []
}
}
damper1 = RotationalComponents.Components.Damper(d = 0.1) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 920, "y1": 80, "x2": 870, "y2": 120, "rot": 0}
},
"tags": []
}
}
damper2 = RotationalComponents.Components.Damper(d = 0.1) {
"Dyad": {
"placement": {
"diagram": {
"iconName": "default",
"x1": 1080,
"y1": 330,
"x2": 1120,
"y2": 370,
"rot": 180
}
},
"tags": []
}
}
relations
connect(world.frame_b, j1.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(j1.frame_b, b1.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(b1.frame_b, j2.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(j2.frame_b, b2.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(b2.frame_b, j3.frame_a) {
"Dyad": {
"edges": [
{
"S": 1,
"M": [
{"x": 1335, "y": 240},
{"x": 1335, "y": 470},
{"x": 20, "y": 470},
{"x": 20, "y": 140}
],
"E": 2
}
],
"renderStyle": "standard"
}
}
connect(j3.frame_b, b3.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(b3.frame_b, j4.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(j4.frame_b, b4.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(b4.frame_b, j5.frame_a) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
connect(j5.frame_b, world.frame_b) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 775, "y": 140}], "E": -1}, {"S": -1, "M": [], "E": 2}],
"junctions": [{"x": 775, "y": 240}],
"renderStyle": "standard"
}
}
connect(j1.axis, damper1.spline_a) {
"Dyad": {
"edges": [
{
"S": 1,
"M": [{"x": 860, "y": 200}, {"x": 1040, "y": 200}, {"x": 1040, "y": 100}],
"E": 2
}
],
"renderStyle": "standard"
}
}
connect(j1.support, damper1.spline_b) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 825, "y": 100}], "E": 2}],
"renderStyle": "standard"
}
}
connect(j2.axis, damper2.spline_a) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 1130, "y": 350}], "E": 2}],
"renderStyle": "standard"
}
}
connect(j2.support, damper2.spline_b) {
"Dyad": {
"edges": [{"S": 1, "M": [{"x": 1060, "y": 240}, {"x": 1060, "y": 350}], "E": 2}],
"renderStyle": "standard"
}
}
metadata {}
endTest Cases ​
No test cases defined.
Related ​
Examples
Experiments
Analyses