These examples demonstrate the usage of the PlanarMechanics library.
For all these examples the following simulation setup is proposed.
Name | Description |
---|---|
![]() | double pendulum |
![]() | free body on spring |
![]() | kinematic loop with 4 revolute joints |
![]() | kinematic loop |
![]() | a simple pendulum |
![]() | model of a free crane crab |
The model is confronted with its equivalence of the Modelica.Mechanics.MultiBody library.
model DoublePendulum "double pendulum" extends Modelica.Icons.Example; PlanarMechanics.Parts.Fixed Fixed1; PlanarMechanics.Joints.Revolute Revolute1(initType=Modelica.Mechanics. MultiBody.Types.Init.PositionVelocity); PlanarMechanics.Parts.FixedTranslation FixedTranslation1(r={2,2}); inner Modelica.Mechanics.MultiBody.World world(nominalLength=5); Modelica.Mechanics.MultiBody.Parts.Fixed Fixed2(r={0,0,-1}); Modelica.Mechanics.MultiBody.Parts.FixedTranslation FixedTranslation2(r={2,2, 0}); Modelica.Mechanics.MultiBody.Joints.Revolute Revolute2(initType= Modelica.Mechanics.MultiBody.Types.Init.PositionVelocity); PlanarMechanics.Joints.Revolute Revolute3(initType=Modelica.Mechanics. MultiBody.Types.Init.PositionVelocity); PlanarMechanics.Parts.FixedTranslation FixedTranslation3(r={0,-1.5}); PlanarMechanics.Parts.Body Body3(m=1, J=0); Modelica.Mechanics.MultiBody.Parts.Body Body4( m=1, I_11=0, I_22=0, I_33=0); Modelica.Mechanics.MultiBody.Parts.FixedTranslation FixedTranslation4(r={0,-1.5, 0}); Modelica.Mechanics.MultiBody.Joints.Revolute Revolute4(initType= Modelica.Mechanics.MultiBody.Types.Init.PositionVelocity); PlanarMechanics.Parts.Body Body1( J=0, m=2); Modelica.Mechanics.MultiBody.Parts.Body Body2( I_11=0, I_22=0, I_33=0, m=2); inner PlanarMechanics.PlanarWorld planarWorld(nominalLength=5); equation connect(Revolute1.frame_a, Fixed1.frame_b); connect(FixedTranslation1.frame_a, Revolute1.frame_b); connect(Revolute2.frame_a, Fixed2.frame_b); connect(Revolute2.frame_b, FixedTranslation2.frame_a); connect(FixedTranslation3.frame_b, Body3.frame_a); connect(FixedTranslation3.frame_a, Revolute3.frame_b); connect(Revolute3.frame_a, FixedTranslation1.frame_b); connect(Revolute4.frame_b, FixedTranslation4.frame_a); connect(FixedTranslation4.frame_b, Body4.frame_a); connect(Revolute4.frame_a, FixedTranslation2.frame_b); connect(Body1.frame_a, FixedTranslation1.frame_b); connect(Body2.frame_a, FixedTranslation2.frame_b); end DoublePendulum;
model FreeBody "free body on spring" extends Modelica.Icons.Example; PlanarMechanics.Parts.FixedTranslation FixedTranslation1(r={1,0}); PlanarMechanics.Parts.Fixed Fixed1; PlanarMechanics.Forces.Spring Spring1( s0=1, c=10); inner PlanarMechanics.PlanarWorld planarWorld(nominalLength=5); Parts.Body Body1( initType=Modelica.Mechanics.MultiBody.Types.Init.PositionVelocity, m=1, x_start={1.2,-0.5}, J=0.12); equation connect(Spring1.frame_a, Fixed1.frame_b); connect(Spring1.frame_b, FixedTranslation1.frame_a); connect(Body1.frame_a, FixedTranslation1.frame_b); end FreeBody;
The planar loop is formed out of four revolutes.
The loop is closed automatically. The loop leads to 2 non-linear equations.
model KinematicLoop "kinematic loop with 4 revolute joints" extends Modelica.Icons.Example; PlanarMechanics.Parts.Fixed Fixed1; PlanarMechanics.Parts.FixedTranslation FixedTranslation1(r={0,1}); PlanarMechanics.Joints.Revolute Revolute1(phi_start= 0, enforceStates=true, initType=Modelica.Mechanics.MultiBody.Types.Init.PositionVelocity); PlanarMechanics.Joints.Revolute Revolute2; PlanarMechanics.Parts.FixedTranslation FixedTranslation2; PlanarMechanics.Parts.FixedTranslation FixedTranslation3; PlanarMechanics.Joints.Revolute Revolute3; PlanarMechanics.Parts.FixedTranslation FixedTranslation4(r={0,1}); PlanarMechanics.Joints.Revolute Revolute4; PlanarMechanics.Parts.Body Body1(animation=false); PlanarMechanics.Parts.Body Body2(animation=false); PlanarMechanics.Parts.Body Body3(animation=false); PlanarMechanics.Parts.Body Body4(animation=false); inner PlanarMechanics.PlanarWorld planarWorld(nominalLength=5, animateWorld=false, animateGravity=false); equation connect(Revolute1.frame_a, Fixed1.frame_b); connect(FixedTranslation1.frame_b, Fixed1.frame_b); connect(Revolute2.frame_b, FixedTranslation1.frame_a); connect(Revolute1.frame_b, FixedTranslation3.frame_a); connect(Revolute2.frame_a, FixedTranslation2.frame_a); connect(FixedTranslation3.frame_b, Revolute3.frame_b); connect(Revolute3.frame_a, FixedTranslation4.frame_b); connect(Revolute4.frame_b, FixedTranslation4.frame_a); connect(Body1.frame_a, FixedTranslation3.frame_b); connect(Body3.frame_a, FixedTranslation4.frame_a); connect(Body2.frame_a, FixedTranslation2.frame_b); connect(Body4.frame_a, Revolute4.frame_a); connect(FixedTranslation2.frame_b, Revolute4.frame_a); end KinematicLoop;
The planar loop is formed out of three revolute and one prismatic joint. Attached to this loop is a pendulum that is dissipating its energy through the damper.
The loop is closed automatically. The loop leads to 2 non-linear equations.
model KinematicLoop2 "kinematic loop" extends Modelica.Icons.Example; PlanarMechanics.Parts.Fixed Fixed1; PlanarMechanics.Parts.FixedTranslation FixedTranslation1(r={0,-3}); PlanarMechanics.Parts.FixedTranslation FixedTranslation2(r={0,-3}); PlanarMechanics.Joints.Revolute Revolute1(enforceStates=true); PlanarMechanics.Joints.Revolute Revolute2; PlanarMechanics.Joints.Revolute Revolute3; PlanarMechanics.Joints.Prismatic Prismatic1( initType=Modelica.Mechanics.MultiBody.Types.Init.PositionVelocity, v_start=0, s_start=2, enforceStates=false, boxWidth=0.5*planarWorld.defaultJointWidth); PlanarMechanics.Forces.Spring Spring1( c=50, s0=1.6); PlanarMechanics.Joints.Revolute Revolute4(initType=Modelica.Mechanics. MultiBody.Types.Init.PositionVelocity, enforceStates=true); PlanarMechanics.Parts.Body Body2(m=2, J=0.05); PlanarMechanics.Parts.FixedTranslation FixedTranslation3(r={2,0}); PlanarMechanics.Forces.Damping Damping1(d=2); inner PlanarMechanics.PlanarWorld planarWorld(nominalLength=5, enableAnimation=true, animateWorld=false, animateGravity=false); equation connect(Prismatic1.frame_a, Fixed1.frame_b); connect(Revolute2.frame_a, Prismatic1.frame_b); connect(FixedTranslation2.frame_a, Revolute2.frame_b); connect(Revolute1.frame_b, Fixed1.frame_b); connect(FixedTranslation1.frame_a, Revolute1.frame_a); connect(Revolute3.frame_b, FixedTranslation2.frame_b); connect(Revolute4.frame_a, FixedTranslation2.frame_b); connect(Revolute4.frame_b, FixedTranslation3.frame_a); connect(Body2.frame_a, FixedTranslation3.frame_b); connect(Spring1.frame_a, Revolute1.frame_b); connect(Spring1.frame_b, Revolute2.frame_a); connect(Damping1.frame_a, Revolute1.frame_b); connect(Damping1.frame_b, Revolute2.frame_a); connect(FixedTranslation1.frame_b, Revolute3.frame_a); end KinematicLoop2;
The model is confronted with its equivalence of the Modelica.Mechanics.MultiBody library.
model PlanarPendulum "a simple pendulum" extends Modelica.Icons.Example; PlanarMechanics.Parts.Fixed Fixed1; PlanarMechanics.Joints.Revolute Revolute1(initType=Modelica.Mechanics. MultiBody.Types.Init.PositionVelocity); PlanarMechanics.Parts.FixedTranslation FixedTranslation1(r={1,3}); PlanarMechanics.Parts.Body Body1(m=1, J=0); inner Modelica.Mechanics.MultiBody.World world(nominalLength=5, animateWorld=false, animateGravity=false); Modelica.Mechanics.MultiBody.Parts.Fixed Fixed2(r={0,0,-1}); Modelica.Mechanics.MultiBody.Parts.Body Body2( m=1, I_11=0, I_22=0, I_33=0); Modelica.Mechanics.MultiBody.Parts.FixedTranslation FixedTranslation2(r={1,3, 0}); Modelica.Mechanics.MultiBody.Joints.Revolute Revolute2(initType= Modelica.Mechanics.MultiBody.Types.Init.PositionVelocity); inner PlanarMechanics.PlanarWorld planarWorld(nominalLength=5, animateWorld=false, animateGravity=false); equation connect(Revolute1.frame_a, Fixed1.frame_b); connect(FixedTranslation1.frame_b, Body1.frame_a); connect(FixedTranslation1.frame_a, Revolute1.frame_b); connect(Revolute2.frame_a, Fixed2.frame_b); connect(Revolute2.frame_b, FixedTranslation2.frame_a); connect(FixedTranslation2.frame_b, Body2.frame_a); end PlanarPendulum;
The model is confronted with its equivalence of the Modelica.Mechanics.MultiBody library.
model CraneCrab3 "model of a free crane crab" extends Modelica.Icons.Example; PlanarMechanics.Parts.Fixed Fixed1; PlanarMechanics.Joints.Revolute Revolute1(animation=false, enforceStates= false, initType=Modelica.Mechanics.MultiBody.Types.Init.PositionVelocity); PlanarMechanics.Parts.FixedTranslation FixedTranslation1(r={1,3}); PlanarMechanics.Parts.Body Body1(m=1, J=0); PlanarMechanics.Parts.Body Body2(m=2, J=0); PlanarMechanics.Joints.Prismatic Prismatic1(enforceStates=false, initType= Modelica.Mechanics.MultiBody.Types.Init.PositionVelocity); inner Modelica.Mechanics.MultiBody.World world(nominalLength=5); Modelica.Mechanics.MultiBody.Parts.Fixed Fixed2(r={0,0,-1}, animation= false); Modelica.Mechanics.MultiBody.Parts.Body Body3( m=2, I_11=0, I_22=0, I_33=0); Modelica.Mechanics.MultiBody.Parts.Body Body4( m=1, I_11=0, I_22=0, I_33=0); Modelica.Mechanics.MultiBody.Joints.Prismatic Prismatic2(initType= Modelica.Mechanics.MultiBody.Types.Init.PositionVelocity); Modelica.Mechanics.MultiBody.Joints.Revolute Revolute2(initType= Modelica.Mechanics.MultiBody.Types.Init.PositionVelocity); Modelica.Mechanics.MultiBody.Parts.FixedTranslation FixedTranslation2(r={1,3, 0}); inner PlanarMechanics.PlanarWorld planarWorld(nominalLength=5); equation connect(FixedTranslation1.frame_b, Body1.frame_a); connect(FixedTranslation1.frame_a, Revolute1.frame_b); connect(Fixed1.frame_b, Prismatic1.frame_a); connect(Prismatic1.frame_b, Body2.frame_a); connect(Prismatic1.frame_b, Revolute1.frame_a); connect(FixedTranslation2.frame_b, Body4.frame_a); connect(FixedTranslation2.frame_a, Revolute2.frame_b); connect(Prismatic2.frame_a, Fixed2.frame_b); connect(Prismatic2.frame_b, Body3.frame_a); connect(Revolute2.frame_a, Prismatic2.frame_b); end CraneCrab3;