ObjectJointPrismatic2D
A prismatic joint in 2D; allows the relative motion of two bodies, using two RigidMarkers.
Interface
Python names:
ObjectJointPrismatic2DorPrismaticJoint2D, andVPrismaticJoint2Dfor its visualizationMarkers it acts on: those providing
PositionandOrientation: MarkerBodyRigid, MarkerNodeRigid, MarkerSuperElementRigid, MarkerKinematicTreeRigid
Parameters
The parameters of the item; in a dictionary, its type is ‘JointPrismatic2D’:
name |
type |
size |
default |
description |
|---|---|---|---|---|
name |
String |
‘’ |
constraints’s unique name |
|
markerNumbers |
ArrayMarkerIndex |
[ invalid (-1), invalid (-1) ] |
list of markers used in connector |
|
axisMarker0 |
Vector3D |
3 |
[1.,0.,0.] |
direction of prismatic axis, given as a 3D vector in Marker0 frame |
normalMarker1 |
Vector3D |
3 |
[0.,1.,0.] |
direction of normal to prismatic axis, given as a 3D vector in Marker1 frame |
constrainRotation |
Bool |
True |
flag, which determines, if the connector also constrains the relative rotation of the two objects; if set to false, the constraint will keep an algebraic equation set equal zero |
|
activeConnector |
Bool |
True |
flag, which determines, if the connector is active; used to deactivate (temporarily) a connector or constraint |
|
visualization |
VObjectJointPrismatic2D |
parameters for visualization of item |
Visualization parameters
The parameters of VObjectJointPrismatic2D, given as visualization:
name |
type |
size |
default |
description |
|---|---|---|---|---|
show |
Bool |
True |
set true, if item is shown in visualization and false if it is not shown |
|
drawSize |
float |
-1. |
drawing size = radius of revolute joint; size == -1.f means that default connector size is used |
|
color |
Float4 |
4 |
[-1.,-1.,-1.,-1.] |
RGBA connector color; if R==-1, use default color |
Drawing
Drawn as all joints; a circle of diameter drawSize at each marker, the one of marker 0 red, and a line between them.
Output variables
Available as OutputVariableType in sensors, Get...Output() and other functions:
output variable |
symbol |
description |
|---|---|---|
Distance |
\((\pv_1-\pv_0)\tp \Am_0 \tv_0 / \vert \tv_0\vert \) |
position of marker m1 along the axis, measured from marker m0 |
Rotation |
the angle of marker m1 relative to marker m0 about \(z\), from \(\Am_0\tp \Am_1\) |
|
Position |
\(\LU{0}{\pv}_{m0}\) |
current global position of position marker \(m0\) |
Velocity |
\(\LU{0}{\vv}_{m0}\) |
current global velocity of position marker \(m0\) |
DisplacementLocal |
\(\LU{J0}{\Delta\pv} = \Am_0\tp(\pv_1-\pv_0)\) |
relative position of marker m1 in the frame of marker m0, which is the joint frame \(J0\); its component along \(\tv_0\) is Distance times \(\vert \tv_0\vert \) |
ForceLocal |
\(\LU{J0}{\fv} = \Am_0\tp \nv_1 \lambda_0\) |
the joint force normal to the axis, in the joint frame \(J0\); as for the other joints the force on marker m0; the torque \(\lambda_1\) is not included |
HomogeneousTransformation |
\(\LU{0}{\Hm}_{J0}\) |
the joint frame \(J0\) as homogeneous transformation: its rotation matrix and the position of marker \(m0\), as 4x4 matrix \([\LU{0}{\Rot}_{J0}\;\LU{0}{\pv}_{m0};\;\Null\tp\;1]\); the Get…Output functions return it as exu.HT, a sensor stores its 16 values row by row |
HomogeneousTransformationLocal |
\(\LU{J0}{\Hm}_{J1} = \LU{0}{\Hm}_{J0}^{-1}\,\LU{0}{\Hm}_{J1}\) |
the joint frame \(J1\) relative to the joint frame \(J0\): the relative rotation matrix \(\LU{0}{\Rot}_{J0}\tp\LU{0}{\Rot}_{J1}\) and the relative position \(\LU{0}{\Rot}_{J0}\tp(\LU{0}{\pv}_{m1}-\LU{0}{\pv}_{m0})\); for a joint the identity up to its free axes and its drift; returned and stored as HomogeneousTransformation |
Detailed description
Definition of quantities
intermediate variables |
symbol |
description |
|---|---|---|
marker positions |
\(\pv_0\), \(\pv_1\) |
global positions provided by marker m0 and m1 |
marker rotations |
\(\Am_0\), \(\Am_1\) |
rotation matrices provided by the two rigid markers |
prismatic axis |
\(\tv_0\) = |
the axis, in the frame of marker m0 |
normal |
\(\mathbf{n}_1\) = |
the normal to the axis, in the frame of marker m1 |
Lagrange multipliers |
\([\lambda_0,\,\lambda_1]\) |
the transverse force and the torque in the joint |
Geometric relations
The axis and the normal in the global frame are \(\Am_0 \tv_0\) and \(\Am_1 \mathbf{n}_1\); marker m1 may move along the axis, but not across it.
Connector constraint equations
On the position level (index 3)
the first keeping the relative position on the axis, the second keeping the axis normal to
\(\mathbf{n}_1\), which forbids the relative rotation. On the velocity level (index 2) their time
derivatives, with the time derivatives of the rotated vectors from the angular velocities of the
markers. With constrainRotation = False the second equation becomes \(\lambda_1 = 0\) and the bodies
may rotate relative to each other; with activeConnector = False both equations become
\(\lambda_i = 0\).
Mini example
#a planar rigid body sliding along an axis of the ground: the axis in marker 0, the normal in marker 1
node = mbs.AddNode(NodeRigidBody2D(referenceCoordinates=[0,0,0]))
body = mbs.AddObject(ObjectRigidBody2D(nodeNumber=node, mass=2, inertia=0.1))
mGround = mbs.AddMarker(MarkerBodyRigid(bodyNumber=oGround, localPosition=[0,0,0]))
mBody = mbs.AddMarker(MarkerBodyRigid(bodyNumber=body, localPosition=[0,0,0]))
mbs.AddObject(ObjectJointPrismatic2D(markerNumbers=[mGround, mBody], axisMarker0=[1,1,0], normalMarker1=[-1,1,0]))
mbs.AddLoad(LoadForceVector(markerNumber=mBody, loadVector=[2,0,0])) #its part along the axis moves the body
mbs.Assemble()
mbs.SolveDynamic()
#along the 45 degree axis: s = (F/sqrt(2))/(2m)*t^2, so x = s/sqrt(2) = F/(4m) at t=1
exu.sys['testResult'] = mbs.GetNodeOutput(node, exu.OutputVariableType.Coordinates)[0] #0.25
Relevant Examples (Ex) and TestModels (TM) with weblink to github: sliderCrank3DwithANCFbeltDrive2.py (Ex), geneticOptimizationSliderCrank.py (Ex), connectorOutputVariablesTest.py (TM), PARTS_ATEs_moving.py (TM), scissorPrismaticRevolute2D.py (TM), sliderCrankFloatingTest.py (TM)