doublePendulum2D.py

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

 1#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2# This is an EXUDYN example
 3#
 4# Details:  Simple double pendulum
 5#
 6# Author:   Johannes Gerstmayr (with "help" of Bing AI)
 7# Date:     2023-05-01
 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
13
14import exudyn as exu
15from exudyn.utilities import *
16from math import sin, cos, pi
17
18SC = exu.SystemContainer()
19mbs = SC.AddSystem()
20
21# create nodes:
22n0=mbs.AddNode(NodeRigidBody2D(referenceCoordinates=[0,0,0], initialVelocities=[0,0,0]))
23n1=mbs.AddNode(NodeRigidBody2D(referenceCoordinates=[1,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]])])))
30
31# add markers and loads:
32oGround = mbs.AddObject(ObjectGround())
33mGround=mbs.AddMarker(MarkerBodyRigid(bodyNumber=oGround, localPosition=[-0.5, 0., 0.]))
34m00 = mbs.AddMarker(MarkerBodyRigid(bodyNumber=b0, localPosition=[-0.5, 0., 0.]))
35m01 = mbs.AddMarker(MarkerBodyRigid(bodyNumber=b0, localPosition=[ 0.5, 0., 0.]))
36m10 = mbs.AddMarker(MarkerBodyRigid(bodyNumber=b1, localPosition=[-0.5, 0., 0.]))
37#m12 = mbs.AddMarker(MarkerBodyRigid(bodyNumber=b1, localPosition=[ 0.5, 0., 0.]))
38
39# add joints:
40jg0 = mbs.AddObject(RevoluteJoint2D(markerNumbers=[mGround,m00]))
41j01 = mbs.AddObject(RevoluteJoint2D(markerNumbers=[m01,m10]))
42
43# add loads:
44
45mLoad0=mbs.AddMarker(MarkerNodePosition(nodeNumber=n0))
46mLoad1=mbs.AddMarker(MarkerNodePosition(nodeNumber=n1))
47
48mbs.AddLoad(Force(markerNumber=mLoad0, loadVector=[0,-9.81,0]))
49mbs.AddLoad(Force(markerNumber=mLoad1, loadVector=[0,-9.81,0]))
50
51
52# add time integration scheme:
53mbs.Assemble()
54simulationSettings = exu.SimulationSettings()
55simulationSettings.timeIntegration.numberOfSteps = 10000
56simulationSettings.timeIntegration.endTime = 10
57
58#remove this if you want to simulate fast:
59simulationSettings.timeIntegration.simulateInRealtime = True #otherwise, nothing is visible
60
61simulationSettings.solutionSettings.writeSolutionToFile = True
62simulationSettings.solutionSettings.solutionWritePeriod = 0.01
63
64simulationSettings.timeIntegration.verboseMode = 1
65# simulationSettings.displayStatistics = True
66# simulationSettings.displayComputationTime = True
67
68#simulate:
69exu.StartRenderer()
70mbs.WaitForUserToContinue()
71mbs.SolveDynamic(simulationSettings)
72exu.StopRenderer()