tests.CutMountTest
CutMount Test
The 4-bar planar linkage from RevolutePlanarLoopConstraintTest, with the loop-closing RevolutePlanarLoopConstraint replaced by a CutMount configured to the identical constraint set: in-plane translations (y, z) locked, the out-of-plane force (x, the revolute-axis direction) and all three torques released. The two models must build to the same structure and produce the same dynamics, which validates the CutMount constraint/balance equations and sign conventions against a known-good component.
Usage
MultibodyComponents.tests.CutMountTest(AB=146.5 / 1000, BC=233.84 / 1000, CD=228.60 / 1000, DA=221.43 / 1000, t5=19.84 * π / 180, n=[1, 0, 0], r_chassis=DA * [0, 0.2, 0.2 * sin(t5)] / norm_([0, 0.2, 0.2 * sin(t5)]), r_b1=CD * [0, -0.1, 0.3] / norm_([0, -0.1, 0.3]), r_b2=BC * [0, 0.2, 0] / norm_([0, 0.2, 0]), r_b3=AB * [0, -0.1, 0.2] / norm_([0, -0.1, 0.2]))
Parameters:
| Name | Description | Units | Default value |
|---|---|---|---|
AB | – | 146.5 / 1000 | |
BC | – | 233.84 / 1000 | |
CD | – | 228.60 / 1000 | |
DA | – | 221.43 / 1000 | |
t5 | rad | 19.84 * π / 180 | |
n | – | [1, 0, 0] |
Behavior
Source
"""
# CutMount Test
The 4-bar planar linkage from `RevolutePlanarLoopConstraintTest`, with the
loop-closing `RevolutePlanarLoopConstraint` replaced by a `CutMount` configured
to the identical constraint set: in-plane translations (y, z) locked, the
out-of-plane force (x, the revolute-axis direction) and all three torques
released. The two models must build to the same structure and produce the same
dynamics, which validates the CutMount constraint/balance equations and sign
conventions against a known-good component.
"""
example component CutMountTest
world = MultibodyComponents.World() {}
body_upright = MultibodyComponents.Prismatic(n = [0, 1, 0], render = false, s(initial = 0.17)) {}
chassis = MultibodyComponents.BodyShape(r = r_chassis, m = 375) {}
b1 = MultibodyComponents.FixedTranslation(r = r_b1) {}
b2 = MultibodyComponents.FixedTranslation(r = r_b2) {}
b3 = MultibodyComponents.FixedTranslation(r = r_b3) {}
r1 = MultibodyComponents.Revolute(n = n, phi(initial = -1.0889)) {}
r2 = MultibodyComponents.Revolute(n = n, phi(initial = -0.6031)) {}
r3 = MultibodyComponents.Revolute(n = n, phi(initial = 0.47595)) {}
r4 = MultibodyComponents.CutMount(x_locked = false, rx_locked = false, ry_locked = false, rz_locked = false) {}
parameter AB::Real = 146.5 / 1000
parameter BC::Real = 233.84 / 1000
parameter CD::Real = 228.60 / 1000
parameter DA::Real = 221.43 / 1000
parameter t5::Angle = 19.84 * π / 180
parameter n::Real[3] = [1, 0, 0]
final parameter r_chassis::Length[3] = DA * [0, 0.2, 0.2 * sin(t5)] / norm_([0, 0.2, 0.2 * sin(t5)])
final parameter r_b1::Length[3] = CD * [0, -0.1, 0.3] / norm_([0, -0.1, 0.3])
final parameter r_b2::Length[3] = BC * [0, 0.2, 0] / norm_([0, 0.2, 0])
final parameter r_b3::Length[3] = AB * [0, -0.1, 0.2] / norm_([0, -0.1, 0.2])
relations
connect(world.frame_b, body_upright.frame_a) {}
connect(body_upright.frame_b, chassis.frame_a) {}
connect(chassis.frame_b, r1.frame_a) {}
connect(r1.frame_b, b3.frame_a) {}
connect(b3.frame_b, r4.frame_b) {}
connect(r4.frame_a, b2.frame_b) {}
connect(b2.frame_a, r3.frame_b) {}
connect(r3.frame_a, b1.frame_b) {}
connect(b1.frame_a, r2.frame_b) {}
connect(r2.frame_a, chassis.frame_a) {}
endFlattened Source
"""
# CutMount Test
The 4-bar planar linkage from `RevolutePlanarLoopConstraintTest`, with the
loop-closing `RevolutePlanarLoopConstraint` replaced by a `CutMount` configured
to the identical constraint set: in-plane translations (y, z) locked, the
out-of-plane force (x, the revolute-axis direction) and all three torques
released. The two models must build to the same structure and produce the same
dynamics, which validates the CutMount constraint/balance equations and sign
conventions against a known-good component.
"""
example component CutMountTest
world = MultibodyComponents.World() {}
body_upright = MultibodyComponents.Prismatic(n = [0, 1, 0], render = false, s(initial = 0.17)) {}
chassis = MultibodyComponents.BodyShape(r = r_chassis, m = 375) {}
b1 = MultibodyComponents.FixedTranslation(r = r_b1) {}
b2 = MultibodyComponents.FixedTranslation(r = r_b2) {}
b3 = MultibodyComponents.FixedTranslation(r = r_b3) {}
r1 = MultibodyComponents.Revolute(n = n, phi(initial = -1.0889)) {}
r2 = MultibodyComponents.Revolute(n = n, phi(initial = -0.6031)) {}
r3 = MultibodyComponents.Revolute(n = n, phi(initial = 0.47595)) {}
r4 = MultibodyComponents.CutMount(x_locked = false, rx_locked = false, ry_locked = false, rz_locked = false) {}
parameter AB::Real = 146.5 / 1000
parameter BC::Real = 233.84 / 1000
parameter CD::Real = 228.60 / 1000
parameter DA::Real = 221.43 / 1000
parameter t5::Angle = 19.84 * π / 180
parameter n::Real[3] = [1, 0, 0]
final parameter r_chassis::Length[3] = DA * [0, 0.2, 0.2 * sin(t5)] / norm_([0, 0.2, 0.2 * sin(t5)])
final parameter r_b1::Length[3] = CD * [0, -0.1, 0.3] / norm_([0, -0.1, 0.3])
final parameter r_b2::Length[3] = BC * [0, 0.2, 0] / norm_([0, 0.2, 0])
final parameter r_b3::Length[3] = AB * [0, -0.1, 0.2] / norm_([0, -0.1, 0.2])
relations
connect(world.frame_b, body_upright.frame_a) {}
connect(body_upright.frame_b, chassis.frame_a) {}
connect(chassis.frame_b, r1.frame_a) {}
connect(r1.frame_b, b3.frame_a) {}
connect(b3.frame_b, r4.frame_b) {}
connect(r4.frame_a, b2.frame_b) {}
connect(b2.frame_a, r3.frame_b) {}
connect(r3.frame_a, b1.frame_b) {}
connect(b1.frame_a, r2.frame_b) {}
connect(r2.frame_a, chassis.frame_a) {}
metadata {}
endTest Cases
No test cases defined.
Related
Examples
Experiments
Analyses