Archived OpenModelica forums. Posting is disabled.

Alternative forums include GitHub discussions or StackOverflow (make sure to read the Stack Overflow rules; you need to have well-formed questions)


Forgot password? | Forgot username? | Register
  • Index
  • » Users
  • » lberger
  • » Profile

Posts

Posts

Apr-06-17 15:41:43
animation of free body in space without any force

I managed to modify the FreeBody example from the mechanics multibody example, setting the two spring constants to 0 and the initial velocity to 1 m/s in e.g x-Direction.
But making the model simpler, no body appears in the animation and in the simulation the body seems not to move as expected.

Free Body with modified spring constants

Code:


within Modelica.Mechanics.MultiBody.Examples.Elementary;
model FreeBody "Free flying body attached by two springs to environment"
  extends Modelica.Icons.Example;
  parameter Boolean animation=true "= true, if animation shall be enabled";
  inner Modelica.Mechanics.MultiBody.World world(animateGravity = true, gravityType = Modelica.Mechanics.MultiBody.Types.GravityTypes.NoGravity)  annotation (Placement(
        transformation(extent={{-60,20},{-40,40}})));
  Modelica.Mechanics.MultiBody.Parts.FixedTranslation bar2(r={0.8,0,0}, animation=false)
    annotation (Placement(transformation(extent={{0,20},{20,40}})));
  Modelica.Mechanics.MultiBody.Forces.Spring spring1(
    width=0.1,
    coilWidth=0.005,
    numberOfWindings=5,
    c=0,
    s_unstretched=0) annotation (Placement(transformation(
        origin={-20,6},
        extent={{-10,-10},{10,10}},
        rotation=270)));
  Modelica.Mechanics.MultiBody.Parts.BodyShape body(
    m=1,
    I_11=1,
    I_22=1,
    I_33=1,
    r={0.4,0,0},
    r_CM={0.2,0,0},
    width=0.05,
    r_0(start={0.2,-0.5,0.1}, each fixed=true),
    v_0(each fixed=true),
    angles_fixed=true,
    w_0_fixed=true,
    angles_start={0.174532925199433,0.174532925199433,0.174532925199433})
    annotation (Placement(transformation(extent={{0,-40},{20,-20}})));
  Modelica.Mechanics.MultiBody.Forces.Spring spring2(
    c=0,
    s_unstretched=0,
    width=0.1,
    coilWidth=0.005,
    numberOfWindings=5) annotation (Placement(transformation(
        origin={40,6},
        extent={{-10,-10},{10,10}},
        rotation=270)));
equation
  connect(bar2.frame_a, world.frame_b)
    annotation (Line(
      points={{0,30},{-40,30}},
      color={95,95,95},
      thickness=0.5));
  connect(spring1.frame_b, body.frame_a) annotation (Line(
      points={{-20,-4},{-20,-30},{0,-30}},
      color={95,95,95},
      thickness=0.5));
  connect(bar2.frame_b, spring2.frame_a)
    annotation (Line(
      points={{20,30},{40,30},{40,16}},
      color={95,95,95},
      thickness=0.5));
  connect(spring1.frame_a, world.frame_b) annotation (Line(
      points={{-20,16},{-20,30},{-40,30}},
      color={95,95,95},
      thickness=0.5));
  connect(body.frame_b, spring2.frame_b) annotation (Line(
      points={{20,-30},{40,-30},{40,-4}},
      color={95,95,95},
      thickness=0.5));
  annotation (
    experiment(StopTime=10),
    Documentation(info="<html>
<p>
This example demonstrates:
</p>
<ul>
<li>The animation of spring and damper components</li>
<li>A body can be freely moving without any connection to a joint.
    In this case body coordinates are used automatically as
    states (whenever joints are present, it is first tried to
    use the generalized coordinates of the joints as states).</li>
<li>If a body is freely moving, the initial position and velocity of the body
    can be defined with the \"Initialization\" menu as shown with the
    body \"body1\" in the left part (click on \"Initialization\").</li>
</ul>

<IMG src=\"modelica://Modelica/Resources/Images/Mechanics/MultiBody/Examples/Elementary/FreeBody.png\"
ALT=\"model Examples.Elementary.FreeBody\">
</html>"));
end FreeBody;

Free Body simplified, not working

Code:


model Attitude_manover_body
  model MyBodyShape
    extends Modelica.Mechanics.MultiBody.Parts.BodyShape;
    /*    parameter Real down_To_Reach(unit = "m") = 1000, max_Velocity_Abs(min = 0, unit = "m/s") = 100,     acc_Abs(min = 0, unit = "m/s^2") = 9.81;
        Real velocity_Down(start = 0.0, unit = "m/s");
        Real acceleration_Down(unit = "m/s^2");
        Real abs_Down_To_Reach = abs(down_To_Reach);
        Real time_Start_Decelaration(unit = "s") = if max_Velocity_Abs * max_Velocity_Abs / acc_Abs >   abs_Down_To_Reach then sqrt(abs_Down_To_Reach / acc_Abs) else abs_Down_To_Reach / max_Velocity_Abs;
      equation
        v_0[3] = velocity_Down;
        a_0[3] = acceleration_Down; 
        acceleration_Down = acc_Abs * sign(down_To_Reach);
        when abs(velocity_Down) >= max_Velocity_Abs then
          reinit(acceleration_Down, 0);
        end when;
        when time > time_Start_Decelaration then
          reinit(acceleration_Down, -acc_Abs * sign(down_To_Reach));
        end when;
        when velocity_Down * sign(down_To_Reach) < 0 then
          reinit(acceleration_Down, 0);
        end when;*/
  end MyBodyShape;

  inner Modelica.Mechanics.MultiBody.World world(animateGravity = true, driveTrainMechanics3D = true, gravityType = Modelica.Mechanics.MultiBody.Types.GravityTypes.NoGravity) annotation(
    Placement(visible = true, transformation(extent = {{-70, 26}, {-50, 46}}, rotation = 0)));
  MyBodyShape body(I_11 = 1, I_22 = 1, I_33 = 1, angles_fixed = true, angles_start = {0.174532925199433, 0.174532925199433, 0.174532925199433}, m = 1, r = {0, 0, 0}, r_0(fixed = true, start = {0.0, 0.0, 0.0}), r_CM = {0.2, 0, 0}, v_0(fixed = true, start = {1.0,0.0,0.0}), w_0_fixed = true, width = 0.05) annotation(
    Placement(visible = true, transformation(extent = {{-16, 26}, {4, 46}}, rotation = 0)));
equation
  connect(world.frame_b, body.frame_a) annotation(
    Line(points = {{-50, 36}, {-16, 36}, {-16, 36}, {-16, 36}}, color = {95, 95, 95}));
end Attitude_manover_body;

Thanks in advance

Jan-16-17 14:40:32
How to deploy generated model code on controller/pc hardware

In the pdf file http://www.ida.liu.se/~petfr27/MODPROD2 … ystems.pdf there is the Modelica_EmbeddedSystem library mentioned, but through seach in the internet I have not found it. I'm interested in deploying some code e.g. to a linux machine, where the function results can be called for different time steps, e.g every 20 ms.

Thanks

Jan-15-17 18:00:15
with certain conditions in time different equations should apply
Category: Programming

The solution is, use 'when' and 'reinit':

replace
if abs(VD) >= V_MAX then
    AD = 0;
  end if;

with:
when abs(VD) >= V_MAX then
    reinit(AD, 0);
  end when;

Jan-15-17 11:37:53
with certain conditions in time different equations should apply
Category: Programming

In the simple model shown, the accelleration should be zero when V_MAX is reached. But in the simulation it doesn't happen. Using 'when' instead, the system becomes overdetermined.

model Attitude_manover
  parameter Real D_F = 1000, V_MAX = 100, G = 9.81;
  //Real N(start = 0);
  //Real E(start = 0);
  Real D(start = 0);
  //Real VN = 0;
  //Real VE = 100;
  Real VD(start = 0);
  Real AD;
equation
//  der(N) = VN;
//  der(E) = VE;
  der(D) = VD;
  der(VD) = AD;

  AD = G * sign(D_F); 
  if abs(VD) >= V_MAX then
    AD = 0;
  end if;
/*  when abs(D) > abs(D_F) then
    D = D_F;
  end when;
*/ 
end Attitude_manover;

  • Index
  • » Users
  • » lberger
  • » Profile
You are here: