Skip to content
LIBRARY
PrismaticConstraint.md

PrismaticConstraint

Prismatic cut-joint that rigidly constrains the orientation of frame_b to that of frame_a while the translational directions may be constrained or released individually, without introducing state variables for the relative motion.

Unlike the standard Prismatic joint, this component does not define explicit state variables for the relative motion; instead it imposes kinematic constraints between frame_a and frame_b and evaluates the forces and torques required to satisfy them (an "implicit" joint). As a consequence, the relative kinematics between the two frames cannot be initialized.

It is intended for closed kinematic loops, where this formulation can simplify the resulting non-linear system of equations. In systems without closed loops the standard Prismatic joint should be used instead.

The relative orientation is always locked (the two frames keep the same orientation). The translational constraints may be released individually per axis (resolved in frame_a) with x_locked, y_locked, z_locked. Releasing one axis turns the component into a sliding (prismatic) connection along that axis.

This component extends from PartialTwoFrames This component extends from Renderable

Usage

MultibodyComponents.PrismaticConstraint(render=true, color=world_default_prismatic_color(), specular_coefficient=1.5, sphere_diameter=world_default_joint_length() / 3)

Parameters:

NameDescriptionUnitsDefault value
x_lockedIf true, lock the relative translation along the frame_a x-direction (otherwise the constraint force in that direction is zero)true
y_lockedIf true, lock the relative translation along the frame_a y-direction (otherwise the constraint force in that direction is zero)true
z_lockedIf true, lock the relative translation along the frame_a z-direction (otherwise the constraint force in that direction is zero)true
rendertrue
colorworld_defau...tic_color()
specular_coefficient1.5
sphere_diameterDiameter of the sphere in animationsworld_defau...ength() / 3

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_aPosition vector from origin of frame_a to origin of frame_b, resolved in frame_am

Behavior

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

Source

dyad
"""
Prismatic cut-joint that rigidly constrains the orientation of `frame_b` to that
of `frame_a` while the translational directions may be constrained or released
individually, without introducing state variables for the relative motion.

Unlike the standard `Prismatic` joint, this component does not define explicit
state variables for the relative motion; instead it imposes kinematic constraints
between `frame_a` and `frame_b` and evaluates the forces and torques required to
satisfy them (an "implicit" joint). As a consequence, the relative kinematics
between the two frames cannot be initialized.

It is intended for closed kinematic loops, where this formulation can simplify
the resulting non-linear system of equations. In systems without closed loops
the standard `Prismatic` joint should be used instead.

The relative orientation is always locked (the two frames keep the same
orientation). The translational constraints may be released individually per axis
(resolved in `frame_a`) with `x_locked`, `y_locked`, `z_locked`. Releasing one
axis turns the component into a sliding (prismatic) connection along that axis.
"""
component PrismaticConstraint
  extends PartialTwoFrames()
  extends Renderable(color = world_default_prismatic_color())
  # Visualization shape (sphere representing the cut-joint)
  shape = SphereShape(render = render, color = color, r = frame_a.r_0, R = transpose(frame_a.R), length = sphere_diameter, width = sphere_diameter, height = sphere_diameter)
  "If true, lock the relative translation along the frame_a x-direction (otherwise the constraint force in that direction is zero)"
  structural parameter x_locked::Boolean = true
  "If true, lock the relative translation along the frame_a y-direction (otherwise the constraint force in that direction is zero)"
  structural parameter y_locked::Boolean = true
  "If true, lock the relative translation along the frame_a z-direction (otherwise the constraint force in that direction is zero)"
  structural parameter z_locked::Boolean = true
  "Diameter of the sphere in animations"
  parameter sphere_diameter::Real = world_default_joint_length() / 3
  "Position vector from origin of frame_a to origin of frame_b, resolved in frame_a"
  variable r_rel_a::Position[3]
relations
  r_rel_a = resolve2(frame_a.R, frame_b.r_0 - frame_a.r_0)
  # Constraint equations concerning translations: lock the relative position
  # along each locked axis, otherwise the corresponding constraint force is zero
  if x_locked
    r_rel_a[1] = 0
  else
    frame_a.f[1] = 0
  end
  if y_locked
    r_rel_a[2] = 0
  else
    frame_a.f[2] = 0
  end
  if z_locked
    r_rel_a[3] = 0
  else
    frame_a.f[3] = 0
  end
  # Constraint equations concerning rotations: the two frames keep the same
  # orientation (three orientation residuals are driven to zero)
  residue(frame_a.R, frame_b.R) = [0, 0, 0]
  # Force and torque balance between the two frames
  frame_a.f + resolve_relative(frame_b.f, frame_b.R, frame_a.R) = [0, 0, 0]
  frame_a.tau + resolve_relative(frame_b.tau, frame_b.R, frame_a.R) - cross(r_rel_a, frame_a.f) = [0, 0, 0]
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/PrismaticConstraint.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 200,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end
Flattened Source
dyad
"""
Prismatic cut-joint that rigidly constrains the orientation of `frame_b` to that
of `frame_a` while the translational directions may be constrained or released
individually, without introducing state variables for the relative motion.

Unlike the standard `Prismatic` joint, this component does not define explicit
state variables for the relative motion; instead it imposes kinematic constraints
between `frame_a` and `frame_b` and evaluates the forces and torques required to
satisfy them (an "implicit" joint). As a consequence, the relative kinematics
between the two frames cannot be initialized.

It is intended for closed kinematic loops, where this formulation can simplify
the resulting non-linear system of equations. In systems without closed loops
the standard `Prismatic` joint should be used instead.

The relative orientation is always locked (the two frames keep the same
orientation). The translational constraints may be released individually per axis
(resolved in `frame_a`) with `x_locked`, `y_locked`, `z_locked`. Releasing one
axis turns the component into a sliding (prismatic) connection along that axis.
"""
component PrismaticConstraint
  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": []
    }
  }
  parameter render::Boolean = true
  parameter color::Real[4] = [0.5, 0.5, 0.5, 1.0]
  parameter specular_coefficient::Real = 1.5
  # Visualization shape (sphere representing the cut-joint)
  shape = SphereShape(render = render, color = color, r = frame_a.r_0, R = transpose(frame_a.R), length = sphere_diameter, width = sphere_diameter, height = sphere_diameter)
  "If true, lock the relative translation along the frame_a x-direction (otherwise the constraint force in that direction is zero)"
  structural parameter x_locked::Boolean = true
  "If true, lock the relative translation along the frame_a y-direction (otherwise the constraint force in that direction is zero)"
  structural parameter y_locked::Boolean = true
  "If true, lock the relative translation along the frame_a z-direction (otherwise the constraint force in that direction is zero)"
  structural parameter z_locked::Boolean = true
  "Diameter of the sphere in animations"
  parameter sphere_diameter::Real = world_default_joint_length() / 3
  "Position vector from origin of frame_a to origin of frame_b, resolved in frame_a"
  variable r_rel_a::Position[3]
relations
  r_rel_a = resolve2(frame_a.R, frame_b.r_0 - frame_a.r_0)
  # Constraint equations concerning translations: lock the relative position
  # along each locked axis, otherwise the corresponding constraint force is zero
  if x_locked
    r_rel_a[1] = 0
  else
    frame_a.f[1] = 0
  end
  if y_locked
    r_rel_a[2] = 0
  else
    frame_a.f[2] = 0
  end
  if z_locked
    r_rel_a[3] = 0
  else
    frame_a.f[3] = 0
  end
  # Constraint equations concerning rotations: the two frames keep the same
  # orientation (three orientation residuals are driven to zero)
  residue(frame_a.R, frame_b.R) = [0, 0, 0]
  # Force and torque balance between the two frames
  frame_a.f + resolve_relative(frame_b.f, frame_b.R, frame_a.R) = [0, 0, 0]
  frame_a.tau + resolve_relative(frame_b.tau, frame_b.R, frame_a.R) - cross(r_rel_a, frame_a.f) = [0, 0, 0]
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/PrismaticConstraint.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 200,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses