В последнем уроке мы рассмотрели две вещи: новую команду DriveBase и разработанное в отрасли средство получения более предсказуемых вещей, называемое ПИД-регулятором. Оба средства, чтобы помочь вам оставаться на прямой и узкой.
Вы помните наш последний сценарий в последнем уроке, показывающий команду driveBase с гироскопом. На самом деле вы можете использовать жиро, чтобы попытаться исправить любой занос, заставляя его двигаться по прямой.
#!/usr/bin/env pybricks-micropython from pybricks import ev3brick as brick from pybricks.parameters import Button, Port, Stop from pybricks.ev3devices import Motor, GyroSensor from pybricks.tools import wait from pybricks.robotics import DriveBase leftMotor = Motor(Port.B) rightMotor = Motor(Port.C) leftMotor.reset_angle(0) rightMotor.reset_angle(0) gyro = GyroSensor(Port.S2) gyro.reset_angle(0) wheelDiam = 56 wheelDist = 114 speed = 50 angle = 0 fudge = 0.5 robot = DriveBase(leftMotor, rightMotor, wheelDiam, wheelDist) while True: robot.drive(speed,angle) drift = leftMotor.angle() - rightMotor.angle() angle = (drift * fudge) * -1 print("drift",gyro.angle())
Самая важная строка здесь — значение выдумки. Вам нужно будет поиграть со значением fudge для вашего робота, пока он не заработает.
Управление контуром обратной связи очень распространено в подобных системах, и существует еще более точное средство, называемое ПИД-алгоритмом или ПИД-регулятором. PID является аббревиатурой от слов пропорциональный, интегральный, производный; я боюсь всех терминов исчисления. Хотя все это звучит гораздо страшнее, чем есть на самом деле.
Формула для ПИД-регулятора содержит четыре переменные, которые в совокупности обеспечивают максимально плавное движение вашего робота по линии. Похоже на это.
Поправка = (ошибка * Kp) + (интеграл * Ki) + (производная * Kd)
Значения K — это все константы, которые вам нужно будет настроить, как значение выдумки, о котором мы говорили в предыдущем примере. Давайте сразу приступим к реализации.
#!/usr/bin/env pybricks-micropython from pybricks import ev3brick as brick from pybricks.ev3devices import Motor, GyroSensor from pybricks.parameters import Port, Stop from pybricks.tools import print, wait from pybricks.robotics import DriveBase left_motor = Motor(Port.B) right_motor = Motor(Port.C) gyro = GyroSensor(Port.S2) gyro.reset_angle(0) robot = DriveBase(left_motor, right_motor, 56, 114) targetAG = 0 Kp = 1 Ki = 0 Kd = 0 error = 0 lastError = 0 intergral = 0 deriative = 0 while True: angle = gyro.angle() error = (targetAG - angle) direct = error * Kp intergral = (intergral + error) * Ki deriative = (error - lastError) * Kd turn = direct + intergral + deriative print("A",gyro.angle(),"P",direct,"I",intergral,"D",deriative, "sum",turn) lastError = error robot.drive(90,turn)
Таким образом, переменная targetAG здесь также является углом, который мы хотим придерживаться, 0 градусов в нашем случае. Ошибка представляет собой значение обратной связи, поступающее от гироскопического датчика. Ошибка в следующей строке — это разница между целевым значением и обратной связью. Тогда у вас есть первое значение выдумки. Затем вы устанавливаете интегральное значение, равное себе и ошибке, и используете наше второе ложное значение. Затем мы устанавливаем производное значение, чтобы предсказать предстоящую ошибку, вычитая текущую ошибку из последней. Кроме того, у нас есть третье значение выдумки. И почти последним действием мы складываем их все вместе, чтобы получить значение для включения. Наконец, наши последние два действия — установить последнюю ошибку [используемую для построения производной] и выполнить поворот, если это необходимо.
Вы можете применить алгоритм PID к любой системе, в которой есть какой-либо механизм обратной связи. Таким образом, вы можете использовать ПИД-регулятор, например, для значительного улучшения строки, следующей за сценарием.
Что из выдумки значения тогда. Ну это работает так. Когда вы начинаете с того, что ни интеграл, ни производная не являются частью уравнения, фактор выдумки отменяет их. Что вам нужно сделать, так это медленно вводить/увеличивать их значения, чтобы все работало лучше.
Нет правильных значений, подделывают значения для K-факторов Ki и Kd, это очень много проб и ошибок. Это наверняка будут дроби, Ki на 0,0005 и Kd на 0,01 абсолютно нормально.
Один последний комментарий, который мне нужен от builderdude35 на YouTube. Он обнаружил, что Ки-аспект этой формулы на самом деле со временем только усугубляет ситуацию, и рекомендовал не использовать ее в очень предсказуемой ситуации, такой как прямая линия.