This component consists of a universal joint at frame_a and
a spherical joint at frame_b that are connected together with
a rigid rod, see default aimation figure (the arrows are not
part of the default animation):
This joint aggregation has no mass and no inertia and introduces the constraint
that the distance between the origin of frame_a and the origin of frame_b is constant
(= Frames.length(rRod_ia)). The universal joint is defined in the following way:
- The rotation axis of revolute joint 1 is along parameter
vector n1_a which is fixed in frame_a.
-
- The rotation axis of revolute joint 2 is perpendicular to
axis 1 and to the line connecting the universal and the spherical joint.
The definition of axis 2 of the universal joint is performed according
to the most often occuring case. In a future release, axis 2 might
be explicitly definable via a parameter. However, the treatment is much more
complicated and the number of operations is considerably higher,
if axis 2 is not orthogonal to axis 1 and to the connecting rod.
Note, there is a singularity when axis 1 and the connecting rod are parallel
to other. Therefore, if possible n1_a should be selected in such a way that it
is perpendicular to rRod_ia in the initial configuration (i.e., the
distance to the singularity is as large as possible).
An additional frame_ia is present. It is fixed in the connecting
rod at the origin of frame_a. The placement of frame_ia on the rod
is implicitly defined by the universal joint (frame_a and frame_ia coincide
when the angles of the two revolute joints of the universal joint are zero)
and by parameter vector rRod_ia, the position vector
from the origin of frame_a to the origin of frame_b, resolved in frame_ia.
The easiest way to define the parameters of this joint is by moving the
MultiBody system in a reference configuration where all frames
of all components are parallel to other (alternatively,
at least frame_a and frame_ia of the UniversalSpherical joint
should be parallel to other when defining an instance of this
component). Since frame_a and frame_ia are parallel to other,
vector rRod_ia from frame_a to frame_b resolved in frame_ia can be resolved
in frame_a (or the world frame, if all frames are parallel to other).
This joint aggregation can be used in cases where
in reality a rod with spherical joints at end are present.
Such a system has an additional degree of freedom to rotate
the rod along its axis. In practice this rotation is usually
of no interested and is mathematically removed by replacing one
of the spherical joints by a universal joint. Still, in most
cases the Joints.SphericalSpherical joint aggregation can be used instead
of the UniversalSpherical joint
since the rod is animated and its mass properties are approximated by
a point mass in the middle of the rod. The SphericalSpherical joint
has the advantage that it does not have a singular configuration.
In the public interface of the UniversalSpherical joint, the following
(final) parameters are provided:
parameter Real rodLength(unit="m") "Length of rod";
parameter Real eRod_ia[3] "Unit vector along rod, resolved in frame_ia";
parameter Real e2_ia [3] "Unit vector along axis 2, resolved in frame_ia";
This allows a more convenient definition of data which is related to the rod.
For example, if a box shall be connected at frame_ia directing from
the origin of frame_a to the middle of the rod, this might be defined as:
Modelica.Mechanics.MultiBody.Joints.UniversalSpherical jointUS(rRod_ia={1.2, 1, 0.2});
Modelica.Mechanics.MultiBody.Visualizers.FixedShape shape(shapeType = "box",
lengthDirection = jointUS.eRod_ia,
widthDirection = jointUS.e2_ia,
length = jointUS.rodLength/2,
width = jointUS.rodLength/10);
equation
connect(jointUS.frame_ia, shape.frame_a);