В последнем уроке мы рассмотрели две вещи: новую команду 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. Он обнаружил, что Ки-аспект этой формулы на самом деле со временем только усугубляет ситуацию, и рекомендовал не использовать ее в очень предсказуемой ситуации, такой как прямая линия.