import os, sys
base = os.path.dirname(__file__)
path = os.path.dirname(base)
path = os.path.dirname(path)
sys.path.insert(0, path)
try:
import numpy as np
import matplotlib.pyplot as plt
except Exception as e:
print(e)
exit()
Ts = 0.001
try:
import control.matlab as ct
sysc = ct.tf(133, [1, 25, 0])
sysd = ct.c2d(sysc, Ts)
print(sysc, sysd)
[[num]], [[den]] = ct.tfdata(sysd)
except ModuleNotFoundError:
num = [6.59492796e-05, 6.54019884e-05]
den = [1.0, -1.97530991, 0.97530991]
except Exception as e:
print(e)
exit()
import liba
MIN = -10
MAX = +10
kp = 10.0
ki = 0.01 * Ts
kd = 0.24 / Ts
tf = liba.tf(num, den[1:])
pid = liba.pid().set_kpid(kp, ki, kd)
pid.outmax = MAX
pid.outmin = MIN
r = 1.0
data = np.arange(0, 0.2, Ts)
setpoint = [r] * len(data)
title = "Proportional Integral Derivative Position"
y = 0.0
tf.zero()
error1 = []
feedback1 = []
pid.zero()
for i in data:
u = pid.pos(r, y)
y = tf(u)
feedback1.append(y)
error1.append(r - y)
y = 0.0
tf.zero()
error2 = []
feedback2 = []
e = [0.0, 0.0, 0.0]
x = [0.0, 0.0, 0.0]
for i in data:
e = np.roll(e, 1)
e[0] = r - y
x[0] = e[0]
x[1] += ki * e[0]
x[2] = e[0] - e[1]
u = kp * x[0] + x[1] + kd * x[2]
if u < MIN:
u = MIN
elif u > MAX:
u = MAX
y = tf(u)
feedback2.append(y)
error2.append(r - y)
plt.figure(title)
plt.subplot(211)
plt.title(title)
plt.plot(data, setpoint, "r-", data, feedback1, "b-", data, feedback2, "g-")
plt.ylabel("r - y")
plt.grid(True)
plt.subplot(212)
plt.plot(data, error1, "b-", data, error2, "g-")
plt.ylabel("error")
plt.xlabel("time(s)")
plt.grid(True)
plt.savefig(os.path.join(base, "pid_pos.png"))
title = "Proportional Integral Derivative Increment"
y = 0.0
tf.zero()
error1 = []
feedback1 = []
pid.zero()
for i in data:
u = pid.inc(r, y)
y = tf(u)
feedback1.append(y)
error1.append(r - y)
u = 0.0
y = 0.0
tf.zero()
error2 = []
feedback2 = []
e = [0.0, 0.0, 0.0]
x = [0.0, 0.0, 0.0]
for i in data:
e = np.roll(e, 1)
e[0] = r - y
x[0] = e[0] - e[1]
x[1] = e[0]
x[2] = e[0] - e[1] * 2 + e[2]
u += kp * x[0] + ki * x[1] + kd * x[2]
y = u
if y < MIN:
y = MIN
elif y > MAX:
y = MAX
y = tf(y)
feedback2.append(y)
error2.append(r - y)
plt.figure(title)
plt.subplot(211)
plt.title(title)
plt.plot(data, setpoint, "r-", data, feedback1, "b-", data, feedback2, "g-")
plt.ylabel("r - y")
plt.grid(True)
plt.subplot(212)
plt.plot(data, error1, "b-", data, error2, "g-")
plt.ylabel("error")
plt.xlabel("time(s)")
plt.grid(True)
plt.savefig(os.path.join(base, "pid_inc.png"))
plt.show()