NodeRigidBodyEP
A 3D rigid body node based on Euler parameters for rigid bodies or beams. The node has 3 displacement coordinates (representing displacement of reference point \(\LU{0}{\rv}\)) and four rotation coordinates (Euler parameters = unit quaternions).
Interface
Python names:
NodeRigidBodyEPorRigidEP, andVRigidEPfor its visualizationProvides:
Position,Orientation,RigidBody,RotationEulerParametersNode markers that can be attached: MarkerNodePosition, MarkerNodeRigid, MarkerNodeRotationCoordinate
Objects that take this node: ObjectMassPoint, ObjectRigidBody, ObjectBeamGeometricallyExact
Parameters
The parameters of the item; in a dictionary, its type is ‘RigidBodyEP’:
name |
type |
size |
default |
description |
|---|---|---|---|---|
name |
String |
‘’ |
node’s unique name |
|
referenceCoordinates |
Vector7D |
7 |
[0.,0.,0., 0.,0.,0.,0.] |
(symbol: \(\qv\cRef = [q_0,\,q_1,\,q_2,\,\psi_0,\,\psi_1,\,\psi_2,\,\psi_3]\tp\cRef = [\pv\tp\cRef,\,\tpsi\tp\cRef]\tp\)) reference coordinates (3 position coordinates and 4 Euler parameters) of node ==> e.g. ref. coordinates for finite elements or reference position of rigid body (e.g. for definition of joints) |
initialCoordinates |
Vector7D |
7 |
[0.,0.,0., 0.,0.,0.,0.] |
(symbol: \(\qv\cIni = [q_0,\,q_1,\,q_2,\,\psi_0,\,\psi_1,\,\psi_2,\,\psi_3]\tp\cIni = [\uv\tp\cIni,\,\tpsi\tp\cIni]\tp\)) initial displacement coordinates and 4 Euler parameters relative to reference coordinates |
initialVelocities |
Vector7D |
7 |
[0.,0.,0., 0.,0.,0.,0.] |
(symbol: \(\dot \qv\cIni = [\dot q_0,\,\dot q_1,\,\dot q_2,\,\dot \psi_0,\,\dot \psi_1,\,\dot \psi_2,\,\dot \psi_3]\tp\cIni = [\dot \uv\tp\cIni,\,\dot \tpsi\tp\cIni]\tp\)) initial velocity coordinates: time derivatives of initial displacements and Euler parameters |
addConstraintEquation |
Bool |
True |
True: automatically add Euler parameter constraint for node; False: Euler parameter constraint is not added, must be done manually (e.g., with CoordinateVectorConstraint) |
|
visualization |
VNodeRigidBodyEP |
parameters for visualization of item |
Visualization parameters
The parameters of VNodeRigidBodyEP, 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 (diameter, dimensions of underlying cube, etc.) for item; size == -1.f means that default size is used |
|
color |
Float4 |
4 |
[-1.,-1.,-1.,-1.] |
Default RGBA color for nodes; 4th value is alpha-transparency; R=-1.f means, that default color is used |
Drawing
Drawn as all nodes; with nodes.showBasis, also its frame, of length nodes.basisSize.
Settings beyond those of all nodes: general.axesTiling, nodes.basisSize, nodes.showBasis.
Output variables
Available as OutputVariableType in sensors, Get...Output() and other functions:
output variable |
symbol |
description |
|---|---|---|
Position |
\(\LU{0}{\pv}\cConfig = \LU{0}{[p_0,\,p_1,\,p_2]}\cConfig\tp= \LU{0}{\uv}\cConfig + \LU{0}{\pv}\cRef\) |
global 3D position vector of node; \(\uv\cRef=0\) |
Displacement |
\(\LU{0}{\uv}\cConfig = [q_0,\,q_1,\,q_2]\cConfig\tp\) |
global 3D displacement vector of node |
Velocity |
\(\LU{0}{\vv}\cConfig = [\dot q_0,\,\dot q_1,\,\dot q_2]\cConfig\tp\) |
global 3D velocity vector of node |
Acceleration |
\(\LU{0}{\av}\cConfig = [\ddot q_0,\,\ddot q_1,\,\ddot q_2]\cConfig\tp\) |
global 3D acceleration vector of node |
CoordinatesTotal |
displacement/rotation coordinates of node including reference configuration |
|
Coordinates |
\(\cv\cConfig = [q_0,\,q_1,\,q_2, \,\psi_0,\,\psi_1,\,\psi_2,\,\psi_3]\tp\cConfig\) |
coordinate vector of node, having 3 displacement coordinates and 4 Euler parameters |
Coordinates_t |
\(\dot\cv\cConfig = [\dot q_0,\,\dot q_1,\,\dot q_2, \,\dot \psi_0,\,\dot \psi_1,\,\dot \psi_2,\,\dot \psi_3]\tp\cConfig\) |
velocity coordinates vector of node |
Coordinates_tt |
\(\ddot\cv\cConfig = [\ddot q_0,\,\ddot q_1,\,\ddot q_2, \,\ddot \psi_0,\,\ddot \psi_1,\,\ddot \psi_2,\,\ddot \psi_3]\tp\cConfig\) |
acceleration coordinates vector of node |
RotationMatrix |
\([A_{00},\,A_{01},\,A_{02},\,A_{10},\,\ldots,\,A_{21},\,A_{22}]\cConfig\tp\) |
vector with 9 components of the rotation matrix \(\LU{0b}{\Rot}\cConfig\) in row-major format, in any configuration; the rotation matrix transforms local (\(b\)) to global (0) coordinates |
Rotation |
\([\varphi_0,\,\varphi_1,\,\varphi_2]\tp\cConfig\) |
vector with 3 components of the Euler/Tait-Bryan angles in xyz-sequence (\(\LU{0b}{\Rot}\cConfig=:\Rot_0(\varphi_0) \cdot \Rot_1(\varphi_1) \cdot \Rot_2(\varphi_2)\)), recomputed from rotation matrix |
AngularVelocity |
\(\LU{0}{\tomega}\cConfig = \LU{0}{[\omega_0,\,\omega_1,\,\omega_2]}\cConfig\tp\) |
global 3D angular velocity vector of node |
AngularVelocityLocal |
\(\LU{b}{\tomega}\cConfig = \LU{b}{[\omega_0,\,\omega_1,\,\omega_2]}\cConfig\tp\) |
local (body-fixed) 3D angular velocity vector of node |
AngularAcceleration |
\(\LU{0}{\talpha}\cConfig = \LU{0}{[\alpha_0,\,\alpha_1,\,\alpha_2]}\cConfig\tp\) |
global 3D angular acceleration vector of node |
Detailed description
Coordinates
index |
symbol |
kind |
meaning |
frame |
|---|---|---|---|---|
0, 1, 2 |
\(q_0,\,q_1,\,q_2\) |
displacement of the reference point of the body |
global |
|
3, 4, 5, 6 |
\(\psi_0,\,\psi_1,\,\psi_2,\,\psi_3\) |
change of the four Euler parameters (unit quaternion) against their reference values |
- |
|
- |
\(\lambda_\theta\) |
the Lagrange multiplier of the Euler parameter constraint, if |
- |
Configuration
The position of the reference point and the Euler parameters \(\ttheta\) are the sums of reference and current coordinates,
The reference Euler parameters must be a unit quaternion - \([1,\,0,\,0,\,0]\) for no rotation; the
default of zeros is not one, which CreateRigidBody takes care of. The rotation matrix, as a
function of \(\ttheta=[\theta_0,\,\theta_1,\,\theta_2,\,\theta_3]\tp\), transforms a local
(body-fixed) position \(\pLocB = \LU{b}{[b_0,\,b_1,\,b_2]}\tp\) into the global frame,
\(\LU{0}{\pLoc}\cConfig = \LU{0b}{\Rot}\cConfig \LU{b}{\pLoc}\), with
Frame and interpretation
The displacement is given in the global frame, and the Euler parameters describe the rotation of the body frame \(b\) against the global frame. Every object using the node reads it this way.
Action on the equations of motion
The velocity transformation relates the time derivatives of the Euler parameters to the angular velocity, in the global or in the body frame,
All seven coordinates lead to ODE2 equations, which the object provides. The first three are the residuals of the forces in the global frame. The last four are the torque equations projected with the transposed velocity transformation: a torque \(\LU{b}{\ttau}\) in the body frame enters them as \(\LU{b}{\Gm\tp} \LU{b}{\ttau}\), a torque \(\LU{0}{\ttau}\) in the global frame as \(\LU{0}{\Gm\tp} \LU{0}{\ttau}\), see (46) and the equations of motion of ObjectRigidBody.
Constraint of the Euler parameters
Four parameters for three rotations need one constraint. With addConstraintEquation = True the
node adds it itself, as one algebraic equation with the multiplier \(\lambda_\theta\): on the position
level (index 3)
or on the velocity level (index 2) \(2\,\ttheta\tp \dot\ttheta = 0\). With
addConstraintEquation = False it is left to the model, e.g. a CoordinateVectorConstraint.
For creating a NodeRigidBodyEP together with a rigid body, use CreateRigidBody, see
Function: CreateRigidBody.
Mini example
#a rigid body spinning about its z-axis; the velocity coordinates are the time derivatives of the Euler parameters
omega = [0,0,0.5*np.pi]
ep0 = eulerParameters0
node = mbs.AddNode(NodeRigidBodyEP(referenceCoordinates=[0.5,0.2,0.1]+ep0,
initialVelocities=[0,0,0]+list(AngularVelocity2EulerParameters_t(omega, ep0))))
inertia = InertiaCuboid(density=1000, sideLengths=[0.4,0.2,0.1])
mbs.AddObject(ObjectRigidBody(nodeNumber=node, mass=inertia.Mass(),
inertia=inertia.GetInertia6D()))
mbs.Assemble()
mbs.SolveDynamic()
#the node adds the constraint of the Euler parameters itself; the angle about z after 1 second:
exu.sys['testResult'] = mbs.GetNodeOutput(node, exu.OutputVariableType.Rotation)[2] #pi/2, to the accuracy of the time integration
Examples (Ex) and TestModels (TM) that show this item, with weblink to github: tutorialRigidBody.py (Ex), tutorialRigidBodyCreate.py (Ex), fourBarMechanism3D.py (Ex)