simple4linkPendulumBing.py

You can view and download this file on Github: simple4linkPendulumBing.py

 1#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2# This is an EXUDYN example
 3#
 4# Details:  4-link pendulum
 5#
 6# Author:   Bing AI with some help by Johannes Gerstmayr; note that doublePendulum2D.py did not exist prior to this model
 7# Date:     2023-04-15
 8#
 9# Copyright:This file is part of Exudyn. Exudyn is free software. You can redistribute it and/or modify it under the terms of the Exudyn license. See 'LICENSE.txt' for more details.
10#
11#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12
13import exudyn as exu
14from exudyn.utilities import *
15
16SC = exu.SystemContainer()
17mbs = SC.AddSystem()
18
19# create nodes:
20n0=mbs.AddNode(NodeRigidBody2D(referenceCoordinates=[0,0,0], initialVelocities=[0,0,0]))
21n1=mbs.AddNode(NodeRigidBody2D(referenceCoordinates=[1,0,0], initialVelocities=[0,0,0]))
22n2=mbs.AddNode(NodeRigidBody2D(referenceCoordinates=[2,0,0], initialVelocities=[0,0,0]))
23n3=mbs.AddNode(NodeRigidBody2D(referenceCoordinates=[3,0,0], initialVelocities=[0,0,0]))
24
25# create bodies:
26b0=mbs.AddObject(RigidBody2D(physicsMass=1, physicsInertia=1,nodeNumber=n0,
27       visualization=VRigidBody2D(graphicsData=[GraphicsDataLine([[-0.5,0,0],[0.5,0,0]])])))
28b1=mbs.AddObject(RigidBody2D(physicsMass=1, physicsInertia=1,nodeNumber=n1,
29                 visualization=VRigidBody2D(graphicsData=[GraphicsDataLine([[-0.5,0,0],[0.5,0,0]])])))
30b2=mbs.AddObject(RigidBody2D(physicsMass=1, physicsInertia=1,nodeNumber=n2,
31                 visualization=VRigidBody2D(graphicsData=[GraphicsDataLine([[-0.5,0,0],[0.5,0,0]])])))
32b3=mbs.AddObject(RigidBody2D(physicsMass=1, physicsInertia=1,nodeNumber=n3,
33                 visualization=VRigidBody2D(graphicsData=[GraphicsDataLine([[-0.5,0,0],[0.5,0,0]])])))
34
35# add markers and loads:
36oGround = mbs.AddObject(ObjectGround())
37mGround=mbs.AddMarker(MarkerBodyPosition(bodyNumber=oGround, localPosition=[-0.5, 0., 0.]))
38m00 = mbs.AddMarker(MarkerBodyPosition(bodyNumber=b0, localPosition=[-0.5, 0., 0.]))
39m01 = mbs.AddMarker(MarkerBodyPosition(bodyNumber=b0, localPosition=[ 0.5, 0., 0.]))
40m10 = mbs.AddMarker(MarkerBodyPosition(bodyNumber=b1, localPosition=[-0.5, 0., 0.]))
41m12 = mbs.AddMarker(MarkerBodyPosition(bodyNumber=b1, localPosition=[ 0.5, 0., 0.]))
42m21 = mbs.AddMarker(MarkerBodyPosition(bodyNumber=b2, localPosition=[-0.5, 0., 0.]))
43m23 = mbs.AddMarker(MarkerBodyPosition(bodyNumber=b2, localPosition=[ 0.5, 0., 0.]))
44m32 = mbs.AddMarker(MarkerBodyPosition(bodyNumber=b3, localPosition=[-0.5, 0., 0.]))
45
46# add joints:
47jg0 = mbs.AddObject(RevoluteJoint2D(markerNumbers=[mGround,m00]))
48j01 = mbs.AddObject(RevoluteJoint2D(markerNumbers=[m01,m10]))
49j12 = mbs.AddObject(RevoluteJoint2D(markerNumbers=[m12,m21]))
50j23 = mbs.AddObject(RevoluteJoint2D(markerNumbers=[m23,m32]))
51
52# add loads:
53
54mLoad0=mbs.AddMarker(MarkerNodePosition(nodeNumber=n0))
55mLoad1=mbs.AddMarker(MarkerNodePosition(nodeNumber=n1))
56mLoad2=mbs.AddMarker(MarkerNodePosition(nodeNumber=n2))
57mLoad3=mbs.AddMarker(MarkerNodePosition(nodeNumber=n3))
58
59mbs.AddLoad(Force(markerNumber=mLoad0, loadVector=[0,-9.81*1,0]))
60mbs.AddLoad(Force(markerNumber=mLoad1, loadVector=[0,-9.81*1,0]))
61mbs.AddLoad(Force(markerNumber=mLoad2, loadVector=[0,-9.81*1,0]))
62mbs.AddLoad(Force(markerNumber=mLoad3, loadVector=[0,-9.81*1,0]))
63
64# add time integration scheme:
65mbs.Assemble()
66simulationSettings = exu.SimulationSettings()
67simulationSettings.timeIntegration.numberOfSteps = 10000
68simulationSettings.timeIntegration.endTime = 10
69simulationSettings.solutionSettings.writeSolutionToFile = True
70simulationSettings.solutionSettings.solutionWritePeriod = 0.01
71
72exu.StartRenderer()
73mbs.WaitForUserToContinue()
74mbs.SolveDynamic(simulationSettings)
75exu.StopRenderer()