外环:输入target_angle,angle,参数(kp);输出target_rate(目标角速度)
内环 :输入target_rate,参数(kp,ki,kd);输出rate(“实际”角速度)
模拟环境,使用语言为python,初始角度为0,目标角度为30,通过调整内外环参数,使角度趋近为30
前言
在单环pid中,参数kp=0.1,ki=0.4,kd=0.1条件下,迭代后图形为,图像虽能较快贴近目标,但过程不平稳,若应用在四轴飞行器中,可能会发生机体震荡,若使用双环pid控制,则可以较好地解决这些问题
第一次实验:外环kp=0.1,内环kp=0.1,ki=0.4,kd=0.1,单一循环
import matplotlib.pyplot as plt
target_angle = 30
angle = 0
target_rate = 0
class inner_Pid():
def __init__(self,exp_rate,kp,ki,kd):
self.KP = kp
self.KI = ki
self.KD = kd
self.exp_rate = exp_rate
self.now_rate = 0
self.sum_rate = 0
self.now_err = 0
self.last_err = 0
def cmd_innerpid(self):
self.last_err = self.now_err
self.now_err = self.exp_rate - self.now_rate
self.sum_rate += self.now_err
self.now_rate = self.KP * (self.exp_rate - self.now_rate) \
+ self.KI * self.sum_rate + self.KD * (self.now_err - self.last_err)
return self.now_rate
class outer_Pid():
def __init__(self,exp_angle,now_angle,kp):
self.KP = kp
self.exp_angle = exp_angle
self.now_angle = now_angle
self.now_err = 0
self.target_rate = 0
def cmd_outerpid(self):
self.target_rate = self.KP * (self.exp_angle - self.now_angle)
return self.target_rate
pid_val = []
test_innerpid = inner_Pid(30, 0.1, 0.4, 0.1)
test_outerpid = outer_Pid(target_angle,angle,0.1)
for i in range(0,100):
target_rate = test_outerpid.cmd_outerpid()
test_innerpid = inner_Pid(target_rate,0.1,0.4,0.1)
angle += test_innerpid.cmd_innerpid()
pid_val.append(angle)
test_outerpid = outer_Pid(target_angle,angle,0.1)
plt.plot(pid_val)
plt.show()
图像为
第二次实验:调整外环kp=0.2,保持内环kp=0.1,ki=0.4,kd=0.1,单一循环
代码省略,仅在实验一中调整参数即可
图像为
较实验一而言更陡
将外环kp调整为0.5后,如图,便可看出双环与单环的差别了