Skip to content

Latest commit

 

History

History
158 lines (124 loc) · 5.79 KB

addPrismaticJoint.rst

File metadata and controls

158 lines (124 loc) · 5.79 KB

addPrismaticJoint.py

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

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# This is an EXUDYN example
#
# Details:  Create a chain of bodies connected with prismatic joints; Example for CreatePrismaticJoint utility function
#
# Model:    N-link chain of rigid bodies connected by prismatic joints
#
# Author:   Johannes Gerstmayr
# Date:     2021-07-02
#
# 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.
#
# *clean example*
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

## import libaries
import exudyn as exu
from exudyn.utilities import * #includes itemInterface and rigidBodyUtilities
import exudyn.graphics as graphics #only import if it does not conflict

from math import sin, cos, pi
import numpy as np

## set up mbs
SC = exu.SystemContainer()
mbs = SC.AddSystem()

## define overall parameters
L = 0.4 #length of bodies
d = 0.1 #diameter of bodies
p0 = [0.,0.,0] #reference position
vLoc = np.array([L,0,0]) #last to next joint
g = [0,-9.81,0]

## create ground with marker
oGround=mbs.AddObject(ObjectGround(referencePosition= [-0.5*L,0,0]))
mPosLast = mbs.AddMarker(MarkerBodyRigid(bodyNumber = oGround, localPosition=[0,0,0]))
bodyLast = oGround

## set up rotation matrices for relative rotation of joints
A0 = np.eye(3)
Alast = A0 #previous marker

A0 = RotationMatrixX(0)
A1 = RotationMatrixY(0.5*pi)
A2 = RotationMatrixZ(0.5*pi)
A3 = RotationMatrixX(-0.5*pi)
Alist=[A0,A1,A2,A3]

## set up list of vectors defining axes
v0=[0,0,1]
v1=[1,1,1]
v2=[1,0,0]
v3=[0,0,1]
axisList=[v0,v1,v2,v3]

## loop to create a chain of 4 bodies under gravity connected with prismatic joints
for i in range(4):
    ### create inertia for block with dimensions [L,d,d]
    inertia = InertiaCuboid(density=1000, sideLengths=[L,d,d])
    ### create graphics for body as block with (body-fixed) centerPoint, size and color
    graphicsBody = graphics.Brick(centerPoint=[0,0,0], size=[0.96*L,d,d], color=graphics.color.steelblue)

    ### create and add rigid body to mbs
    p0 += Alist[i] @ (0.5*vLoc)
    oRB = mbs.CreateRigidBody(inertia=inertia,
                              referencePosition=p0,
                              referenceRotationMatrix=Alist[i],
                              gravity=g,
                              graphicsDataList=[graphicsBody])
    nRB= mbs.GetObject(oRB)['nodeNumber']

    body0 = bodyLast
    body1 = oRB
    ### retrieve reference position for simpler definition of global joint position
    point = mbs.GetObjectOutputBody(oRB,exu.OutputVariableType.Position,
                                    localPosition=[-0.5*L,0,0],
                                    configuration=exu.ConfigurationType.Reference)
    axis = axisList[i]
    ### set up prismatic joint between two bodies, at global position and with global axis
    mbs.CreatePrismaticJoint(bodyNumbers=[body0, body1], position=point, axis=axis,
                             useGlobalFrame=True, axisRadius=0.6*d, axisLength=1.2*d)

    bodyLast = oRB

    p0 += Alist[i] @ (0.5*vLoc)
    Alast = Alist[i]

## assemble and set up simulation settings
mbs.Assemble()

simulationSettings = exu.SimulationSettings() #takes currently set values or default values

tEnd = 2
h=0.001  #use small step size to detext contact switching

simulationSettings.timeIntegration.numberOfSteps = int(tEnd/h)
simulationSettings.timeIntegration.endTime = tEnd
simulationSettings.solutionSettings.solutionWritePeriod = 0.005
#simulationSettings.timeIntegration.simulateInRealtime = True
simulationSettings.timeIntegration.realtimeFactor = 0.5
simulationSettings.timeIntegration.verboseMode = 1

simulationSettings.timeIntegration.generalizedAlpha.spectralRadius = 0.8
simulationSettings.timeIntegration.generalizedAlpha.computeInitialAccelerations=True
simulationSettings.timeIntegration.newton.useModifiedNewton = True

SC.visualizationSettings.nodes.show = True
SC.visualizationSettings.nodes.drawNodesAsPoint  = False
SC.visualizationSettings.nodes.showBasis = True
SC.visualizationSettings.nodes.basisSize = 0.015
SC.visualizationSettings.connectors.showJointAxes = True

#for snapshot:
SC.visualizationSettings.openGL.multiSampling=4
SC.visualizationSettings.openGL.lineWidth=2

SC.visualizationSettings.general.autoFitScene = False #use loaded render state
useGraphics = True
if useGraphics:
    simulationSettings.displayComputationTime = True
    simulationSettings.displayStatistics = True
    exu.StartRenderer()
    ## reload previous render configuration
    if 'renderState' in exu.sys:
        SC.SetRenderState(exu.sys[ 'renderState' ])
else:
    simulationSettings.solutionSettings.writeSolutionToFile = False

## start solver
mbs.SolveDynamic(simulationSettings, showHints=True)

## visualization
mbs.SolutionViewer(runMode=2, runOnStart=True)

## evaluate some results
u0 = mbs.GetNodeOutput(nRB, exu.OutputVariableType.Displacement)
rot0 = mbs.GetNodeOutput(nRB, exu.OutputVariableType.Rotation)
exu.Print('u0=',u0,', rot0=', rot0)

result = (abs(u0)+abs(rot0)).sum()
exu.Print('solution of addPrismaticJoint=',result)