Тема: Немного о PID регуляторах, пропорциональная часть.  (Прочитано 59769 раз)

0 Пользователей и 1 Гость просматривают эту тему.


Оффлайн alienn

  • Сообщений: 104
    • Вадим
    • Юнак
  • Город: Санкт-Петербург
« Ответ #45 : 07 Ноябрь, 2013, 14:56:34 pm »
Включаю ветер 12 единиц и не могу подбором P I D "остановить хвост"))
Подскажите комбинацию?
Против ветра помогает в основном параметр I.  По сути, этот самый I и нужен, только для корректировки ветра - внешнего воздействия.
Ветер начинает сдувать вертолет. Появляется ошибка в I Acc. Начинает действовать I, в сторону противоположную ошибке. Величина действия - это I Gain * I Acc
Если ветер слишком сильный, а величины I или I Acc недостаточно, то сила противодействующая ветру получается маленькой и хвост уводит.
К сожалению слишком большой I начинает мешать при остановках: т.к. система имеет задержку, и команда выполняется не сразу, то накапливается отставание, которое потом приводит к "перелету". И чем больше I, и чем больше задержка (или медленнее серва), то тем больше "перелет".
Для борьбы с перелетом помогает параметр D - который по факту прогнозирует будущий перелет и начинает заранее притормаживать. Слишком большой D - приведет к колебаниям, слишком маленький - к перелетам.
P - тоже работает при ветре, но недостаточно. Он убирает ускорение, но не сам факт сноса хвоста.
Рекомендую для понимания принципов работы попробовать по убирать разные составляющие PID в 0. Попробовать только P , с ветром, без ветра.. Только I, PI,  PID...



Оффлайн alienn

  • Сообщений: 104
    • Вадим
    • Юнак
  • Город: Санкт-Петербург
« Ответ #46 : 07 Ноябрь, 2013, 14:58:16 pm »
не могу подбором P I D "остановить хвост"))
D выставить в 0... ( похоже баг в программе)
D в 0 - не поможет, нет там такого бага :) (см. предидущее сообщение, там подробнее расписал)

Оффлайн alienn

  • Сообщений: 104
    • Вадим
    • Юнак
  • Город: Санкт-Петербург
« Ответ #47 : 07 Ноябрь, 2013, 15:00:52 pm »
ПОхоже в программе вертолёт "безмассовый", т.е. у него инерция почти нулевая... что, в общем виде, не совсем соответствует нашему практическому опыту :) Т.е.там видно что он на одной P компоненте может "притянуться" к нужной точке, а не "пролететь" через неё.
Нет, вертолет имеет вес и инерцию. Серво - это сила действующая на хвост. т.е. PID контроллер по факту управляет силой. А значение которое анализирует - угловая скорость.

Оффлайн alienn

  • Сообщений: 104
    • Вадим
    • Юнак
  • Город: Санкт-Петербург
« Ответ #48 : 07 Ноябрь, 2013, 15:06:17 pm »
I Acc - Максимальная величина ошибки которая может накопиться в I аккумуляторе.
Давай уточним что мы понимаем под этим...Я понимаю это "сколько шагов назад" мы интегрируем ( величина от 0 до 1-2 секунд или сколько-то тиков)...
У меня в данном случае не совсем то, что ты имеешь ввиду. В моей реализации нет возможности ограничить - 2 сек. Интегратор - это просто переменная, накапливающая ошибку. С ограничением абсолютного значения. В принципе можно переделать и усложнить интегратор, чтобы такая возможность появилась.
И коэфф. при I - прошу!!! сделай возможность условно от -... до ...+ а не от 0.
ок,сделаю.
Кстати, наверное имеет смысл еще хвост сделать "потяжелее-поинерционнее", т.к. в режиме d==0 i==0 и со "стандартными" задержками он должен "заводиться", а то уж сильно всё хорошо выглядит ..( точнее не видна польза от D компоненты - он на одной P стабилизируется)
Видимо вес тоже надо вынести на регулировку (он учитывается в программе). Но тогда с ним придется выносить регулировку диапазона хода сервы ( макс. мин. сила которая может быть приложена к хвосту)

Оффлайн AndRay

  • Старейшина клуба
  • Сообщений: 3574
    • Андрей
  • Город: Свято-Питер
« Ответ #49 : 07 Ноябрь, 2013, 15:29:37 pm »
Серво - это сила действующая на хвост. т.е. PID контроллер по факту управляет силой
Вот!!!  Грубейшая ошибка "всех студентов"! Ты, когда летаешь, управляешь не "силой", а "ручкой" на самом деле...И выходом пид-контроллера в твоей ситуации должно быть не положение ручки, "на сколько щелчков передвинуть ручку и в какую сторону", чтобы в конце концов она заняла нужное положение. Чтобы в ситуации, когда система стабилизировалась ( даже с ветром), угловая скорость - НУЛЬ, на выходе PID контроллера - НУЛЬ, а ручка остановилась находится к некотором ненулевом положении.   СРазу не ругайся только :) А в твоей реализации ты должен постоянно ветер компенсировать I компонентой, которая для этого не предназначена то ( на самом деле), поскольку когда ты "вышел в точку" то все компоненты обнуляются.

А значение которое анализирует - угловая скорость.
правильно

В моей реализации нет возможности ограничить - 2 сек.
неправильно

В принципе можно переделать и усложнить интегратор, чтобы такая возможность появилась.
чтобы гасить колебания - это необходимо.

Видимо вес тоже надо вынести на регулировку (он учитывается в программе). Но тогда с ним придется выносить регулировку диапазона хода сервы ( макс. мин. сила которая может быть приложена к хвосту)
Отношение силы к массе называется ускорением :) Можно один параметр вывести -ускорение:)
« Последнее редактирование: 07 Ноябрь, 2013, 15:51:03 pm от AndRay »

Оффлайн AndRay

  • Старейшина клуба
  • Сообщений: 3574
    • Андрей
  • Город: Свято-Питер
« Ответ #50 : 07 Ноябрь, 2013, 15:42:47 pm »
Если ветер слишком сильный, а величины I или I Acc недостаточно, то сила противодействующая ветру получается маленькой и хвост уводит.
К сожалению слишком большой I начинает мешать при остановках: т.к. система имеет задержку, и команда выполняется не сразу, то накапливается отставание, которое потом приводит к "перелету". И чем больше I, и чем больше задержка (или медленнее серва), то тем больше "перелет".
Просто не то регулируешь :)  PID регулятор для того и создан, чтобы так не регулировать, а с любым ветром выходить в нуль максимально чётко. Будет время сегодня вечером  - напишу часть про I компоненту. Если очень грубо - то PID регулятор хвоста должен пододвигать двигать триммер.

Оффлайн alienn

  • Сообщений: 104
    • Вадим
    • Юнак
  • Город: Санкт-Петербург
« Ответ #51 : 07 Ноябрь, 2013, 16:03:18 pm »
Серво - это сила действующая на хвост. т.е. PID контроллер по факту управляет силой
Вот!!!  Грубейшая ошибка "всех студентов"! Ты, когда летаешь, управляешь не "силой", а "ручкой" на самом деле...И выходом пид-контроллера в твоей ситуации должно быть не положение ручки, "на сколько щелчков передвинуть ручку и в какую сторону", чтобы в конце концов она заняла нужное положение. Чтобы в ситуации, когда система стабилизировалась ( даже с ветром), угловая скорость - НУЛЬ, на выходе PID контроллера - НУЛЬ, а ручка остановилась находится к некотором ненулевом положении.   СРазу не ругайся только :) А в твоей реализации ты должен постоянно ветер компенсировать I компонентой, которая для этого не предназначена то ( на самом деле), поскольку когда ты "вышел в точку" то все компоненты обнуляются.
Не согласен. В корне. Во всем.
1. PID контроллер не может управлять "Ручкой". У него нету такой возможности. У него есть выход на серву. Т.е. он может заставить серву занять какое-то положение. А полпожение сервы - это угол атаки хвостовых лопастей, а отсюда сила которую выдает хвостовой ротор. Это то, чем PID controller может управлять.
2. Еще он может получать управляющее воздействие - то самое положение ручки. А задаем мы с помощью ручки желаемую угловую скорость.
3. Еще контроллер может измерять текущее состояние - также угловую скорость, текущую. И задача PID контроллера привести текущее к желаемому.
Итого: Получив на вход необходимую угловую скорость,меряет текущую угловую скорость и в результате он вырабатывает воздействие - силу, (отклонение серво).

Если хочешь поспорить - прошу указывать с каким пунктом не согласен и аргументировано.
Цитата: AndRay
А в твоей реализации ты должен постоянно ветер компенсировать I компонентой, которая для этого не предназначена то
На вертолете это её единственное назначение. Задача I компоненты компенсация внешних воздействий, если по какой-то причине P компоненты недостаточно для достижения требуемого результата.

Оффлайн alienn

  • Сообщений: 104
    • Вадим
    • Юнак
  • Город: Санкт-Петербург
« Ответ #52 : 07 Ноябрь, 2013, 16:12:17 pm »
Вот!!!  Грубейшая ошибка "всех студентов"! Ты, когда летаешь, управляешь не "силой", а "ручкой" на самом деле...
Я управляю ручкой, а контроллер - сервой (т.е. силой). И мое управление "ручкой" вообще никакого отношения не имеет к итоговому положению серво. Я с помощью ручки даю задачу контроллеру организовать мне необходимую угловую скорость, а как уж он этого добьется - это его личные проблемы.
Кстати Аэробусов первый ввел подобную систему управления самолотом (FBW - fly by wire). Данная система не дает возможности летчикам непосредственно воздейстовать на рулевые поверхности самолета (элероны, рули высоты и т.д.), вместо этого, система получает целевое значение, и самостоятельно решает как этого добиться. Так конечно не просто PID контроллер, но идея таже - пилот не управляет рулевыми поверхностями - он ставит задачу компьютеру, а он это выполняет. У нас с FBL системой - тоже самое. Мы ставим задачу - она выполняет.

Оффлайн AndRay

  • Старейшина клуба
  • Сообщений: 3574
    • Андрей
  • Город: Свято-Питер
« Ответ #53 : 07 Ноябрь, 2013, 16:15:30 pm »
1. PID контроллер не может управлять "Ручкой". У него нету такой возможности. У него есть выход на серву. Т.е. он может заставить серву занять какое-то положение. А полпожение сервы - это угол атаки хвостовых лопастей, а отсюда сила которую выдает хвостовой ротор. Это то, чем PID controller может управлять.
Я же говорю - "не ругайся" :). У тебя есть текущее положение ручки-тримера..оно уже есть. А пидконтроллер на каждом шаге должен тебе говорить насколько её надо подвинуть ( а не в какое положение). И сила контроллера в том, что ничего не зная о том, как оно работает - он выведет тебя в точку. Ну смотри - у тебя падают обороты хвоста...надо компенсировать - подвинуть ручку( при этом не изменив силу)

Задача I компоненты компенсация внешних воздействий, если по какой-то причине P компоненты недостаточно для достижения требуемого результата.
Нет, это вообще не так - жди текста :)

Оффлайн alienn

  • Сообщений: 104
    • Вадим
    • Юнак
  • Город: Санкт-Петербург
« Ответ #54 : 07 Ноябрь, 2013, 16:17:37 pm »
В моей реализации нет возможности ограничить - 2 сек.
неправильно
Нет здесь правильного или не правильного. Это один из вариантов реализации интегратора. Самый простой из них.
Отношение силы к массе называется ускорением :) Можно один параметр вывести -ускорение:)
Согласен, он в итоге и рассчитывается.

Оффлайн AndRay

  • Старейшина клуба
  • Сообщений: 3574
    • Андрей
  • Город: Свято-Питер
« Ответ #55 : 07 Ноябрь, 2013, 16:27:30 pm »
Нет здесь правильного или не правильного. Это один из вариантов реализации интегратора. Самый простой из них.
нет, это не совсем так. Твоя версия пригодна только в случае достаточно вязкой системы, которая тормозясь плавно подбирается к нужной точке и никак до неё не доберётся...И чтобы её подтолкнуть - надо её "подтолкнуть" интегральной компонентой. Но, для системы с откровенной перерегулировкой, склонной к болтанке вокруг точки значение интегрировать I компоненту больше, чем за период колебаний - дело не только малополезное ( интеграл за период - нуль), но и вредное, поскольку каждые полфазы фазы значение будет прыгать от максимума до минимума.

Оффлайн alienn

  • Сообщений: 104
    • Вадим
    • Юнак
  • Город: Санкт-Петербург
« Ответ #56 : 07 Ноябрь, 2013, 16:31:34 pm »
1. PID контроллер не может управлять "Ручкой". У него нету такой возможности. У него есть выход на серву. Т.е. он может заставить серву занять какое-то положение. А полпожение сервы - это угол атаки хвостовых лопастей, а отсюда сила которую выдает хвостовой ротор. Это то, чем PID controller может управлять.
Я же говорю - "не ругайся" :). У тебя есть текущее положение ручки-тримера..оно уже есть. А пидконтроллер на каждом шаге должен тебе говорить насколько её надо подвинуть ( а не в какое положение). И сила контроллера в том, что ничего не зная о том, как оно работает - он выведет тебя в точку. Ну смотри - у тебя падают обороты хвоста...надо компенсировать - подвинуть ручку( при этом не изменив силу)
Что такое триммер? Триммер при работе с гироскопами рекомендуется ставить в 0. Потому что иначе гироскоп (он же PID контроллер) начнет воспринимать это как команду начать медленно вращаться.
И контроллер не может управлять ничем кроме серво. Нету у него такой возможности.

Ну смотри - у тебя падают обороты хвоста...надо компенсировать - подвинуть ручку( при этом не изменив силу)
Какую ручку?? Куда подвинуть?? Я не должен вообще ничего двигать. Все должен сделать контроллер. Но у него нету возможности менять мой триммер или двигать мою ручку.
Ок - давай расмотрим, что будет.
Обороты падают, при том же положении сервы, сила которая будет сгенерирована хвостом станет меньше. Начнется вращение. Контроллер его заметит и даст команду серве подвинуться. Сила вернется на место. Вращение остановится.
По сути - падение оборотов ротора - такое же внешнее воздействие как и ветер. И задача регулятора - несмотря на внешние воздействия привести управляемое значение в соответствии с целевым.
Я в программе не стал эмулировать все варианты внешних воздействий - ограничился одним - ветром, т.к. этого достаточно чтобы понять, как контроллер реагирует на внешние воздействия.

Оффлайн alienn

  • Сообщений: 104
    • Вадим
    • Юнак
  • Город: Санкт-Петербург
« Ответ #57 : 07 Ноябрь, 2013, 16:36:46 pm »
Но, для системы с откровенной перерегулировкой, склонной к болтанке вокруг точки значение интегрировать I компоненту больше, чем за период колебаний - дело не только малополезное ( интеграл за период - нуль), но и вредное, поскольку каждые полфазы фазы значение будет прыгать от максимума до минимума.
Согласен, так и будет. В том же мануале Брэйна написано - слишком большой I приводит к медленным колебаниям. Как раз по этой причине.
Вопрос - где взять период колебаний. На лету считать и изменять длину интегрирования? Но для этого все равно придется сделать хоть один цикл колебания. А это нежелательно.

Оффлайн AndRay

  • Старейшина клуба
  • Сообщений: 3574
    • Андрей
  • Город: Свято-Питер
« Ответ #58 : 07 Ноябрь, 2013, 16:39:27 pm »
Контроллер его заметит и даст команду серве подвинуться. Сила вернется на место. Вращение остановится.
Верно!!! только серва будет стоять в другом положении! Т.е. конкретное положение сервы - оно вообще не связано с той силой, с которой она "работает". На одних оборотах - одна одна, на других - другая. При ветра это положение сервы крутит вертолёт влево, а при другом - вправо. ПОэтому ПИД выход пидрегулятора - он не положение сервы напрямую должен выставлять, а должен указывать куда эту серву подвинуть. Почему - потому что в стабильной ситуации у тебя выход пидрегулятора - всегда нуль (P=0,D=0, I=0)...А положение сервы - нет.

Оффлайн alienn

  • Сообщений: 104
    • Вадим
    • Юнак
  • Город: Санкт-Петербург
« Ответ #59 : 07 Ноябрь, 2013, 16:57:24 pm »
Контроллер его заметит и даст команду серве подвинуться. Сила вернется на место. Вращение остановится.
Верно!!! только серва будет стоять в другом положении! Т.е. конкретное положение сервы - оно вообще не связано с той силой, с которой она "работает". На одних оборотах - одна одна, на других - другая. При ветра это положение сервы крутит вертолёт влево, а при другом - вправо. ПОэтому ПИД выход пидрегулятора - он не положение сервы напрямую должен выставлять, а должен указывать куда эту серву подвинуть. Почему - потому что в стабильной ситуации у тебя выход пидрегулятора - всегда нуль (P=0,D=0, I=0)...А положение сервы - нет.
Вот тут я вообще не спорю, потому что именно так все и происходит. (Посмотри графики, PID Control (розовый) в стабильных положениях - 0). За небольшими комментариями - про положение сервы он все-таки должен знать, т.к. нельзя её двигать дальше физических лимитов.