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

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, а делать его минимально возможным

mil-lion

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

Вчера в поле облетал свой квадрик на новой прошивке RC11 на раме Martian-II 220mm. Сетап: моторы DYS SE2205PRO, регуляторы ZTW Flash 30A, мозг LUX F3, пропы трешки DAL V2 T5045BN, 4S аккумулятор. Прошивки BetaFlight 3.0.0-RC11, BLHeli_S A_H_20 16.2.
Все настройки по умолчанию, ПИД не трогал. Установил только луптайм 8/8/32. При этом загрузка проца 50%. Включена телеметрия, ОСД, управление по PPM.
Для меня квадрик летает отлично! Четкое поведение и управление. Крутил и флипы и ролы, ничего не заметил. Но я пока пилот не ас, но в курсовой ни дрожи ни болтанки. Летает по “рельсам” четкое и адекватное поведение. Падал камнем вниз, аирмод включён на двух режимах Acro и Horizon. За 5 акков полёта ни одного краха, правда через ворота не летал, но летал на большой скорости так медленней не мог - наклон камеры установил в 30 градусов. Очень понравилось! До этого летал на 250 размере и с аккумулятором внутри.
Но есть один момент: от порыва ветра квадрик раскачивало. Это нормально или все таки нужно ПИД подкрутить? В остальном просто нет нареканий, или просто опыт маловат 😃
Да к чему я все это писал: регуляторы отработали очень хорошо, ни одного срыва синхро, но у меня параллельно регулятором впаяны конденсаторы 470мкФ. И порадовал мозг LUX на таком луптайме и с такой загрузкой проца - ни каких проблем. На SPRF3 этого не получалось.

mil-lion
Кариёзный_монстр:

Не должно раскачивать

Но это было один два раза. Может резкий порыв ветра был. До этого квадрики были тяжёлые (Eachine Racer 250 & Falcon 250), а новый весит 360 грамм без акка, да и сейчас аккумулятор сверху (парусность выше сбоку стала)

Кариёзный_монстр
mil-lion:

Может резкий порыв ветра был. До этого квадрики были тяжёлые (Eachine Racer 250 & Falcon 250), а новый весит 360 грамм без акка, да и сейчас аккумулятор сверху (парусность выше сбоку стала)

У меня 337 весит и акк сверху, не раскачивает ))

mil-lion
Кариёзный_монстр:

У меня 337 весит и акк сверху, не раскачивает ))

Значит надо будет разбираться из-за чего. Заказал BlackBox, на Lux его нет, буду тогда учиться читать логи. На SPRF3 пробовал - не удобно, долго копируется, мало пишется по времени, в поле неудобно компом пользоваться, в поле летать надо!

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

вдруг узнаю полезное по настройке И

Есть в видео и про I . Если подбросите квадрик вверх и уберете газ смотрите как он себя ведет, если падает и дергается это признак маленького I Увеличивайте пока не начнет падать без дерготни. Скитзо тоже говорит в видео что при малом I (он показывает ) в перевернутом полете при убранном газе квадрик может дергаться по питчу или ролу или (он показывает) во всех направлениях, увеличивайте I по осям.

PS Еще раз повторюсь В видео это 15м 02 сек и далее.Переворачивает квадри кверху ногами, говорит что убран газ и показывает как ведет себя квадрик при малом I