A spherical joint, which constrains the relative translation between two position based markers.
Additional information for ObjectJointSpherical:
- This
Object
has/provides the following types =Connector
,Constraint
- Requested
Marker
type =Position
- Short name for Python =
SphericalJoint
- Short name for Python visualization object =
VSphericalJoint
The item ObjectJointSpherical with type = 'JointSpherical' has the following parameters:
- name [type = String, default = '']:constraints's unique name
- markerNumbers [[m0,m1]\tp, type = ArrayMarkerIndex, size = 2, default = [ invalid [-1], invalid [-1] ]]:list of markers used in connector; m1 is the moving coin rigid body and m0 is the marker for the ground body, which use the localPosition=[0,0,0] for this marker!
- constrainedAxes [{\mathbf{j}}=[j_0,\,\ldots,\,j_2], type = ArrayIndex, size = 3, default = [1,1,1]]:flag, which determines which translation (0,1,2) and rotation (3,4,5) axes are constrained; for j_i, two values are possible: 0=free axis, 1=constrained axis
- activeConnector [type = Bool, default = True]:flag, which determines, if the connector is active; used to deactivate (temporarily) a connector or constraint
- visualization [type = VObjectJointSpherical]:parameters for visualization of item
The item VObjectJointSpherical has the following parameters:
- show [type = Bool, default = True]:set true, if item is shown in visualization and false if it is not shown
- jointRadius [type = float, default = 0.1]:radius of joint to draw
- color [type = Float4, default = [-1.,-1.,-1.,-1.]]:RGBA connector color; if R==-1, use default color
The following output variables are available as OutputVariableType in sensors, Get...Output() and other functions:
Position
: \LU{0}{{\mathbf{p}}}_{m0}current global position of position marker m0Velocity
: \LU{0}{{\mathbf{v}}}_{m0}current global velocity of position marker m0Displacement
: \LU{0}{\Delta{\mathbf{p}}}=\LU{0}{{\mathbf{p}}}_{m1} - \LU{0}{{\mathbf{p}}}_{m0}constraint drift or relative motion, if not all axes fixedForce
: \LU{0}{{\mathbf{f}}}joint force in global coordinates
intermediate variables
|
symbol
|
description
|
---|---|---|
marker m0 position
|
\LU{0}{{\mathbf{p}}}_{m0}
|
current global position which is provided by marker m0
|
marker m1 position
|
\LU{0}{{\mathbf{p}}}_{m1}
|
current global position which is provided by marker m1
|
marker m0 velocity
|
\LU{0}{{\mathbf{v}}}_{m0}
|
current global velocity which is provided by marker m0
|
marker m1 velocity
|
\LU{0}{{\mathbf{v}}}_{m1}
|
current global velocity which is provided by marker m1
|
relative velocity
|
\LU{0}{\Delta{\mathbf{v}}} = \LU{0}{{\mathbf{v}}}_{m1} - \LU{0}{{\mathbf{v}}}_{m0}
|
constraint velocity error, or relative velocity if not all axes fixed
|
algebraic variables
|
{\mathbf{z}}=[\lambda_0,\,\ldots,\,\lambda_2]\tp
|
vector of algebraic variables (Lagrange multipliers) according to the algebraic equations
|
``activeConnector = True``: If [j_0,\,\ldots,\,j_2] = [1,1,1]\tp, meaning that all translational coordinates are fixed, the translational index 3 constraints read
\LU{0}{{\mathbf{p}}}_{m1} - \LU{0}{{\mathbf{p}}}_{m0} = \Null
and the translational index 2 constraints read
\LU{0}{{\mathbf{v}}}_{m1} - \LU{0}{{\mathbf{v}}}_{m0} = \Null
If [j_0,\,\ldots,\,j_2] \neq [1,1,1]\tp, meaning that at least one translational coordinate is free, the translational index 3 constraints read for every component k \in [0,1,2] of the vector \LU{0}{\Delta{\mathbf{p}}}
\LU{0}{\Delta p_k} &=& 0 \quad \mathrm{if} \quad j_k = 1 \quad \mathrm{and}\\ \lambda_k &=& 0 \quad \mathrm{if} \quad j_k = 0 \\
and the translational index 2 constraints read for every component k \in [0,1,2] of the vector \LU{0}{\Delta{\mathbf{v}}}
\LU{0}{\Delta v_k} &=& 0 \quad \mathrm{if} \quad j_k = 1 \quad \mathrm{and}\\ \lambda_k &=& 0 \quad \mathrm{if} \quad j_k = 0 \\
``activeConnector = False``:
{\mathbf{z}} = \Null
In this example, we study the constraint equations for two body position marker, see Section :ref:`sec-item-markerbodyposition`, based on rigid bodies, see Section :ref:`sec-item-objectrigidbody`. The markers m_0 and m_1 have the positions
\LU{0}{{\mathbf{p}}_0}(\pLocB_0) = \LU{0}{{\mathbf{r}}_{\mathrm{ref},0}} + \LU{0}{{\mathbf{u}}_{0}} + \LU{0b}{\Rot_0}\pLocB_0, \quad \LU{0}{{\mathbf{p}}_1}(\pLocB_1) = \LU{0}{{\mathbf{r}}_{\mathrm{ref},1}} + \LU{0}{{\mathbf{u}}_{1}} + \LU{0b}{\Rot_1}\pLocB_1 .
From there, we can derive the 3 constraint equation
\LU{0}{{\mathbf{r}}_{\mathrm{ref},1}} + \LU{0}{{\mathbf{u}}_{1}} + \LU{0b}{\Rot_1}\pLocB_1 - \left(\LU{0}{{\mathbf{r}}_{\mathrm{ref},0}} + \LU{0}{{\mathbf{u}}_{0}} + \LU{0b}{\Rot_0}\pLocB_0 \right) = \Null .
The constraint jacobians simply follow from the position jacobians of the respective markers \LU{0}{{\mathbf{J}}_\mathrm{pos,0}}and \LU{0}{{\mathbf{J}}_\mathrm{pos,1}}. The position jacobians are added to the system jacobian at rows according to the global indices of the constraint equations and the columns are determined by the coordinate indices of the bodies' coordinates.
Relevant Examples and TestModels with weblink:
NGsolveLinearFEM.py (Examples/), humanRobotInteraction.py (Examples/), NGsolvePostProcessingStresses.py (Examples/), objectFFRFreducedOrderNetgen.py (Examples/), sliderCrank3DwithANCFbeltDrive.py (Examples/), ACFtest.py (TestModels/), driveTrainTest.py (TestModels/), genericJointUserFunctionTest.py (TestModels/), kinematicTreeConstraintTest.py (TestModels/), objectFFRFreducedOrderAccelerations.py (TestModels/), objectFFRFreducedOrderStressModesTest.py (TestModels/), objectFFRFreducedOrderTest.py (TestModels/), objectFFRFTest.py (TestModels/), objectFFRFTest2.py (TestModels/), perfObjectFFRFreducedOrder.py (TestModels/)
The web version may not be complete. For details, consider also the Exudyn PDF documentation : theDoc.pdf