Skip to content
LIBRARY
SphericalConstraint.md

SphericalConstraint

Spherical cut-joint (ball joint) that constrains the relative position of frame_b with respect to frame_a while leaving the relative orientation free, without introducing state variables for the relative motion.

Unlike a joint with explicit relative-motion coordinates, this component 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 a joint with explicit state should be used instead.

No torque is transmitted through the joint (free rotation in all three directions). The translational constraints may be released individually per axis (resolved in frame_a) with x_locked, y_locked, z_locked. With all three locked (default) the origins of the two frames coincide.

This component extends from PartialTwoFrames This component extends from Renderable

Usage

MultibodyComponents.SphericalConstraint(render=true, color=world_default_joint_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...int_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
"""
Spherical cut-joint (ball joint) that constrains the relative position of
`frame_b` with respect to `frame_a` while leaving the relative orientation free,
without introducing state variables for the relative motion.

Unlike a joint with explicit relative-motion coordinates, this component 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 a
joint with explicit state should be used instead.

No torque is transmitted through the joint (free rotation in all three
directions). The translational constraints may be released individually per axis
(resolved in `frame_a`) with `x_locked`, `y_locked`, `z_locked`. With all three
locked (default) the origins of the two frames coincide.
"""
component SphericalConstraint
  extends PartialTwoFrames()
  extends Renderable(color = world_default_joint_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
  # No torque is transmitted through the ball joint
  frame_b.tau = [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/SphericalConstraint.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 200,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end
Flattened Source
dyad
"""
Spherical cut-joint (ball joint) that constrains the relative position of
`frame_b` with respect to `frame_a` while leaving the relative orientation free,
without introducing state variables for the relative motion.

Unlike a joint with explicit relative-motion coordinates, this component 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 a
joint with explicit state should be used instead.

No torque is transmitted through the joint (free rotation in all three
directions). The translational constraints may be released individually per axis
(resolved in `frame_a`) with `x_locked`, `y_locked`, `z_locked`. With all three
locked (default) the origins of the two frames coincide.
"""
component SphericalConstraint
  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
  # No torque is transmitted through the ball joint
  frame_b.tau = [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/SphericalConstraint.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 200,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses