Прошивка BLHeli_S для ESC

Mugz
Сергей_Уж:

Вот график на котором все понятно, работа I видна между двумя пунктирными линиями. И чё его трогать ?

Спасибо, уважаемый! Но я как баран на новые ворота… =)

100xanoff
Сергей_Уж:

Сам посуди, Р при появлении отклонения от внешнего воздействия “пинает” раму в противоположном направлениии, это его задача . Если Сила пинка большая, рама не остановится в центре и пролетит его в противоположную сторону, это осциляции и то что квадрик лихорадит ты увидишь. D предупреждает мозг о силе P и предсказывает как нужно тормозить чтобы сильно не пролететь через ноль. Это задача D, при малом значении квадрик пружинит, при большом, D участвует в суммарном пид и тоже может вызвать осцилляцию, это тоже ты увидишь. Задача I при этом на заключительном этапе до успокоить раму возле нуля и не дать колебаниям выйти за допустимые рамки. Вот график на котором все понятно, работа I видна между двумя пунктирными линиями. И чё его трогать ? 😃

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

Если вы посмотрите график I в блекбоксе вы поймете что успокоить ту синусойду, создаваемую P и D он не может, он просто сдвигает общие пиды выше или ниже средней линии. А само значение I это не коэффициент воздействия, а время за которое измеряется ошибка и чем оно больше тем точнее воздействие, но дольше реакция. Поэтому I обычно уменьшают чтобы он не вносил задержку в отклик, но если уменьшить его слишком сильно, то он просто не будет должным образом улавливать ошибку.

П.С. а еще после того как мы задрали P, затем D, мы можем еще раз поднять P, т.к. с более высоким D можно поднимать P еще выше без последствий, однако на уровне ощущений это в современных контролерах неуловимо, только по блекбоксу.

mil-lion

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

Сергей_Уж

Согласен с вами. Но график вверху принадлежит автору прошивки Boris.B и я привел перевод его постинга кажется прошлого года о роли I в его PID контроллере. Я не буду спорить, у меня это отложилось так. Мой товарищь преподает что такое PID студентам, мы говорили с ним, вроде не возражал. Понятно что интеграл это сумма по определению, как это точно работает здесь 100 процентов никто не знает, PID есть если кто не в курсе и в паяльнике 😃

PS продается на Бенгуде на жалах Т12, в настройках меню кажется 10 или 12 пунктов, три из них настройка PID 😃 Какова роль I в паяльнике ? 😃

skydiver
Сергей_Уж:

Какова роль I в паяльнике ?

Прикоснулись паяльником к земляному полигону, пошел отбор тепла. На изменение скорости остывания - отработала D, но ее не хватило - т.к. полигон оказался большой и теплоемкий. На изменение температуры отработала P, ровно пропорционально температуре остывания(ошибки), но этого тоже не хватило, температура установилась на N градусов меньше чем заданная. Далее вступает в дело I - смотрит, прошла секунда температура все еще не вернулась к заданной - добавила мощности, прошла еще секунда - если не вернулась - добавила еще мощности, и т.д. Т.е. чем дольше сохраняется ошибка, тем больше вес I составляющей в компенсирующем воздействии. Доходчиво? Тоже самое и в коптерах, например с ветром.

Это совсем на пальцах, уровень 5го класса:) как проще объяснить я не знаю

Сергей_Уж
skydiver:

Прикоснулись паяльником к земляному полигону, пошел отбор тепла.

Спасибо Алексей, а то народ когда комментирует пункты меню, просит эти три пункта просто не трогать 😃

Паяльник
banggood.com/DSK-Digital-Soldering-Station-Kit-Sol…

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

PS Повышаю ставку, это за 3 класс 😃

Mugz
skydiver:

Это совсем на пальцах, уровень 5го класса как проще объяснить я не знаю

Видимо я еще в четвертом.
Теперь скажите как всё это в реалии применить. Настраиваем P до посинения и появления осциляций. Затем вваливаем D - пока не будет трясти на спуске или после флипэндрола, потом еще вваливаем P. А I как настраивать?
А как настраивать по Yaw?

Вы меня простите, что спрашиваю сто раз обмусоленную тему. Но мне никто не рассказывал про Пиды. По гуляющим видео всё не однозначно. У каждого своя методика и она в корне отличается от других (ну кроме настройки P).

Я вот и спрашиваю пока точно вот уверен не буду что всё верно понял.

mil-lion
Сергей_Уж:

Но в вашем описании работа I больше похожа на работу D.

Нет. Алексей все правильно объяснил I. D - это тормоз P когда мы очень быстро двигаемся к нужной точке. Поэтому раз скорость приближения большая, то пора тормозить чтобы не было перерегулирования (осциляции). D - дифференцирующая составляющая управления, она связанна со скоростью ошибки, а I - интегральная - почти постоянная составляющая ошибки.
Под настройку ПИД - наверное лучше отдельную ветку создавать и там обсуждать.

Сергей_Уж
mil-lion:

D - это тормоз

Игорь, D это не тормоз, это прогноз, он не так работает как вы описали. Он берет несколько значений параметра P суммирует и делит и выдает мозгу, но никак не занимается торможением. Вы правильно написали связана со скоростью ошибки, она определяет скорость изменения P а как реагировать дело полетника.

mil-lion
Mugz:

Настраиваем P до посинения и появления осциляций. Затем вваливаем D - пока не будет трясти на спуске

Первый пункт правильный. А вот D - увеличиваем чтобы прошли осциляции от большого Р. Потом опять увеличиваем Р и потом увеличиваем D чтобы их убрать. И так несколько итераций. Далее немного уменьшаем Р и D. С ними все. По I - не подскажу, сам не понимаю как ее настраивать, говорят что как раз при спусках и резких подъемах надо настраивать I.

По хорошему ПИД надо настраивать держа квадрик в руках, соблюдая ТБ, и даем квадригу изменение по путчу или ролу или по yaw и смотрите поведение квадрика на возмущение, он должен четко сопротивляться без колебаний (осциляций) возвращаться на место.

Сергей_Уж:

Игорь, D это не тормоз, это прогноз, он не так работает как вы описали. Он берет несколько значений параметра P суммирует и делит и выдает мозгу, но никак не занимается торможением. Вы правильно написали связана со скоростью ошибки, она определяет скорость изменения P а как реагировать дело полетника.

В классическом ПИД: Uупр = P*delta(i) + D*(delta(i)-delta(i-1))/t + I*СУММА(delta(i)), где delta - это ошибка управления между входным и выходным сигналами.
Правильно D - прогноз как мы быстро достигаем нужного положения, и D применяется к скорости ошибки управления, но никак P, ведь P, D, I - это константы, вы же их и задаете в конфигураторе, то как они могут меняться? Поэтому все делается именно с ошибкой управления.

Сергей_Уж
mil-lion:

Первый пункт правильный. А вот D - увеличиваем чтобы прошли осциляции от большого Р.

Я не лезу в драку 😃 Но я всегда считал что при большом P при увеличение D и появление осцилляций связано с суммарным пид Для этого в блекбокс и ввели значения суммарные пиды.
Сам по себе P и D могут быть небольшими, но суммарный значение превышает границу за которой осцилляция . Они же работают в фазе P и D. D строго следует за P
Так на форумах это пробегало.

mil-lion:

P, D, I - это константы,

Это не константы, это границы за пределы которых вы запрещаете значения выбегать, эти значения ( P D I ) переменны, а не постоянны, посмотрите блекбокс. Именно в этих заданных вами границах синусоида работает, узкие границы, маленькие значения, большие границы - большие разбросы и осцилляции. В сети 220 вольт, но напряжение может гулять от и до но не выше, если 5 вольт другое кино. ( не удачный пример )

PaulM

Увеличение D же по факту гасит P, разве нет?

Сергей_Уж
PaulM:

Увеличение D же по факту гасит P, разве нет?

D это пресc секретарь P и его задача доносить мозгу как ведет себя P / Я вот поискал писали же раньше
Писал Крайков, он уже давно не на конфе, живет в штатах, лётчик, летает на реактивном самолете , мы с ним разбирались когда то в этом, но я уже и подзабыл
rcopen.com/forum/f136/topic362347/20525
rcopen.com/forum/f136/topic362347/20536
rcopen.com/forum/f136/topic362347/20542

skydiver

Увеличение D же по факту гасит P, разве нет?

И да и нет 😒
Хотя вобще не правильно говорить что она гасит или не гасит P, она с ним вобще ничего не делает, P отдельно, D отдельно.
D увеличивает силу противодействия в момент увеличения ошибки, и уменьшает силу противодействия в момент уменьшения ошибки. Скорость изменения ошибки может быть как положительной так и отрицательной, соответственно и вес D в корректирующем воздействии либо положительный, либо отрицательный в зависимости от знака скорости изменения ошибки.

mil-lion
Сергей_Уж:

Это не константы, это границы за пределы которых вы запрещаете значения выбегать, эти значения ( P D I ) переменны, а не постоянны, посмотрите блекбокс.

Если честно меня это немного напрягает, как можно показывать константы графически. Я думаю что это скорее всего на график выводится 3 составляющие сигнала управления из приведенной мной формулы, сигнал умноженный на Р, скорость умноженная на Д и суммарная ошибка умноженная на И.
Все таки лучше в отдельную тему. И давайте я посмотрю исходники Бориса и найду кусок кода где идет расчет.

Сергей_Уж
skydiver:

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

Абсолютно точно написано, я просто утверждаю что когда скорость изменения ошибки положительная она накладывается ( суммируется ) на PID и суммарное значение может превысить предел. Поэтому в ящике и ввели суммарный PID

mil-lion:

И давайте я посмотрю исходники Бориса и найду кусок кода где идет расчет.

Отлично, я там дал выше ссылки писал Крайков, там как раз есть ссылки на куски кода Бориса на тот момент.
( потом он их поменял ) Это во второй ссылке, со слов “физически в прошивке Бориса если посмотреть код”

Сергей_Уж

Обновили все файлы прошивки ( версия осталась таже 16.3 ), возле каждого файла появилась надпись
Update SiLabs BLHeli bootlaoder to rev “d” hex files

Ну и выпустили новую версию сюит под это изменение с новой прошивкой
Changes in 16.3.14.7.0.1:
SiLabs BLHeli bootloader:
 updated rev sign “c” to “d” for BLHeli_S 16.3 and BLHeli 14.7 hex files. No change in functionality.

MFer

Последние пару страниц имели много букв п и д ))) спасибо было реально полезно…

Upd: упс, это не тоьуо в этой теме ))) перепутал )))

Сергей_Уж
MFer:

Upd: упс, это не тоьуо в этой теме ))) перепутал )))

Мы сами тут немного не в тему писали 😃

mil-lion
Сергей_Уж:

Отлично, я там дал выше ссылки писал Крайков, там как раз есть ссылки на куски кода Бориса на тот момент.
( потом он их поменял ) Это во второй ссылке, со слов “физически в прошивке Бориса если посмотреть код”

Опять немного не в тему, но вот куски кода Бориса из файла pid.c в подтверждение моих слов что коэффициенты ПИД контролера константы:

    // ----------PID controller----------
    for (axis = 0; axis < 3; axis++) {
...
            Kp[axis] = PTERM_SCALE * pidProfile->P8[axis];
            Ki[axis] = ITERM_SCALE * pidProfile->I8[axis];
            Kd[axis] = DTERM_SCALE * pidProfile->D8[axis];
...
        // -----calculate P component
        PTerm = Kp[axis] * rP * dynReduction;
...
        // -----calculate I component.
        // Reduce strong Iterm accumulation during higher stick inputs
        float accumulationThreshold = (axis == YAW) ? pidProfile->yawItermIgnoreRate : pidProfile->rollPitchItermIgnoreRate;
        float setpointRateScaler = constrainf(1.0f - (ABS(setpointRate[axis]) / accumulationThreshold), 0.0f, 1.0f);

        // Handle All windup Scenarios
        // limit maximum integrator value to prevent WindUp
        float itermScaler = setpointRateScaler * kiThrottleGain;

        errorGyroIf[axis] = constrainf(errorGyroIf[axis] + Ki[axis] * errorRate * getdT() * itermScaler, -250.0f, 250.0f);

        // I coefficient (I8) moved before integration to make limiting independent from PID settings
        ITerm = errorGyroIf[axis];

        //-----calculate D-term (Yaw D not yet supported)
        if (axis != YAW) {
...
            DTerm = Kd[axis] * delta * dynReduction;

            // -----calculate total PID output
            axisPID[axis] = constrain(lrintf(PTerm + ITerm + DTerm), -900, 900);
...
#ifdef BLACKBOX
        axisPID_P[axis] = PTerm;
        axisPID_I[axis] = ITerm;
        axisPID_D[axis] = DTerm;
#endif

Как оказалось это классическая форма ПИД контроллера ту что я привел выше. Самое замечательное в комментариях кода: D для Yaw не применяется! 😃
Но конечно у Бориса очень много вставок по Д, введены фильтры, и по I - какие то особенности вычисления суммы ошибки.
И для BlackBox выводятся значения PTerm, ITerm и DTerm - а не коэффициенты Kp, Ki, Kd - те которые мы задаем через конфигуратор. И те параметры которые мы вводим - это не ограничения по ПИД, ограничение на управляющий сигнал - это разрядность выходного сигнала и если сумма упр.сигнала превышает, то просто берется макс. допустимое значение.
Очень хороший код у Бориса - читается с листа! Молодец!

Сергей_Уж

Вышла новая прошивка Blheli_S 16.35 ( возможно это прошивка со вчерашними изменениями бута, но нигде инфы не нашел, просто появилась новая папка с прошивкой в которой поменялась цифра, нового сюита нет, поэтому чуть засомневался, может это просто обновленная с новым номером )
www.dropbox.com/sh/…/Blheli_S 16.35?dl=0

mil-lion:

Опять немного не в тему

Наоборот, как раз по делу. Отличная статья и проделана большая работа, меняет у меня лично представление о механизмах того как это работает. Изучу и сохраню. Писать это в основной ветке не нужно, там народу интересны готовые решения и обсуждение конкретного железа, советы по конфигам для покупки и ссылки на новинки. Это для тех кто лезет поглубже, народу это не надо тем более если квадрик сразу полетел, да и летают многие еще поучиться у них 😃 Добавлю только маленький график как ведут себя Kp, Ki, Kd при изменении значений

Хотел написать сюда статью Бориса как лично он настраивает PID, но вижу она чуть устарела, там есть такие вещи типа "I found a dterm_cut_hz of 8 a nice sweet spot on 3 different frames. pterm_cut_hz can be kept higher 40 or even higher. " что сейчас уже не актуально.
Интереснее свежий видео Vlog 3 | Tuning от Skitzo где он на примере RaceFlight рассказывает и показывает настройку PID, посмотрите если кто то не видел И все эти ребята в своих видео обращают внимание что не нужно задирать D, а делать его минимально возможным