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:
| Name | Description | Units | Default value |
|---|---|---|---|
x_locked | If true, lock the relative translation along the frame_a x-direction (otherwise the constraint force in that direction is zero) | – | true |
y_locked | If true, lock the relative translation along the frame_a y-direction (otherwise the constraint force in that direction is zero) | – | true |
z_locked | If true, lock the relative translation along the frame_a z-direction (otherwise the constraint force in that direction is zero) | – | true |
render | – | true | |
color | – | world_defau...tic_color() | |
specular_coefficient | – | 1.5 | |
sphere_diameter | Diameter of the sphere in animations | – | world_defau...ength() / 3 |
Connectors
frame_a- Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or severalFrame
connectors that can be connected together (Frame3D)
frame_b- Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or severalFrame
connectors that can be connected together (Frame3D)
Variables
| Name | Description | Units |
|---|---|---|
r_rel_a | Position vector from origin of frame_a to origin of frame_b, resolved in frame_a | m |
Behavior
Dict{MIME{Symbol("text/plain")}, String} with 1 entry: MIME type text/plain => "Error displaying result"
Source
"""
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"}
}
]
}
}
endFlattened Source
"""
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"}
}
]
}
}
endTest Cases
No test cases defined.
Related
Examples
Experiments
Analyses