File: PIDController.py

package info (click to toggle)
yade 2025.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 33,308 kB
  • sloc: cpp: 93,298; python: 50,409; sh: 577; makefile: 162
file content (61 lines) | stat: -rw-r--r-- 2,177 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# -*- encoding=utf-8 -*-
from yade import utils, plot

o = Omega()
fr = 0.0
rho = 2000
tc = 0.001
en = 0.3
et = 0.3
o.dt = 0.02 * tc

mat1 = O.materials.append(ViscElMat(frictionAngle=fr, density=rho, tc=tc, en=en, et=et))

spheresID = O.bodies.append(pack.regularHexa(pack.inCylinder((0, 0, -2.0), (0, 0, 2.0), 2.0), radius=0.2, gap=0.1, color=(0, 1, 0), material=mat1))

idWalls = O.bodies.append(geom.facetCylinder(center=(0.0, 0.0, 0.0), radius=2.05, height=4.0, wallMask=6, material=mat1, segmentsNumber=20, color=(0, 0, 1)))
idTop = O.bodies.append(
        geom.facetCylinder(center=(0.0, 0.0, 0.0), radius=2.05, height=4.0, wallMask=1, material=mat1, segmentsNumber=5, color=(1, 0, 0), wire=False)
)

o.engines = [
        ForceResetter(),
        InsertionSortCollider([Bo1_Sphere_Aabb(), Bo1_Facet_Aabb()], verletDist=1.0, label='collider'),
        InteractionLoop(
                [Ig2_Sphere_Sphere_ScGeom(), Ig2_Facet_Sphere_ScGeom()],
                [Ip2_ViscElMat_ViscElMat_ViscElPhys()],
                [Law2_ScGeom_ViscElPhys_Basic()],
        ),
        NewtonIntegrator(damping=0, gravity=[0, 0, -9.81], label='newtonInt'),
        TranslationEngine(translationAxis=[0, 0, 1], velocity=-2.0, ids=idTop, dead=False, label='translat'),
        CombinedKinematicEngine(ids=idTop, label='combEngine', dead=True) +
        ServoPIDController(axis=[0, 0, 1], maxVelocity=2.0, iterPeriod=1000, ids=idTop, target=1.0e7, kP=1.0, kI=1.0, kD=1.0) +
        RotationEngine(rotationAxis=(0, 0, 1), angularVelocity=10.0, rotateAroundZero=True, zeroPoint=(0, 0, 0)),
        PyRunner(command='addPlotData()', iterPeriod=1000, label='graph'),
        PyRunner(command='switchTranslationEngine()', iterPeriod=45000, nDo=2, label='switchEng'),
]
O.step()
from yade import qt

qt.View()
r = qt.Renderer()
r.bgColor = 1, 1, 1


def addPlotData():
	fMove = Vector3(0, 0, 0)

	for i in idTop:
		fMove += O.forces.f(i)

	plot.addData(z=O.iter, pMove=fMove[2], pFest=fMove[2])


def switchTranslationEngine():
	print("Switch from TranslationEngine engine to ServoPIDController")
	translat.dead = True
	combEngine.dead = False


plot.plots = {'z': ('pMove', 'pFest')}
plot.plot()