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])