```{raw} latex \clearpage ``` (sec-item-markernoderotationcoordinate)= # MarkerNodeRotationCoordinate A node-Marker attached to a a node containing rotation; the Marker measures a rotation coordinate (Tait-Bryan angles) or angular velocities on the velocity level. ## Interface - Provides: `Coordinate` - Nodes it can be attached to: [](#sec-item-noderigidbodyep), [](#sec-item-noderigidbodyrxyz), [](#sec-item-noderigidbodyrotveclg), [](#sec-item-nodepointslope12), [](#sec-item-nodepointslope23), [](#sec-item-nodepointground) - Connectors, constraints and loads that can use it: [](#sec-item-objectconnectorcoordinatespringdamper), [](#sec-item-objectconnectorcoordinatespringdamperext), [](#sec-item-objectconnectorcoordinate), [](#sec-item-objectcontactcoordinate), [](#sec-item-loadcoordinate) ## Parameters The parameters of the item; in a dictionary, its type is 'NodeRotationCoordinate': | name | type | size | default | description | |---|---|---|---|---| | **name** | String | | '' | marker's unique name | | **nodeNumber** | NodeIndex | | invalid (-1) | node number to which marker is attached to | | **rotationCoordinate** | UInt | | invalid (-1) | rotation coordinate: 0=x, 1=y, 2=z; **must be given**: the default is only a placeholder | | **visualization** | VMarkerNodeRotationCoordinate | | | parameters for visualization of item | ## Visualization parameters `VMarkerNodeRotationCoordinate` has no parameters. ## Drawing The item draws nothing. (description-markernoderotationcoordinate)= ## Detailed description ### Marker quantities | quantity | symbol | as computed | |---|---|---| | rotation | $\varphi_i$ | the Tait-Bryan angle $i$ = `rotationCoordinate` (0: about $x$, 1: $y$, 2: $z$), computed from the rotation matrix of the node | | its velocity | $\omega_i$ | component $i$ of the global angular velocity of the node | The angle is **recomputed from the rotation matrix**, whatever the rotation parameters of the node are, so it lies in $(-\pi,\,\pi]$ and jumps after a full turn; and $\omega_i$ is the time derivative of $\varphi_i$ only while the rotations about the other two axes are small. Use the marker for rotations that stay in that range - a spring about one axis of a nearly planar motion - and a `MarkerBodiesRelativeRotationCoordinate` or an Euler angle coordinate otherwise. ### Jacobians Row $i$ of the rotation Jacobian of the node, $\Jm = \partial \omega_i / \partial \dot\qv$. (miniexample-markernoderotationcoordinate)= ## Mini example ```python #a rotation coordinate of a rigid body node, held by a coordinate constraint inertia = InertiaCuboid(density=1000, sideLengths=[0.4,0.2,0.1]) node = mbs.AddNode(NodeRigidBodyRxyz(referenceCoordinates=[0,0,0, 0,0,0])) mbs.AddObject(ObjectRigidBody(nodeNumber=node, mass=inertia.Mass(), inertia=inertia.GetInertia6D())) mRotZ = mbs.AddMarker(MarkerNodeRotationCoordinate(nodeNumber=node, rotationCoordinate=2)) mGround = mbs.AddMarker(MarkerNodeCoordinate(nodeNumber=nGround, coordinate=0)) oHold = mbs.AddObject(ObjectConnectorCoordinate(markerNumbers=[mGround, mRotZ])) mbs.AddLoad(LoadTorqueVector(markerNumber=mbs.AddMarker(MarkerNodeRigid(nodeNumber=node)), loadVector=[0,0,2])) mbs.Assemble() mbs.SolveDynamic() #the constraint holds the rotation about z against the torque: its force is the reaction torque exu.sys['testResult'] = mbs.GetObjectOutput(oHold, exu.OutputVariableType.Force) #2 ``` Relevant Examples (Ex) and TestModels (TM) with weblink to github: [`pistonEngine.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/pistonEngine.py) (Ex), [`rigidRotor3DbasicBehaviour.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/rigidRotor3DbasicBehaviour.py) (Ex), [`sliderCrank3DwithANCFbeltDrive2.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/Examples/sliderCrank3DwithANCFbeltDrive2.py) (Ex), [`driveTrainTest.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/TestModels/driveTrainTest.py) (TM), [`sliderCrank3Dbenchmark.py`](https://github.com/jgerstmayr/EXUDYN/blob/master/python/TestModels/sliderCrank3Dbenchmark.py) (TM)