sensorUserFunctionTest.py

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

 1#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2# This is an EXUDYN example
 3#
 4# Details:  Test sensor with user function
 5#
 6# Author:   Johannes Gerstmayr
 7# Date:     2021-02-18
 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.itemInterface import *
15
16from math import pi, atan2
17
18testIsActive = exu.sys.get('testIsActive', False)
19
20SC = exu.SystemContainer()
21mbs = SC.AddSystem()
22node = mbs.AddNode(NodePoint(referenceCoordinates = [1,0,0], 
23                             initialCoordinates=[0,0,0],
24                             initialVelocities=[0,1,0]))
25mbs.AddObject(MassPoint(nodeNumber = node, mass=1))
26
27sNode = mbs.AddSensor(SensorNode(nodeNumber=node,
28                                 fileName='solution/sensorTestPos.txt',
29                                 writeToFile = (not testIsActive), #no output needed
30                                 outputVariableType=exu.OutputVariableType.Position))
31
32def UFsensor(mbs, t, sensorNumbers, factors, configuration):
33    val = mbs.GetSensorValues(sensorNumbers[0]) #x,y,z
34    phi = atan2(val[1],val[0]) #compute angle from x,y: atan2(y,x)
35    #print("phi=", factors[0]*phi)
36    #print("x,y,z", val)
37    return [factors[0]*phi] #return angle in degree
38
39sUser = mbs.AddSensor(SensorUserFunction(sensorNumbers=[sNode], factors=[180/pi], 
40                                 storeInternal=True,#fileName='solution/sensorTestPhi.txt',
41                                 writeToFile = (not testIsActive),
42                                 sensorUserFunction=UFsensor))
43
44#assemble and solve system for default parameters
45mbs.Assemble()
46
47simulationSettings = exu.SimulationSettings() #takes currently set values or default values
48simulationSettings.solution.file.write = False
49
50mbs.SolveDynamic(simulationSettings)
51
52#evaluate final (=current) output values
53u = mbs.GetSensorValues(sUser)
54exu.Print('sensor=',u)
55
56exu.sys['testResult'] = u #should be 45 degree finally
57
58#+++++++++++++++++++++++++++++++++++++++++++++++++++++
59if not testIsActive:
60    
61    mbs.PlotSensor([sNode, sNode, sUser], [0, 1, 0])