This component consists of a universal joint at frame_a, a revolute
joint at frame_b and a spherical joint which is connected via rod1
to the universal and via rod2 to the revolute joint, see the default
animation in the following figure (the axes vectors are not part of the
default animation):
This joint aggregation has no mass and no inertia and
introduces neither constraints nor potential state variables.
It should be used in kinematic loops whenever possible since
the non-linear system of equations introduced by this joint aggregation
is solved analytically (i.e., a solution is always computed, if a
unique solution exists).
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
(= rod 1).
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 each other. Therefore, if possible n1_a should be selected in such a way that it
is perpendicular to rRod1_ia in the initial configuration (i.e., the
distance to the singularity is as large as possible).
The rest of this joint aggregation is defined by the following parameters:
- The position of the spherical joint with respect to the universal
joint is defined by vector rRod1_ia. This vector is directed from
frame_a to the spherical joint and is resolved in frame_ia
(it is most simple to select frame_ia such that it is parallel to
frame_a in the reference or initial configuration).
- The position of the spherical joint with respect to the revolute
joint is defined by vector rRod2_ib. This vector is directed from
the inner frame of the revolute joint (frame_ib or revolute.frame_a)
to the spherical joint and is resolved in frame_ib (note, that frame_ib
and frame_b are parallel to each other).
- The axis of rotation of the revolute joint is defined by axis
vector n_b. It is fixed and resolved in frame_b.
- When specifying this joint aggregation with the definitions above, two
different configurations are possible. Via parameter phi_guess
a guess value for revolute.phi(t0) at the initial time t0 is given. The configuration
is selected that is closest to phi_guess (|revolute.phi - phi_guess|is minimal).
An additional frame_ia is present. It is fixed in the rod
connecting the universal and the spherical joint 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 rRod1_ia, the position vector
from the origin of frame_a to the spherical joint, resolved in frame_ia.
An additional
frame_ib is present. It is
fixed in the rod
connecting the revolute and the spherical joint at the side of the revolute
joint that is connected to this rod (= rod2.frame_a = revolute.frame_a).
An additional frame_im is present. It is fixed in the rod
connecting the revolute and the spherical joint at the side of the spherical
joint that is connected to this rod (= rod2.frame_b).
It is always parallel to frame_ib.
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 each other (alternatively,
at least frame_a and frame_ia of the JointUSR joint
should be parallel to each other when defining an instance of this
component).
In the public interface of the JointUSR joint, the following
(final) parameters are provided:
parameter Real rod1Length(unit="m") "Length of rod 1";
parameter Real eRod1_ia[3] "Unit vector along rod 1, 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 rod 1.
For example, if a box shall be connected at frame_ia directing from
the origin of frame_a to the middle of rod 1, this might be defined as:
Modelica.Mechanics.MultiBody.Joints.Assemblies.JointUSP jointUSR(rRod1_ia={1.2, 1, 0.2});
Modelica.Mechanics.MultiBody.Visualizers.FixedShape shape(shapeType = "box",
lengthDirection = jointUSR.eRod1_ia,
widthDirection = jointUSR.e2_ia,
length = jointUSR.rod1Length/2,
width = jointUSR.rod1Length/10);
equation
connect(jointUSP.frame_ia, shape.frame_a);