Skip to content
LIBRARY
JointRRP.md

JointRRP

Planar revolute - revolute - prismatic joint aggregation. Closes a planar kinematic loop analytically (no constraints, no potential states), so it should be preferred over three basic joints in planar loops to avoid non-linear systems of equations. Internally it is a JointUSP (universal - spherical - prismatic): in a planar loop this behaves as two revolute joints with parallel axes n_a connected by rigid rods to a prismatic joint along n_b (which must be orthogonal to the revolute axes). frame_b, frame_ib and frame_im are parallel to each other.

This component extends from PartialTwoFrames

Usage

MultibodyComponents.JointRRP(n_a=[0, 0, 1], n_b=[-1, 0, 0], rRod1_ia=[1, 0, 0], rRod2_ib=[-1, 0, 0], s_offset=0, s_guess=0, rod_radius=0.05, rod_color=[0.5, 0, 0.5, 1])

Parameters:

NameDescriptionUnitsDefault value
positive_branchtrue
n_aAxes of the two revolute joints, resolved in frame_a (parallel to each other)[0, 0, 1]
n_bAxis of the prismatic joint, resolved in frame_b (orthogonal to the revolute axes)[-1, 0, 0]
rRod1_iaVector from frame_a origin to the middle revolute joint, resolved in frame_ia[1, 0, 0]
rRod2_ibVector from frame_ib origin to the middle revolute joint, resolved in frame_ib[-1, 0, 0]
s_offsetRelative distance offset of the prismatic joint0
s_guessGuess value for the prismatic distance at the initial time0
rod_radiusRendering radius of the rods0.05
rod_colorRGBA color of the rods[0.5, 0, 0.5, 1]

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)

  • frame_ia - 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_ib - 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_im - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

  • axis - This connector represents a mechanical flange with position and force as the potential and flow variables, respectively. (Flange)

  • bearing - This connector represents a mechanical flange with position and force as the potential and flow variables, respectively. (Flange)

Behavior

Source

dyad
"""
Planar revolute - revolute - prismatic joint aggregation. Closes a planar
kinematic loop analytically (no constraints, no potential states), so it should
be preferred over three basic joints in planar loops to avoid non-linear systems
of equations. Internally it is a `JointUSP` (universal - spherical - prismatic):
in a planar loop this behaves as two revolute joints with parallel axes `n_a`
connected by rigid rods to a prismatic joint along `n_b` (which must be
orthogonal to the revolute axes). `frame_b`, `frame_ib` and `frame_im` are
parallel to each other.
"""
component JointRRP
  extends PartialTwoFrames()
  "Frame fixed in rod1 at the origin of frame_a"
  frame_ia = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 260, "y1": 450, "x2": 360, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  "Frame fixed in rod2 at the prismatic side"
  frame_ib = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 630, "y1": 450, "x2": 730, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  "Frame fixed in rod2 at the middle revolute joint"
  frame_im = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 450, "y1": 450, "x2": 550, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  "Translational flange driving the prismatic joint"
  axis = Flange() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 410, "y1": 950, "x2": 510, "y2": 1050, "rot": 0}
      },
      "tags": []
    }
  }
  "Translational flange of the prismatic joint bearing"
  bearing = Flange() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 140, "y1": 940, "x2": 240, "y2": 1040, "rot": 0}
      },
      "tags": []
    }
  }
  jointUSP = JointUSP(n1_a = n_a, n_b = n_b, rRod1_ia = rRod1_ia, rRod2_ib = rRod2_ib, s_offset = s_offset, s_guess = s_guess, positive_branch = positive_branch, rod_radius = rod_radius, rod_color = rod_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 450, "y1": 680, "x2": 550, "y2": 780, "rot": 0}
      },
      "tags": []
    }
  }
  structural parameter positive_branch::Boolean = true
  "Axes of the two revolute joints, resolved in frame_a (parallel to each other)"
  parameter n_a::Real[3] = [0, 0, 1]
  "Axis of the prismatic joint, resolved in frame_b (orthogonal to the revolute axes)"
  parameter n_b::Real[3] = [-1, 0, 0]
  "Vector from frame_a origin to the middle revolute joint, resolved in frame_ia"
  parameter rRod1_ia::Real[3] = [1, 0, 0]
  "Vector from frame_ib origin to the middle revolute joint, resolved in frame_ib"
  parameter rRod2_ib::Real[3] = [-1, 0, 0]
  "Relative distance offset of the prismatic joint"
  parameter s_offset::Real = 0
  "Guess value for the prismatic distance at the initial time"
  parameter s_guess::Real = 0
  "Rendering radius of the rods"
  parameter rod_radius::Real = 0.05
  "RGBA color of the rods"
  parameter rod_color::Real[4] = [0.5, 0, 0.5, 1]
relations
  connect(jointUSP.frame_a, frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 42.5, "y": 730}, {"x": 42.5, "y": 500}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointUSP.frame_b, frame_b) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 960, "y": 730}, {"x": 960, "y": 500}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointUSP.frame_ia, frame_ia) {
    "Dyad": {
      "edges": [
        {
          "S": 1,
          "M": [
            {"x": 479, "y": 640},
            {"x": 350, "y": 640},
            {"x": 350, "y": 540},
            {"x": 310, "y": 540}
          ],
          "E": 2
        }
      ],
      "renderStyle": "standard"
    }
  }
  connect(jointUSP.frame_im, frame_im) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(jointUSP.frame_ib, frame_ib) {
    "Dyad": {
      "edges": [
        {
          "S": 1,
          "M": [{"x": 520, "y": 640}, {"x": 640, "y": 640}, {"x": 640, "y": 500}],
          "E": 2
        }
      ],
      "renderStyle": "standard"
    }
  }
  connect(bearing, jointUSP.bearing) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 190, "y": 821}, {"x": 483, "y": 821}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointUSP.axis, axis) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 518, "y": 1000}], "E": 2}],
      "renderStyle": "standard"
    }
  }
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/JointRRP.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 200,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end
Flattened Source
dyad
"""
Planar revolute - revolute - prismatic joint aggregation. Closes a planar
kinematic loop analytically (no constraints, no potential states), so it should
be preferred over three basic joints in planar loops to avoid non-linear systems
of equations. Internally it is a `JointUSP` (universal - spherical - prismatic):
in a planar loop this behaves as two revolute joints with parallel axes `n_a`
connected by rigid rods to a prismatic joint along `n_b` (which must be
orthogonal to the revolute axes). `frame_b`, `frame_ib` and `frame_im` are
parallel to each other.
"""
component JointRRP
  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": []
    }
  }
  "Frame fixed in rod1 at the origin of frame_a"
  frame_ia = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 260, "y1": 450, "x2": 360, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  "Frame fixed in rod2 at the prismatic side"
  frame_ib = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 630, "y1": 450, "x2": 730, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  "Frame fixed in rod2 at the middle revolute joint"
  frame_im = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 450, "y1": 450, "x2": 550, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  "Translational flange driving the prismatic joint"
  axis = Flange() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 410, "y1": 950, "x2": 510, "y2": 1050, "rot": 0}
      },
      "tags": []
    }
  }
  "Translational flange of the prismatic joint bearing"
  bearing = Flange() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 140, "y1": 940, "x2": 240, "y2": 1040, "rot": 0}
      },
      "tags": []
    }
  }
  jointUSP = JointUSP(n1_a = n_a, n_b = n_b, rRod1_ia = rRod1_ia, rRod2_ib = rRod2_ib, s_offset = s_offset, s_guess = s_guess, positive_branch = positive_branch, rod_radius = rod_radius, rod_color = rod_color) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 450, "y1": 680, "x2": 550, "y2": 780, "rot": 0}
      },
      "tags": []
    }
  }
  structural parameter positive_branch::Boolean = true
  "Axes of the two revolute joints, resolved in frame_a (parallel to each other)"
  parameter n_a::Real[3] = [0, 0, 1]
  "Axis of the prismatic joint, resolved in frame_b (orthogonal to the revolute axes)"
  parameter n_b::Real[3] = [-1, 0, 0]
  "Vector from frame_a origin to the middle revolute joint, resolved in frame_ia"
  parameter rRod1_ia::Real[3] = [1, 0, 0]
  "Vector from frame_ib origin to the middle revolute joint, resolved in frame_ib"
  parameter rRod2_ib::Real[3] = [-1, 0, 0]
  "Relative distance offset of the prismatic joint"
  parameter s_offset::Real = 0
  "Guess value for the prismatic distance at the initial time"
  parameter s_guess::Real = 0
  "Rendering radius of the rods"
  parameter rod_radius::Real = 0.05
  "RGBA color of the rods"
  parameter rod_color::Real[4] = [0.5, 0, 0.5, 1]
relations
  connect(jointUSP.frame_a, frame_a) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 42.5, "y": 730}, {"x": 42.5, "y": 500}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointUSP.frame_b, frame_b) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 960, "y": 730}, {"x": 960, "y": 500}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointUSP.frame_ia, frame_ia) {
    "Dyad": {
      "edges": [
        {
          "S": 1,
          "M": [
            {"x": 479, "y": 640},
            {"x": 350, "y": 640},
            {"x": 350, "y": 540},
            {"x": 310, "y": 540}
          ],
          "E": 2
        }
      ],
      "renderStyle": "standard"
    }
  }
  connect(jointUSP.frame_im, frame_im) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
  connect(jointUSP.frame_ib, frame_ib) {
    "Dyad": {
      "edges": [
        {
          "S": 1,
          "M": [{"x": 520, "y": 640}, {"x": 640, "y": 640}, {"x": 640, "y": 500}],
          "E": 2
        }
      ],
      "renderStyle": "standard"
    }
  }
  connect(bearing, jointUSP.bearing) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 190, "y": 821}, {"x": 483, "y": 821}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(jointUSP.axis, axis) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 518, "y": 1000}], "E": 2}],
      "renderStyle": "standard"
    }
  }
metadata {
  "Dyad": {
    "icons": {"default": "dyad://MultibodyComponents/JointRRP.svg"},
    "labels": [
      {
        "label": "$(instance)",
        "x": 500,
        "y": 200,
        "rot": 0,
        "attrs": {"font-size": "160"}
      }
    ]
  }
}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses