Получение последней ошибки для ПИД-регулятора - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь собрать ПИД-регулятор на Python. Ниже пока что моя реализация. Хотя синтаксис согласован, это все еще псевдокод.

    def PID(self, Kp, Ki, Kd, reference_velocity, vehicle_velocity, current_time, last_update_time):
        desired_velocity = 0
        Kp = 0
        Ki = 0
        Kd = 0
        error = reference_velocity - vehicle_velocity
        delta_time = current_time - last_update_time

        proportional = Kp * error
        integral = Ki * error
        derivative = Kd * ((error - last_error) / (delta_time))

        desired_velocity = proportional + integral + derivative

        return desired_velocity

Я пытаюсь вычислить last_error с помощью того, что я уже дал здесь, но я не мог это понять.

1 Ответ

1 голос
/ 21 июня 2020

Сохраните ошибки или последнюю ошибку в контейнере во внешней области функции.

errors = []
def PID(...):
    ...
    errors.append(error)
    return desired_velocity

Затем в функции, с помощью которой может быть получена последняя ошибка.

...
last_error = errors[-1]

Или вы можете сделать свой контроллер классом, экземпляры которого инициализируются константами и начальными параметрами и хранят записи (контейнер, подобный списку) прошлых ошибок. Расчет для выходного управляющего сигнала текущий / следующий будет методом, который можно вызвать со значениями параметров current .

Используя ваш алгоритм - что-то вроде этого.

class PID:
    def __init__(self,setpoint,t_now,Kp=0,Ki=0,Kd=0):
        self.setpoint = setpoint
        self.t_last = t_now
        self.Kp = Kp
        self.Ki = Ki
        self.Kd = Kd
        self.last_error = 0
    def adjust(self,process,t_now):
        error = process - self.setpoint
        delta_time = t_now - self.t_last

        proportional = self.Kp * error
        integral = self.Ki * error
        derivative = self.Kd * ((error - self.last_error) / (delta_time))

        desired_process = proportional + integral + derivative
        self.t_last = t_now
        self.last_error = error
        return desired_process

Использование:

v_controller = PID(setpoint=66, t_now=0, Kp=.2, Kd=.1, Ki=1)
# or
#parameters = {'setpoint':66, 't_now':0, 'Kp':.2, 'Kd':.1, 'Ki':1}
#v_controller = PID(**parameters)

print(v_controller.adjust(66.1,1))
print(v_controller.adjust(66.2,2))
print(v_controller.adjust(65.9,3))
print('-------------')
parameters = {'setpoint':66, 't_now':0, 'Kp':.2, 'Kd':.1, 'Ki':1.5}
v_controller = PID(**parameters)
print(v_controller.adjust(66.1,1))
print(v_controller.adjust(66.2,2))
print(v_controller.adjust(65.9,3))
print('-------------')
parameters = {'setpoint':66, 't_now':0, 'Kp':1.25, 'Kd':.2, 'Ki':.5}
v_controller = PID(**parameters)
print(v_controller.adjust(66.1,1))
print(v_controller.adjust(66.2,2))
print(v_controller.adjust(65.9,3))

Результат

>>> 
0.12999999999999262
0.2500000000000043
-0.1499999999999929
-------------
0.17999999999998975
0.3500000000000057
-0.19999999999999005
-------------
0.1949999999999889
0.37000000000000666
-0.2349999999999895
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...