# Body

Rigid body with mass, inertia tensor and one frame connector (12 potential states)

## Library

Modelica/Mechanics/MultiBody/Parts

## Description

**Rigid body** with mass and inertia tensor.
All parameter vectors have to be resolved in frame_a.
The **inertia tensor** has to be defined with respect to a
coordinate system that is parallel to frame_a with the
origin at the center of mass of the body.

By default, this component is visualized by a **cylinder** located
between frame_a and the center of mass and by a **sphere** that has
its center at the center of mass. If the cylinder length is smaller as
the radius of the sphere, e.g., since frame_a is located at the
center of mass, the cylinder is not displayed. Note, that
the animation may be switched off via parameter animation = **false**.

**States of Body Components**

Every body has potential states. If possible a tool will select the states of joints and not the states of bodies because this is usually the most efficient choice. In this case the position, orientation, velocity and angular velocity of frame_a of the body will be computed by the component that is connected to frame_a. However, if a body is moving freely in space, variables of the body have to be used as states. The potential states of the body are:

- The
**position vector**frame_a.r_0 from the origin of the world frame to the origin of frame_a of the body, resolved in the world frame and the**absolute velocity**v_0 of the origin of frame_a, resolved in the world frame (= der(frame_a.r_0)). - If parameter
**useQuaternions**in the "Advanced" menu is**true**(this is the default), then**4 quaternions**are potential states. Additionally, the coordinates of the absolute angular velocity vector of the body are 3 potential states.

If**useQuaternions**in the "Advanced" menu is**false**, then**3 angles**and the derivatives of these angles are potential states. The orientation of frame_a is computed by rotating the world frame along the axes defined in parameter vector "sequence_angleStates" (default = {1,2,3}, i.e., the Cardan angle sequence) around the angles used as potential states. For example, the default is to rotate the x-axis of the world frame around angles[1], the new y-axis around angles[2] and the new z-axis around angles[3], arriving at frame_a.

The quaternions have the slight disadvantage that there is a
non-linear constraint equation between the 4 quaternions.
Therefore, at least one non-linear equation has to be solved
during simulation. A tool might, however, analytically solve this
simple constraint equation. Using the 3 angles as states has the
disadvantage that there is a singular configuration in which a
division by zero will occur. If it is possible to determine in advance
for an application class that this singular configuration is outside
of the operating region, the 3 angles might be used as potential
states by setting **useQuaternions** = **false**.

In text books about 3-dimensional mechanics often 3 angles and the angular velocity are used as states. This is not the case here, since 3 angles and their derivatives are used as potential states (if useQuaternions = false). The reason is that for real-time simulation the discretization formula of the integrator might be "inlined" and solved together with the body equations. By appropriate symbolic transformation the performance is drastically increased if angles and their derivatives are used as states, instead of angles and the angular velocity.

Whether or not variables of the body are used as states is usually
automatically selected by the Modelica translator. If parameter
**enforceStates** is set to **true** in the "Advanced" menu,
then body variables are forced to be used as states according
to the setting of parameters "useQuaternions" and
"sequence_angleStates".

## Parameters

Name | Label | Description | Data Type | Valid Values |
---|---|---|---|---|

| animation | = true, if animation shall be enabled (show cylinder and sphere) | Scalar | true |

| r_CM | Vector from frame_a to center of mass, resolved in frame_a | Vector of size 3 | |

| m | Mass of rigid body | Scalar | |

| I_11 | (1,1) element of inertia tensor | Scalar | |

| I_22 | (2,2) element of inertia tensor | Scalar | |

| I_33 | (3,3) element of inertia tensor | Scalar | |

| I_21 | (2,1) element of inertia tensor | Scalar | |

| I_31 | (3,1) element of inertia tensor | Scalar | |

| I_32 | (3,2) element of inertia tensor | Scalar | |

| I | inertia tensor | Matrix of size 3x3 | |

| R_start | Orientation object from world frame to frame_a at initial time | FromModelica('Modelica.Mechanics.MultiBody.Frames.Orientation') | |

| z_a_start | Initial values of angular acceleration z_a = der(w_a), i.e., time derivative of angular velocity resolved in frame_a | Vector of size 3 | |

| Q_start | Quaternion orientation object from world frame to frame_a at initial time | Vector of size 4 | |

| phi_start | Potential angle states at initial time | Vector of size 3 |

Name | Label | Description | Data Type | Valid Values |
---|---|---|---|---|

| angles_fixed | = true, if angles_start are used as initial values, else as guess values | Scalar | true |

| angles_start | Initial values of angles to rotate frame_a around 'sequence_start' axes into frame_b | Vector of size 3 | |

| sequence_start | Sequence of rotations to rotate frame_a into frame_b at initial time | Vector of size 3 | |

| w_0_fixed | = true, if w_0_start are used as initial values, else as guess values | Scalar | true |

| w_0_start | Initial or guess values of angular velocity of frame_a resolved in world frame | Vector of size 3 | |

| z_0_fixed | = true, if z_0_start are used as initial values, else as guess values | Scalar | true |

| z_0_start | Initial values of angular acceleration z_0 = der(w_0) | Vector of size 3 |

Name | Label | Description | Data Type | Valid Values |
---|---|---|---|---|

| sphereDiameter | Diameter of sphere | Scalar | |

| sphereColor | Color of sphere | Vector of size 3 | |

| cylinderDiameter | Diameter of cylinder | Scalar | |

| cylinderColor | Color of cylinder | Vector of size 3 | |

| specularCoefficient | Reflection of ambient light (= 0: light is completely absorbed) | Scalar |

Name | Label | Description | Data Type | Valid Values |
---|---|---|---|---|

| enforceStates | = true, if absolute variables of body object shall be used as states (StateSelect.always) | Scalar | true |

| useQuaternions | = true, if quaternions shall be used as potential states otherwise use 3 angles as potential states | Scalar | true |

| sequence_angleStates | Sequence of rotations to rotate world frame into frame_a around the 3 angles used as potential states | Vector of size 3 |

Name | Label | Description | Data Type | Valid Values |
---|---|---|---|---|

| r_0 | r_0 | Structure | |

| fixed | Cell of vectors of size 3 | true | |

| start | Cell of vectors of size 3 | ||

| v_0 | v_0 | Structure | |

| fixed | Cell of vectors of size 3 | true | |

| start | Cell of vectors of size 3 | ||

| a_0 | a_0 | Structure | |

| fixed | Cell of vectors of size 3 | true | |

| start | Cell of vectors of size 3 | ||

| w_a | w_a | Structure | |

| fixed | Cell of vectors of size 3 | true | |

| start | Cell of vectors of size 3 | ||

| z_a | z_a | Structure | |

| fixed | Cell of vectors of size 3 | true | |

| start | Cell of vectors of size 3 | ||

| g_0 | g_0 | Structure | |

| fixed | Cell of vectors of size 3 | true | |

| start | Cell of vectors of size 3 |

## Ports

Name | Type | Description | IO Type | Number |
---|---|---|---|---|

| implicit | Coordinate system fixed at body | input | 1 |