Skip to content
LIBRARY
tests.CutMountTest.md

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:

NameDescriptionUnitsDefault value
AB146.5 / 1000
BC233.84 / 1000
CD228.60 / 1000
DA221.43 / 1000
t5rad19.84 * π / 180
n[1, 0, 0]

Behavior

Source

dyad
"""
# 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) {}
end
Flattened Source
dyad
"""
# 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 {}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses