如何适应不同的外力?

时间:2017-06-20 20:04:30

标签: python control-theory

背景

我正在为两个以圆形行进的飞机进行自动驾驶,我需要将飞机约束到一个精确的角度差。在指定的半径和高度。因此我无法控制速度,我使用半径来控制速度。

问题 我目前正在使用PID回路来调整半径以保持所需的角度。这种效果非常好,没有风,但是当我加入微风时,它会抛出。我在问是否有一种算法(在python中)可以预测风,一种恒定的外力。

模拟运行5分钟

随风而去:

平均度数错误:0.139688253885 度误差范围:(0.00019532812497402574,0.6809882978746771)

风(2米/秒)

avg degree error:3.11431020156 度误差范围:(1.2354672023207058e-05,6.287707664347636)

这是我离线的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

0 个答案:

没有答案