Итак, мы увидели, что с пропорциональным регулятором робот стал ехать гораздо более плавно, чем с релейным. Однако так случается не всегда. Может получиться так, что с вашим коэффициентом робот будет отлично проходить плавные дуги, но убегать с трассы на крутых поворотах. Вы начнете увеличивать коэффициент, и робот будет вести себя все более резко. В конце концов вы придете к варианту еще худшему, чем получилось с релейным алгоритмом. Тогда я рекомендую вам сделать следующее. Должно быть, вы заметили, что рисую я не очень здорово, поэтому я пошел на сайт Wolfram Alfa, для того чтобы напомнить вам, как выглядит график кубической функции. Вот это кубическая парабола. Почему она нам нужна? Дело в том, что вы можете добавить в свой регулятор еще один канал: взять ошибку в кубе. Улучшенный регулятор будет иметь следующий вид: ошибку мы будем получать таким же образом, а вот управляющее воздействие рассчитывать иначе: берем ошибку с коэффициентом 1 и берем еще один новый коэффициент, который будет принадлежать к кубической части нашего регулятора. В среде Arduino возведение в степень записывается иначе. Это будет выглядеть вот так вот. {{ПИШЕТ НА ГРАФИКЕ}} Зачем это нужно? Понять поможет график. Мы видим, как изменяется куб ошибки. Допустим, что ошибка мала, то есть робот отклонился от линии совсем ненамного. Ее куб будет также ничтожно мал. Мы не забываем, что мы введем еще один коэффициент, он будет очень маленький: сто тысячные, миллионные. И с этим коэффициентом куб ошибки вообще не будет играть никакой роли в происходящем. Однако стоит ошибке вырасти, куб ее также стремительно вырастет и, взятый даже с таким малым коэффициентом, начнет влиять на то, как изменяются скорости моторов. Мы можем посмотреть на то, как будет выглядеть график всей функции, если мы возьмем, например, 0,1 x и прибавим к ней 0,00001 x в кубе. Это будет выглядеть следующим образом: нам даже подсказывают, что в диапазоне от- 1 до 1 это будет линия, а вот в этом диапазоне график будет выглядеть вот таким вот образом. Поэтому пропорциональная составляющая у вас будет работать тогда, когда изгиб трассы невелик, а как только вы встретите резкий поворот, у вас сыграет роль кубическая составляющая. Можете воспользоваться этим советом. Итак, в данной части мы познакомились с пропорциональным регулятором. Давайте вспомним нашу схему, уберем из нее релейный алгоритм и поставим на его место регулятор. Естественно, вы можете использовать регулятор не только в мобильном роботе. Им существует масса приложений, это одна из базовых вещей в теории автоматического управления. И те, кому интересно, могут посмотреть в дополнительных материалах про пропорциональный интегральный дифференциальный регулятор — ПИД-регулятор, который учитывает еще больше вещей и позволяет сделать работу многих устройств оптимальной. А теперь я вам хочу предложить еще один вариант регулятора. Он может пригодиться в других задачах. Допустим, что у вас робот едет по прерывистой линии. Нарисую ее условно: вот это ее сплошная часть, а дальше начинается что-то такое. Если мы будем пользоваться единственным датчиком, когда мы дойдем до конца отрезка, произойдет что-то непредвиденное. Поэтому предлагаю вам следующий вариант: вы можете вновь взять 2 датчика, расположить их таким же образом, как делали когда работали с релейным алгоритмом, и отслеживать несколько другую вещь, нежели граница линии. Вы можете считывать значения с обоих датчиков и стремиться к тому, чтобы разница всегда была нулевой. То есть теперь ваша задача не стремиться к какому-то заранее определенному значению, а добиваться такой ситуации, чтобы под обоими датчиками был одинаковый фон. То есть если вы едете по линии, у вас оба датчика видят ее границу. Если вы отклоняетесь от линии, то один датчик оказывается на белом, другой оказывается на черном. Между ними возникает разница, соответственно, вы можете вновь регулировать разницу между скоростями колес. Вы вернетесь вновь на линию, и, когда дойдете до ее конца, ничего страшного не случится. Вот здесь будет последний серый отрезок, затем оба датчика окажутся на белом. С точки зрения робота, ничего страшного не произошло, потому что белое и белое — одинаковы. Затем один из датчиков снова окажется на черном пятне, и снова возникнет ситуация, когда роботу нужно скорректироваться. Он вновь скорректируется и окажется обоими датчиками на неком сером поле, на границе между черным пятном и белым фоном. Причем уровень насыщенности серого будет увеличиваться, уменьшаться в зависимости от того, в каком месте вот этих вот пятен вы находитесь. Никакой беды нету, потому что главное для вас — отсутствие разницы между значениями датчиков. С точки зрения кода, ничего радикально не изменится, кроме того что ошибку вы будете вычислять не так, как мы это делали раньше, считывая значение текущее и вычитая из него заранее определенное — так мы делали раньше. А теперь вы можете делать вот так: считывать оба датчика и искать разницу между ними. То есть старый способ нам уже в этом случае не пригодится. Обратите внимание на экранчик. [ШУМ] Я добавил в основной цикл одну строчку, которая постоянно выводит на него показания датчика. И как только они отклоняются от установленной нормы, робот начинает сильно корректировать свое положение. Итак, мы добились гораздо более удовлетворительного результата, чем получалось с релейным алгоритмом. Конечно, есть к чему еще стремиться: можно сделать проходы поворотов еще более плавными, и один из способов я вам подскажу чуть дальше. Однако в целом задача езды по линии решена, и вы можете использовать ее как основу для каких-то прикладных задач.