Прошивка BLHeli_S для ESC
Это совсем на пальцах, уровень 5го класса как проще объяснить я не знаю
Видимо я еще в четвертом.
Теперь скажите как всё это в реалии применить. Настраиваем P до посинения и появления осциляций. Затем вваливаем D - пока не будет трясти на спуске или после флипэндрола, потом еще вваливаем P. А I как настраивать?
А как настраивать по Yaw?
Вы меня простите, что спрашиваю сто раз обмусоленную тему. Но мне никто не рассказывал про Пиды. По гуляющим видео всё не однозначно. У каждого своя методика и она в корне отличается от других (ну кроме настройки P).
Я вот и спрашиваю пока точно вот уверен не буду что всё верно понял.
Но в вашем описании работа I больше похожа на работу D.
Нет. Алексей все правильно объяснил I. D - это тормоз P когда мы очень быстро двигаемся к нужной точке. Поэтому раз скорость приближения большая, то пора тормозить чтобы не было перерегулирования (осциляции). D - дифференцирующая составляющая управления, она связанна со скоростью ошибки, а I - интегральная - почти постоянная составляющая ошибки.
Под настройку ПИД - наверное лучше отдельную ветку создавать и там обсуждать.
D - это тормоз
Игорь, D это не тормоз, это прогноз, он не так работает как вы описали. Он берет несколько значений параметра P суммирует и делит и выдает мозгу, но никак не занимается торможением. Вы правильно написали связана со скоростью ошибки, она определяет скорость изменения P а как реагировать дело полетника.
Настраиваем 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 - это константы, вы же их и задаете в конфигураторе, то как они могут меняться? Поэтому все делается именно с ошибкой управления.
Первый пункт правильный. А вот D - увеличиваем чтобы прошли осциляции от большого Р.
Я не лезу в драку 😃 Но я всегда считал что при большом P при увеличение D и появление осцилляций связано с суммарным пид Для этого в блекбокс и ввели значения суммарные пиды.
Сам по себе P и D могут быть небольшими, но суммарный значение превышает границу за которой осцилляция . Они же работают в фазе P и D. D строго следует за P
Так на форумах это пробегало.
P, D, I - это константы,
Это не константы, это границы за пределы которых вы запрещаете значения выбегать, эти значения ( P D I ) переменны, а не постоянны, посмотрите блекбокс. Именно в этих заданных вами границах синусоида работает, узкие границы, маленькие значения, большие границы - большие разбросы и осцилляции. В сети 220 вольт, но напряжение может гулять от и до но не выше, если 5 вольт другое кино. ( не удачный пример )
Увеличение D же по факту гасит P, разве нет?
Увеличение D же по факту гасит P, разве нет?
D это пресc секретарь P и его задача доносить мозгу как ведет себя P / Я вот поискал писали же раньше
Писал Крайков, он уже давно не на конфе, живет в штатах, лётчик, летает на реактивном самолете , мы с ним разбирались когда то в этом, но я уже и подзабыл
rcopen.com/forum/f136/topic362347/20525
rcopen.com/forum/f136/topic362347/20536
rcopen.com/forum/f136/topic362347/20542
Увеличение D же по факту гасит P, разве нет?
И да и нет 😒
Хотя вобще не правильно говорить что она гасит или не гасит P, она с ним вобще ничего не делает, P отдельно, D отдельно.
D увеличивает силу противодействия в момент увеличения ошибки, и уменьшает силу противодействия в момент уменьшения ошибки. Скорость изменения ошибки может быть как положительной так и отрицательной, соответственно и вес D в корректирующем воздействии либо положительный, либо отрицательный в зависимости от знака скорости изменения ошибки.
Это не константы, это границы за пределы которых вы запрещаете значения выбегать, эти значения ( P D I ) переменны, а не постоянны, посмотрите блекбокс.
Если честно меня это немного напрягает, как можно показывать константы графически. Я думаю что это скорее всего на график выводится 3 составляющие сигнала управления из приведенной мной формулы, сигнал умноженный на Р, скорость умноженная на Д и суммарная ошибка умноженная на И.
Все таки лучше в отдельную тему. И давайте я посмотрю исходники Бориса и найду кусок кода где идет расчет.
Скорость изменения ошибки может быть как положительной так и отрицательной, соответственно и вес D в корректирующем воздействии либо положительный, либо отрицательный в зависимости от знака скорости изменения ошибки.
Абсолютно точно написано, я просто утверждаю что когда скорость изменения ошибки положительная она накладывается ( суммируется ) на PID и суммарное значение может превысить предел. Поэтому в ящике и ввели суммарный PID
И давайте я посмотрю исходники Бориса и найду кусок кода где идет расчет.
Отлично, я там дал выше ссылки писал Крайков, там как раз есть ссылки на куски кода Бориса на тот момент.
( потом он их поменял ) Это во второй ссылке, со слов “физически в прошивке Бориса если посмотреть код”
Обновили все файлы прошивки ( версия осталась таже 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.
Последние пару страниц имели много букв п и д ))) спасибо было реально полезно…
Upd: упс, это не тоьуо в этой теме ))) перепутал )))
Upd: упс, это не тоьуо в этой теме ))) перепутал )))
Мы сами тут немного не в тему писали 😃
Отлично, я там дал выше ссылки писал Крайков, там как раз есть ссылки на куски кода Бориса на тот момент.
( потом он их поменял ) Это во второй ссылке, со слов “физически в прошивке Бориса если посмотреть код”
Опять немного не в тему, но вот куски кода Бориса из файла 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
Опять немного не в тему
Наоборот, как раз по делу. Отличная статья и проделана большая работа, меняет у меня лично представление о механизмах того как это работает. Изучу и сохраню. Писать это в основной ветке не нужно, там народу интересны готовые решения и обсуждение конкретного железа, советы по конфигам для покупки и ссылки на новинки. Это для тех кто лезет поглубже, народу это не надо тем более если квадрик сразу полетел, да и летают многие еще поучиться у них 😃 Добавлю только маленький график как ведут себя 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, а делать его минимально возможным
Отличная гифка с графиком! На ней сразу видно что при увеличении П - убыстряется выход на нужное значение, при увеличении И - уменьшается ошибка после выхода на уровень, а при увеличении Д - убирается перерегулирование (осцилляции). Обязательно себе сохраню, чтобы потом можно было аргументировать графически.
Видео посмотрю повнимательней, вдруг узнаю полезное по настройке И.
Вчера в поле облетал свой квадрик на новой прошивке 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 этого не получалось.
Но есть один момент: от порыва ветра квадрик раскачивало
Не должно раскачивать
Не должно раскачивать
Но это было один два раза. Может резкий порыв ветра был. До этого квадрики были тяжёлые (Eachine Racer 250 & Falcon 250), а новый весит 360 грамм без акка, да и сейчас аккумулятор сверху (парусность выше сбоку стала)
Может резкий порыв ветра был. До этого квадрики были тяжёлые (Eachine Racer 250 & Falcon 250), а новый весит 360 грамм без акка, да и сейчас аккумулятор сверху (парусность выше сбоку стала)
У меня 337 весит и акк сверху, не раскачивает ))
У меня 337 весит и акк сверху, не раскачивает ))
Значит надо будет разбираться из-за чего. Заказал BlackBox, на Lux его нет, буду тогда учиться читать логи. На SPRF3 пробовал - не удобно, долго копируется, мало пишется по времени, в поле неудобно компом пользоваться, в поле летать надо!
вдруг узнаю полезное по настройке И
Есть в видео и про I . Если подбросите квадрик вверх и уберете газ смотрите как он себя ведет, если падает и дергается это признак маленького I Увеличивайте пока не начнет падать без дерготни. Скитзо тоже говорит в видео что при малом I (он показывает ) в перевернутом полете при убранном газе квадрик может дергаться по питчу или ролу или (он показывает) во всех направлениях, увеличивайте I по осям.
PS Еще раз повторюсь В видео это 15м 02 сек и далее.Переворачивает квадри кверху ногами, говорит что убран газ и показывает как ведет себя квадрик при малом I