背景
我正在为两个以圆形行进的飞机进行自动驾驶,我需要将飞机约束到一个精确的角度差。在指定的半径和高度。因此我无法控制速度,我使用半径来控制速度。
问题 我目前正在使用PID回路来调整半径以保持所需的角度。这种效果非常好,没有风,但是当我加入微风时,它会抛出。我在问是否有一种算法(在python中)可以预测风,一种恒定的外力。
模拟运行5分钟
随风而去:
平均度数错误:0.139688253885 度误差范围:(0.00019532812497402574,0.6809882978746771)风(2米/秒)
这是我离线的PID循环。我可能会错误地使用它,或者我可以添加一些额外的重量来解决我的问题。
class PID:
"""
Discrete PID control
"""
def __init__(self, P=50, I=0.5, D=10, Derivator=0, Integrator=0, Integrator_max=300, Integrator_min=-300):
self.Kp=P
self.Ki=I
self.Kd=D
self.Derivator=Derivator
self.Integrator=Integrator
self.Integrator_max=Integrator_max
self.Integrator_min=Integrator_min
self.set_angle=0.0
self.error=0.0
def update(self,current_angle):
"""
Calculate PID output value for given reference input and feedback
"""
self.error = self.set_angle - current_angle
self.P_value = self.Kp * self.error
self.D_value = self.Kd * ( self.error - self.Derivator)
self.Derivator = self.error
self.Integrator = self.Integrator + self.error
if self.Integrator > self.Integrator_max:
self.Integrator = self.Integrator_max
elif self.Integrator < self.Integrator_min:
self.Integrator = self.Integrator_min
self.I_value = self.Integrator * self.Ki
PID = self.P_value + self.I_value + self.D_value
return PID
def setAngle(self,set_angle):
"""
Initilize the setpoint of PID
"""
self.set_angle = set_angle
self.Integrator=0
self.Derivator=0
def setIntegrator(self, Integrator):
self.Integrator = Integrator
def setDerivator(self, Derivator):
self.Derivator = Derivator
def setKp(self,P):
self.Kp=P
def setKi(self,I):
self.Ki=I
def setKd(self,D):
self.Kd=D
def getPoint(self):
return self.set_point
def getError(self):
return self.error
def getIntegrator(self):
return self.Integrator
def getDerivator(self):
return self.Derivator