FreeMotionScalarInit

model FreeMotionScalarInit "Free motion joint with scalar initialization and state selection (6 degrees-of-freedom, 12 potential states)"
    extends Modelica.Mechanics.MultiBody.Interfaces.PartialTwoFrames;

    parameter Boolean animation = true "= true, if animation shall be enabled (show arrow from frame_a to frame_b)"
        annotation (Dialog(enable = use_r));
    parameter Boolean use_r = false "= true, if r_rel_a shall be used"
        annotation (
            Evaluate = true,
            HideResult = true,
            Dialog(
                tab = "Translational Initialization",
                group = "Position vector r_rel_a from origin of frame_a to origin of frame_b, resolved in frame_a"));
    Modelica.Blocks.Interfaces.RealOutput r_rel_a_1(final quantity = "Length", final unit = "m", start = 0, final stateSelect = r_rel_a_1_stateSelect) if use_r "Relative distance r_rel_a[1]"
        annotation (Dialog(
            enable = use_r,
            tab = "Translational Initialization",
            group = "Position vector r_rel_a from origin of frame_a to origin of frame_b, resolved in frame_a",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput r_rel_a_2(final quantity = "Length", final unit = "m", start = 0, final stateSelect = r_rel_a_2_stateSelect) if use_r "Relative distance r_rel_a[2]"
        annotation (Dialog(
            enable = use_r,
            tab = "Translational Initialization",
            group = "Position vector r_rel_a from origin of frame_a to origin of frame_b, resolved in frame_a",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput r_rel_a_3(final quantity = "Length", final unit = "m", start = 0, final stateSelect = r_rel_a_3_stateSelect) if use_r "Relative distance r_rel_a[3]"
        annotation (Dialog(
            enable = use_r,
            tab = "Translational Initialization",
            group = "Position vector r_rel_a from origin of frame_a to origin of frame_b, resolved in frame_a",
            showStartAttribute = true));
    parameter StateSelect r_rel_a_1_stateSelect = StateSelect.never "StateSelect of r_rel_a[1]"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_r,
                tab = "Translational Initialization",
                group = "Position vector r_rel_a from origin of frame_a to origin of frame_b, resolved in frame_a"));
    parameter StateSelect r_rel_a_2_stateSelect = StateSelect.never "StateSelect of r_rel_a[2]"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_r,
                tab = "Translational Initialization",
                group = "Position vector r_rel_a from origin of frame_a to origin of frame_b, resolved in frame_a"));
    parameter StateSelect r_rel_a_3_stateSelect = StateSelect.never "StateSelect of r_rel_a[3]"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_r,
                tab = "Translational Initialization",
                group = "Position vector r_rel_a from origin of frame_a to origin of frame_b, resolved in frame_a"));
    parameter Boolean use_v = false "= true, if v_rel_a shall be used"
        annotation (
            Evaluate = true,
            HideResult = true,
            Dialog(
                enable = use_r,
                tab = "Translational Initialization",
                group = "Velocity vector v_rel_a = der(r_rel_a)"));
    Modelica.Blocks.Interfaces.RealOutput v_rel_a_1(final quantity = "Velocity", final unit = "m/s", start = 0, final stateSelect = v_rel_a_1_stateSelect) if use_r and use_v "Relative velocity v_rel_a[1]"
        annotation (Dialog(
            enable = use_r and use_v,
            tab = "Translational Initialization",
            group = "Velocity vector v_rel_a = der(r_rel_a)",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput v_rel_a_2(final quantity = "Velocity", final unit = "m/s", start = 0, final stateSelect = v_rel_a_2_stateSelect) if use_r and use_v "Relative velocity v_rel_a[2]"
        annotation (Dialog(
            enable = use_r and use_v,
            tab = "Translational Initialization",
            group = "Velocity vector v_rel_a = der(r_rel_a)",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput v_rel_a_3(final quantity = "Velocity", final unit = "m/s", start = 0, final stateSelect = v_rel_a_3_stateSelect) if use_r and use_v "Relative velocity v_rel_a[3]"
        annotation (Dialog(
            enable = use_r and use_v,
            tab = "Translational Initialization",
            group = "Velocity vector v_rel_a = der(r_rel_a)",
            showStartAttribute = true));
    parameter StateSelect v_rel_a_1_stateSelect = StateSelect.never "StateSelect of v_rel_a[1]"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_r and use_v,
                tab = "Translational Initialization",
                group = "Velocity vector v_rel_a = der(r_rel_a)"));
    parameter StateSelect v_rel_a_2_stateSelect = StateSelect.never "StateSelect of v_rel_a[2]"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_r and use_v,
                tab = "Translational Initialization",
                group = "Velocity vector v_rel_a = der(r_rel_a)"));
    parameter StateSelect v_rel_a_3_stateSelect = StateSelect.never "StateSelect of v_rel_a[3]"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_r and use_v,
                tab = "Translational Initialization",
                group = "Velocity vector v_rel_a = der(r_rel_a)"));
    parameter Boolean use_a = false "= true, if a_rel_a shall be used"
        annotation (
            Evaluate = true,
            HideResult = true,
            Dialog(
                enable = use_r and use_v,
                tab = "Translational Initialization",
                group = "Acceleration vector a_rel_a = der(v_rel_a)"));
    Modelica.Blocks.Interfaces.RealOutput a_rel_a_1(final quantity = "Acceleration", final unit = "m/s2", start = 0) if use_r and use_v and use_a "Relative acceleration a_rel_a[1]"
        annotation (Dialog(
            enable = use_r and use_v and use_a,
            tab = "Translational Initialization",
            group = "Acceleration vector a_rel_a = der(v_rel_a)",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput a_rel_a_2(final quantity = "Acceleration", final unit = "m/s2", start = 0) if use_r and use_v and use_a "Relative acceleration a_rel_a[2]"
        annotation (Dialog(
            enable = use_r and use_v and use_a,
            tab = "Translational Initialization",
            group = "Acceleration vector a_rel_a = der(v_rel_a)",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput a_rel_a_3(final quantity = "Acceleration", final unit = "m/s2", start = 0) if use_r and use_v and use_a "Relative acceleration a_rel_a[3]"
        annotation (Dialog(
            enable = use_r and use_v and use_a,
            tab = "Translational Initialization",
            group = "Acceleration vector a_rel_a = der(v_rel_a)",
            showStartAttribute = true));
    parameter Boolean use_angle = false "= true, if angle shall be used"
        annotation (
            Evaluate = true,
            HideResult = true,
            Dialog(
                tab = "Angle Initialization",
                group = "Angles to rotate frame_a to frame_b along sequence_start"));
    parameter Types.RotationSequence sequence_start = {1, 2, 3} "Sequence of angle rotations"
        annotation (
            Evaluate = true,
            Dialog(
                enable = use_angle,
                tab = "Angle Initialization",
                group = "Angles to rotate frame_a to frame_b along sequence_start"));
    Modelica.Blocks.Interfaces.RealOutput angle_1(final quantity = "Angle", final unit = "rad", start = 0, stateSelect = angle_1_stateSelect) if use_angle "First rotation angle or dummy"
        annotation (Dialog(
            enable = use_angle,
            tab = "Angle Initialization",
            group = "Angles to rotate frame_a to frame_b along sequence_start",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput angle_2(final quantity = "Angle", final unit = "rad", start = 0, stateSelect = angle_2_stateSelect) if use_angle "Second rotation angle or dummy"
        annotation (Dialog(
            enable = use_angle,
            tab = "Angle Initialization",
            group = "Angles to rotate frame_a to frame_b along sequence_start",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput angle_3(final quantity = "Angle", final unit = "rad", start = 0, stateSelect = angle_3_stateSelect) if use_angle "Third rotation angle or dummy"
        annotation (Dialog(
            enable = use_angle,
            tab = "Angle Initialization",
            group = "Angles to rotate frame_a to frame_b along sequence_start",
            showStartAttribute = true));
    parameter StateSelect angle_1_stateSelect = StateSelect.never "StateSelect of angle_1"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_angle,
                tab = "Angle Initialization",
                group = "Angles to rotate frame_a to frame_b along sequence_start"));
    parameter StateSelect angle_2_stateSelect = StateSelect.never "StateSelect of angle_2"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_angle,
                tab = "Angle Initialization",
                group = "Angles to rotate frame_a to frame_b along sequence_start"));
    parameter StateSelect angle_3_stateSelect = StateSelect.never "StateSelect of angle_3"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_angle,
                tab = "Angle Initialization",
                group = "Angles to rotate frame_a to frame_b along sequence_start"));
    parameter Boolean use_angle_d = false "= true, if angle_d shall be used"
        annotation (
            Evaluate = true,
            HideResult = true,
            Dialog(
                enable = use_angle,
                tab = "Angle Initialization",
                group = "angle_d = der(angle)"));
    Modelica.Blocks.Interfaces.RealOutput angle_d_1(final quantity = "AngularVelocity", final unit = "rad/s", start = 0, final stateSelect = angle_d_1_stateSelect) if use_angle and use_angle_d "= der(angle_1)"
        annotation (Dialog(
            enable = use_angle and use_angle_d,
            tab = "Angle Initialization",
            group = "angle_d = der(angle)",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput angle_d_2(final quantity = "AngularVelocity", final unit = "rad/s", start = 0, final stateSelect = angle_d_2_stateSelect) if use_angle and use_angle_d "= der(angle_2)"
        annotation (Dialog(
            enable = use_angle and use_angle_d,
            tab = "Angle Initialization",
            group = "angle_d = der(angle)",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput angle_d_3(final quantity = "AngularVelocity", final unit = "rad/s", start = 0, final stateSelect = angle_d_3_stateSelect) if use_angle and use_angle_d "= der(angle_3)"
        annotation (Dialog(
            enable = use_angle and use_angle_d,
            tab = "Angle Initialization",
            group = "angle_d = der(angle)",
            showStartAttribute = true));
    parameter StateSelect angle_d_1_stateSelect = StateSelect.never "StateSelect of angle_d_1"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_angle and use_angle_d,
                tab = "Angle Initialization",
                group = "angle_d = der(angle)"));
    parameter StateSelect angle_d_2_stateSelect = StateSelect.never "StateSelect of angle_d_2"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_angle and use_angle_d,
                tab = "Angle Initialization",
                group = "angle_d = der(angle)"));
    parameter StateSelect angle_d_3_stateSelect = StateSelect.never "StateSelect of angle_d_3"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_angle and use_angle_d,
                tab = "Angle Initialization",
                group = "angle_d = der(angle)"));
    parameter Boolean use_angle_dd = false "= true, if angle_dd shall be used"
        annotation (
            Evaluate = true,
            HideResult = true,
            Dialog(
                enable = use_angle and use_angle_d,
                tab = "Angle Initialization",
                group = "angle_dd = der(angle_d)"));
    Modelica.Blocks.Interfaces.RealOutput angle_dd_1(final quantity = "AngularAcceleration", final unit = "rad/s2", start = 0) if use_angle and use_angle_d and use_angle_dd "= der(angle_d_1)"
        annotation (Dialog(
            enable = use_angle and use_angle_d and use_angle_dd,
            tab = "Angle Initialization",
            group = "angle_dd = der(angle_d)",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput angle_dd_2(final quantity = "AngularAcceleration", final unit = "rad/s2", start = 0) if use_angle and use_angle_d and use_angle_dd "= der(angle_d_2)"
        annotation (Dialog(
            enable = use_angle and use_angle_d and use_angle_dd,
            tab = "Angle Initialization",
            group = "angle_dd = der(angle_d)",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput angle_dd_3(final quantity = "AngularAcceleration", final unit = "rad/s2", start = 0) if use_angle and use_angle_d and use_angle_dd "= der(angle_d_3)"
        annotation (Dialog(
            enable = use_angle and use_angle_d and use_angle_dd,
            tab = "Angle Initialization",
            group = "angle_dd = der(angle_d)",
            showStartAttribute = true));
    parameter Boolean use_w = false "= true, if w_rel_b shall be used"
        annotation (
            Evaluate = true,
            HideResult = true,
            Dialog(
                tab = "Angular Velocity Initialization",
                group = "Angular velocity w_rel_b of frame_b with respect to frame_a, resolved in frame_b"));
    Modelica.Blocks.Interfaces.RealOutput w_rel_b_1(final quantity = "AngularVelocity", final unit = "rad/s", start = 0, stateSelect = w_rel_b_1_stateSelect) if use_w "Relative angular velocity w_rel_b[1]"
        annotation (Dialog(
            enable = use_w,
            tab = "Angular Velocity Initialization",
            group = "Angular velocity w_rel_b of frame_b with respect to frame_a, resolved in frame_b",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput w_rel_b_2(final quantity = "AngularVelocity", final unit = "rad/s", start = 0, stateSelect = w_rel_b_2_stateSelect) if use_w "Relative angular velocity w_rel_b[2]"
        annotation (Dialog(
            enable = use_w,
            tab = "Angular Velocity Initialization",
            group = "Angular velocity w_rel_b of frame_b with respect to frame_a, resolved in frame_b",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput w_rel_b_3(final quantity = "AngularVelocity", final unit = "rad/s", start = 0, stateSelect = w_rel_b_3_stateSelect) if use_w "Relative angular velocity w_rel_b[3]"
        annotation (Dialog(
            enable = use_w,
            tab = "Angular Velocity Initialization",
            group = "Angular velocity w_rel_b of frame_b with respect to frame_a, resolved in frame_b",
            showStartAttribute = true));
    parameter StateSelect w_rel_b_1_stateSelect = StateSelect.never "StateSelect of w_rel_b[1]"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_w,
                tab = "Angular Velocity Initialization",
                group = "Angular velocity w_rel_b of frame_b with respect to frame_a, resolved in frame_b"));
    parameter StateSelect w_rel_b_2_stateSelect = StateSelect.never "StateSelect of w_rel_b[2]"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_w,
                tab = "Angular Velocity Initialization",
                group = "Angular velocity w_rel_b of frame_b with respect to frame_a, resolved in frame_b"));
    parameter StateSelect w_rel_b_3_stateSelect = StateSelect.never "StateSelect of w_rel_b[3]"
        annotation (
            HideResult = true,
            Dialog(
                enable = use_w,
                tab = "Angular Velocity Initialization",
                group = "Angular velocity w_rel_b of frame_b with respect to frame_a, resolved in frame_b"));
    parameter Boolean use_z = false "= true, if z_rel_b shall be used"
        annotation (
            Evaluate = true,
            HideResult = true,
            Dialog(
                enable = use_w,
                tab = "Angular Velocity Initialization",
                group = "Angular acceleration z_rel_b = der(w_rel_b)"));
    Modelica.Blocks.Interfaces.RealOutput z_rel_b_1(final quantity = "AngularAcceleration", final unit = "rad/s2", start = 0) if use_w and use_z "Relative angular acceleration z_rel_b[1]"
        annotation (Dialog(
            enable = use_w and use_z,
            tab = "Angular Velocity Initialization",
            group = "Angular acceleration z_rel_b = der(w_rel_b)",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput z_rel_b_2(final quantity = "AngularAcceleration", final unit = "rad/s2", start = 0) if use_w and use_z "Relative angular acceleration z_rel_b[2]"
        annotation (Dialog(
            enable = use_w and use_z,
            tab = "Angular Velocity Initialization",
            group = "Angular acceleration z_rel_b = der(w_rel_b)",
            showStartAttribute = true));
    Modelica.Blocks.Interfaces.RealOutput z_rel_b_3(final quantity = "AngularAcceleration", final unit = "rad/s2", start = 0) if use_w and use_z "Relative angular acceleration z_rel_b[3]"
        annotation (Dialog(
            enable = use_w and use_z,
            tab = "Angular Velocity Initialization",
            group = "Angular acceleration z_rel_b = der(w_rel_b)",
            showStartAttribute = true));
    parameter SI.Length arrowDiameter = world.defaultArrowDiameter "Diameter of arrow from frame_a to frame_b"
        annotation (Dialog(
            tab = "Animation",
            group = "if animation = true",
            enable = animation and use_r));
    input Types.Color arrowColor = Modelica.Mechanics.MultiBody.Types.Defaults.SensorColor "Color of arrow"
        annotation (Dialog(
            colorSelector = true,
            tab = "Animation",
            group = "if animation = true",
            enable = animation and use_r));
    input Types.SpecularCoefficient specularCoefficient = world.defaultSpecularCoefficient "Reflection of ambient light (= 0: light is completely absorbed)"
        annotation (Dialog(
            tab = "Animation",
            group = "if animation = true",
            enable = animation and use_r));
protected
    Modelica.Mechanics.MultiBody.Joints.Internal.InitPosition initPosition(r_a_0 = frame_a.r_0, r_b_0 = frame_b.r_0, R_a = frame_a.R) if use_r annotation (Placement(transformation(extent = {
        {-20, 60}, 
        {0, 80}})));
    Modelica.Mechanics.MultiBody.Joints.Internal.InitAngle initAngle(sequence_start = sequence_start) if use_angle annotation (Placement(transformation(extent = {
        {-60, -10}, 
        {-40, 10}})));
    Modelica.Mechanics.MultiBody.Joints.Internal.InitAngularVelocity initAngularVelocity(R_a = frame_a.R, R_b = frame_b.R) if use_w annotation (Placement(transformation(extent = {
        {-20, 20}, 
        {0, 40}})));
    Modelica.Blocks.Continuous.Der derv[3] if use_r and use_v annotation (Placement(transformation(extent = {
        {20, 60}, 
        {40, 80}})));
    Modelica.Blocks.Continuous.Der dera[3] if use_r and use_v and use_a annotation (Placement(transformation(extent = {
        {60, 60}, 
        {80, 80}})));
    Modelica.Blocks.Continuous.Der derd[3] if use_angle and use_angle_d annotation (Placement(transformation(extent = {
        {-20, -30}, 
        {0, -10}})));
    Modelica.Blocks.Continuous.Der derdd[3] if use_angle and use_angle_d and use_angle_dd annotation (Placement(transformation(extent = {
        {20, -30}, 
        {40, -10}})));
    Modelica.Blocks.Continuous.Der derz[3] if use_w and use_z annotation (Placement(transformation(extent = {
        {20, 20}, 
        {40, 40}})));
    Modelica.Mechanics.MultiBody.Sensors.Internal.ZeroForceAndTorque zeroForceAndTorque1 annotation (Placement(transformation(extent = {
        {-80, -50}, 
        {-60, -30}})));
    Modelica.Mechanics.MultiBody.Sensors.Internal.ZeroForceAndTorque zeroForceAndTorque2 annotation (Placement(transformation(extent = {
        {80, -50}, 
        {60, -30}})));
    Modelica.Mechanics.MultiBody.Visualizers.SignalArrow arrow(diameter = arrowDiameter, color = arrowColor, specularCoefficient = specularCoefficient) if world.enableAnimation and animation and use_r annotation (Placement(transformation(extent = {
        {-80, 60}, 
        {-60, 80}})));
equation
    connect(initAngle.angle[1],angle_1);
    connect(initAngle.angle[2],angle_2);
    connect(initAngle.angle[3],angle_3);
    connect(initPosition.r_rel_a[1],r_rel_a_1);
    connect(initPosition.r_rel_a[2],r_rel_a_2);
    connect(initPosition.r_rel_a[3],r_rel_a_3);
    connect(initAngularVelocity.w_rel_b[1],w_rel_b_1);
    connect(initAngularVelocity.w_rel_b[2],w_rel_b_2);
    connect(initAngularVelocity.w_rel_b[3],w_rel_b_3);
    connect(dera[1].y,a_rel_a_1);
    connect(dera[2].y,a_rel_a_2);
    connect(dera[3].y,a_rel_a_3);
    connect(derd[1].y,angle_d_1);
    connect(derd[2].y,angle_d_2);
    connect(derd[3].y,angle_d_3);
    connect(derdd[1].y,angle_dd_1);
    connect(derdd[2].y,angle_dd_2);
    connect(derdd[3].y,angle_dd_3);
    connect(derv[1].y,v_rel_a_1);
    connect(derv[2].y,v_rel_a_2);
    connect(derv[3].y,v_rel_a_3);
    connect(derz[1].y,z_rel_b_1);
    connect(derz[2].y,z_rel_b_2);
    connect(derz[3].y,z_rel_b_3);
    connect(frame_a,arrow.frame_a) annotation (Line(
        points = {
            {-100, 0}, 
            {-88, 0}, 
            {-88, 70}, 
            {-80, 70}},
        color = {95, 95, 95},
        thickness = 0.5));
    connect(derd.y,derdd.u) annotation (Line(
        points = {
            {1, -20}, 
            {18, -20}},
        color = {0, 0, 127}));
    connect(derv.y,dera.u) annotation (Line(
        points = {
            {41, 70}, 
            {58, 70}},
        color = {0, 0, 127}));
    connect(initAngle.angle,derd.u) annotation (Line(
        points = {
            {-50, -11}, 
            {-50, -20}, 
            {-22, -20}},
        color = {0, 0, 127}));
    connect(initAngle.frame_a,frame_a) annotation (Line(
        points = {
            {-60, 0}, 
            {-100, 0}},
        color = {95, 95, 95},
        thickness = 0.5));
    connect(initAngle.frame_b,frame_b) annotation (Line(
        points = {
            {-40, 0}, 
            {100, 0}},
        color = {95, 95, 95},
        thickness = 0.5));
    connect(initPosition.r_rel_a,arrow.r_head) annotation (Line(
        points = {
            {1, 70}, 
            {10, 70}, 
            {10, 52}, 
            {-70, 52}, 
            {-70, 58}},
        color = {0, 0, 127}));
    connect(initPosition.r_rel_a,derv.u) annotation (Line(
        points = {
            {1, 70}, 
            {18, 70}},
        color = {0, 0, 127}));
    connect(initAngularVelocity.w_rel_b,derz.u) annotation (Line(
        points = {
            {1, 30}, 
            {18, 30}},
        color = {0, 0, 127}));
    connect(zeroForceAndTorque1.frame_a,frame_a) annotation (Line(
        points = {
            {-80, -40}, 
            {-88, -40}, 
            {-88, 0}, 
            {-100, 0}},
        color = {95, 95, 95},
        thickness = 0.5));
    connect(zeroForceAndTorque2.frame_a,frame_b) annotation (Line(
        points = {
            {80, -40}, 
            {90, -40}, 
            {90, 0}, 
            {100, 0}},
        color = {95, 95, 95},
        thickness = 0.5));

    annotation (
        Documentation(info = "<html>\n<p>\nJoint which does not constrain the motion between frame_a and frame_b.\nSuch a joint is meaningful if the <strong>relative</strong> distance and orientation\nbetween frame_a and frame_b, and their derivatives, shall be used\nas <strong>states</strong> or shall be used for non-standard\n<strong>initialization</strong>. This joint allows to <strong>initialize</strong>\nevery <strong>scalar</strong> element of the relative quantities, as well\nas to define <strong>StateSelect</strong> attributes for every\n<strong>scalar</strong> element separately.\n</p>\n\n<p>\nIn the following figure the animation of a FreeMotionScalarInit\njoint is shown. The light blue coordinate system is\nframe_a and the dark blue coordinate system is\nframe_b of the joint.\n(here: r_rel_a_1(start = 0.5), r_rel_a_2(start = 0), r_rel_a_3(start = 0.5),\n       angle_1(start = 45<sup>o</sup>), angle_2(start = 45<sup>o</sup>), angle_3(start = 45<sup>o</sup>)).\n</p>\n\n<p>\n<img src=\"modelica://Modelica/Resources/Images/Mechanics/MultiBody/Joints/FreeMotion.png\">\n</p>\n\n<p>\nA example to use this joint for the initialization of a planar double pendulum by providing\nits tip position, is shown in\n<a href=\"modelica://Modelica.Mechanics.MultiBody.Examples.Elementary.DoublePendulumInitTip\">Examples.Elementary.DoublePendulumInitTip</a>.\n</p>\n</html>"),
        Icon(
            coordinateSystem(
                preserveAspectRatio = true,
                extent = {
                    {-100, -100}, 
                    {100, 100}}),
            graphics = {
                Line(
                    points = {
                        {-86, 31}, 
                        {-74, 61}, 
                        {-49, 83}, 
                        {-17, 92}, 
                        {19, 88}, 
                        {40, 69}, 
                        {59, 48}},
                    color = {160, 160, 164},
                    thickness = 0.5,
                    smooth = Smooth.Bezier), 
                Polygon(
                    points = {
                        {90, 0}, 
                        {50, 20}, 
                        {50, -20}, 
                        {90, 0}},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid), 
                Polygon(
                    points = {
                        {69, 58}, 
                        {49, 40}, 
                        {77, 28}, 
                        {69, 58}},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid), 
                Text(
                    extent = {
                        {150, -44}, 
                        {-150, -84}},
                    lineColor = {0, 0, 255},
                    textString = "%name"), 
                Rectangle(
                    extent = {
                        {-70, -5}, 
                        {-90, 5}},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid), 
                Rectangle(
                    extent = {
                        {50, -5}, 
                        {30, 5}},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid), 
                Rectangle(
                    extent = {
                        {11, -5}, 
                        {-9, 5}},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid), 
                Rectangle(
                    extent = {
                        {-30, -5}, 
                        {-50, 5}},
                    fillColor = {192, 192, 192},
                    fillPattern = FillPattern.Solid)}));
end FreeMotionScalarInit;