Skip to content
LIBRARY
CutMount.md

CutMount

Zero-clearance mount that rigidly constrains selected directions and prescribes zero reaction in the released ones.

Per direction (translations along the frame_a axes; rotations about the frame_a axes):

  • locked (default): kinematic constraint (zero relative motion), reaction unknown

  • released: the reaction component is prescribed to ZERO; the relative motion in that direction must be constrained by the rest of the mechanism — use only inside closed kinematic loops.

Release exactly the redundant reaction directions of a statically indeterminate mounting (cf. RevolutePlanarLoopConstraint): the released reactions are the self-equilibrating preload components of the redundant assembly, and zero is the correct value for a stress-free assembly.

Like RevolutePlanarLoopConstraint, this component does not propagate an orientation root: both frames must already be rooted via other paths. The relative coordinates of this mount cannot be initialized.

This component extends from PartialTwoFrames

Usage

MultibodyComponents.CutMount()

Parameters:

NameDescriptionUnitsDefault value
x_lockedLock relative translation along frame_a xtrue
y_lockedLock relative translation along frame_a ytrue
z_lockedLock relative translation along frame_a ztrue
rx_lockedLock relative rotation about xtrue
ry_lockedLock relative rotation about ytrue
rz_lockedLock relative rotation about ztrue

Connectors

  • frame_a - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

  • frame_b - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

Variables

NameDescriptionUnits
r_rel_aRelative position frame_a -> frame_b, resolved in frame_am
res_rotOrientation residues between frame_a and frame_b
f_b_aframe_b cut force resolved in frame_a

Behavior

Dict{MIME{Symbol("text/plain")}, String} with 1 entry: MIME type text/plain => "Error displaying result"

Source

dyad
"""
Zero-clearance mount that rigidly constrains selected directions and prescribes
zero reaction in the released ones.

Per direction (translations along the frame_a axes; rotations about the frame_a
axes):
- locked (default): kinematic constraint (zero relative motion), reaction unknown
- released: the reaction component is prescribed to ZERO; the relative motion in
  that direction must be constrained by the rest of the mechanism — use only
  inside closed kinematic loops.

Release exactly the redundant reaction directions of a statically indeterminate
mounting (cf. `RevolutePlanarLoopConstraint`): the released reactions are the
self-equilibrating preload components of the redundant assembly, and zero is the
correct value for a stress-free assembly.

Like `RevolutePlanarLoopConstraint`, this component does not propagate an
orientation root: both frames must already be rooted via other paths. The
relative coordinates of this mount cannot be initialized.
"""
component CutMount
  extends PartialTwoFrames()
  "Lock relative translation along frame_a x"
  structural parameter x_locked::Boolean = true
  "Lock relative translation along frame_a y"
  structural parameter y_locked::Boolean = true
  "Lock relative translation along frame_a z"
  structural parameter z_locked::Boolean = true
  "Lock relative rotation about x"
  structural parameter rx_locked::Boolean = true
  "Lock relative rotation about y"
  structural parameter ry_locked::Boolean = true
  "Lock relative rotation about z"
  structural parameter rz_locked::Boolean = true
  "Relative position frame_a -> frame_b, resolved in frame_a"
  variable r_rel_a::Position[3]
  "Orientation residues between frame_a and frame_b"
  variable res_rot::Real[3]
  "frame_b cut force resolved in frame_a"
  variable f_b_a::Real[3]
relations
  r_rel_a = resolve2(frame_a.R, frame_b.r_0 - frame_a.r_0)
  res_rot = residue(frame_a.R, frame_b.R)
  f_b_a = resolve_relative(frame_b.f, frame_b.R, frame_a.R)
  if x_locked
    0 = r_rel_a[1]
  else
    0 = frame_a.f[1]
  end
  if y_locked
    0 = r_rel_a[2]
  else
    0 = frame_a.f[2]
  end
  if z_locked
    0 = r_rel_a[3]
  else
    0 = frame_a.f[3]
  end
  if rx_locked
    0 = res_rot[1]
  else
    0 = frame_a.tau[1]
  end
  if ry_locked
    0 = res_rot[2]
  else
    0 = frame_a.tau[2]
  end
  if rz_locked
    0 = res_rot[3]
  else
    0 = frame_a.tau[3]
  end
  # Newton's third law across the (near-coincident) interface
  [0, 0, 0] = frame_a.f + f_b_a
  [0, 0, 0] = frame_a.tau + resolve_relative(frame_b.tau, frame_b.R, frame_a.R) + cross(r_rel_a, f_b_a)
metadata {"Dyad": {"icons": {"default": "dyad://MultibodyComponents/CutMount.svg"}}}
end
Flattened Source
dyad
"""
Zero-clearance mount that rigidly constrains selected directions and prescribes
zero reaction in the released ones.

Per direction (translations along the frame_a axes; rotations about the frame_a
axes):
- locked (default): kinematic constraint (zero relative motion), reaction unknown
- released: the reaction component is prescribed to ZERO; the relative motion in
  that direction must be constrained by the rest of the mechanism — use only
  inside closed kinematic loops.

Release exactly the redundant reaction directions of a statically indeterminate
mounting (cf. `RevolutePlanarLoopConstraint`): the released reactions are the
self-equilibrating preload components of the redundant assembly, and zero is the
correct value for a stress-free assembly.

Like `RevolutePlanarLoopConstraint`, this component does not propagate an
orientation root: both frames must already be rooted via other paths. The
relative coordinates of this mount cannot be initialized.
"""
component CutMount
  frame_a = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": -50, "y1": 450, "x2": 50, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  frame_b = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 950, "y1": 450, "x2": 1050, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  "Lock relative translation along frame_a x"
  structural parameter x_locked::Boolean = true
  "Lock relative translation along frame_a y"
  structural parameter y_locked::Boolean = true
  "Lock relative translation along frame_a z"
  structural parameter z_locked::Boolean = true
  "Lock relative rotation about x"
  structural parameter rx_locked::Boolean = true
  "Lock relative rotation about y"
  structural parameter ry_locked::Boolean = true
  "Lock relative rotation about z"
  structural parameter rz_locked::Boolean = true
  "Relative position frame_a -> frame_b, resolved in frame_a"
  variable r_rel_a::Position[3]
  "Orientation residues between frame_a and frame_b"
  variable res_rot::Real[3]
  "frame_b cut force resolved in frame_a"
  variable f_b_a::Real[3]
relations
  r_rel_a = resolve2(frame_a.R, frame_b.r_0 - frame_a.r_0)
  res_rot = residue(frame_a.R, frame_b.R)
  f_b_a = resolve_relative(frame_b.f, frame_b.R, frame_a.R)
  if x_locked
    0 = r_rel_a[1]
  else
    0 = frame_a.f[1]
  end
  if y_locked
    0 = r_rel_a[2]
  else
    0 = frame_a.f[2]
  end
  if z_locked
    0 = r_rel_a[3]
  else
    0 = frame_a.f[3]
  end
  if rx_locked
    0 = res_rot[1]
  else
    0 = frame_a.tau[1]
  end
  if ry_locked
    0 = res_rot[2]
  else
    0 = frame_a.tau[2]
  end
  if rz_locked
    0 = res_rot[3]
  else
    0 = frame_a.tau[3]
  end
  # Newton's third law across the (near-coincident) interface
  [0, 0, 0] = frame_a.f + f_b_a
  [0, 0, 0] = frame_a.tau + resolve_relative(frame_b.tau, frame_b.R, frame_a.R) + cross(r_rel_a, f_b_a)
metadata {"Dyad": {"icons": {"default": "dyad://MultibodyComponents/CutMount.svg"}}}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses