PID regulátor

daton
Příspěvky: 413
Registrován: 16 bře 2013, 16:12

PID regulátor

Příspěvek od daton » 22 bře 2016, 12:43

Zdravím
Regulaci jsem nestudoval a proto mám několik dotazů ohledně PID regulátorů a jejich použití v programu například pro robota. Pročítal jsem si materiály o PID regulátorech a i když asi začínám tušit nedokážu se v tomto zatím orientovat. Hodně se mi líbil popis který udělal pan Aleš v balancujícím robotovi
Jinak ty konstanty P, I, D jsou prostě "parametry" toho PID regulátoru (tomu PID regulátoru je vlastně jedno, co reguluje, je to prostě rovnice). Konstanta "P" říká, jak silně bude výstup reagovat na rozdíl naměřené a požadované vstupní hodnoty (tím je zajištěna základní zpětná vazba). Konstanta "I" říká, jak silně bude výstup reagovat na součet odchylek naměřené hodnoty od požadované (tím dokáže lépe dorovnat obě hodnoty [než to dokáže samotná P složka regulátoru]). Konstanta "D" říká, jak silně bude výstup reagovat na rychlost změn rozdílu naměřené a požadované hodnoty (tím omezuje překmity regulátoru).
Proporcionální složka je mi snad jasná je to lineární vztah mezi konstantou a rozdílem požadované a naměřené hodnoty tedy něco jako

Ep = P * (Poz - Nam) kde Ep je hodnota korekce pro akční členy , P = konstanta , Poz = požadovaná hodnota a Nam = naměřená hodota

U integrační složky si už nejsem tak jistý svým výkladem, obecně je integrace zjištění plochy pod křivkou což znamená že pokud se to převede na numerickou matematiku je to součet jednotlivých naměřených částí ale vzhledem k tomu že se zde nejedná o celou plochu například rychlosti daného zařízení (pro představu v grafu S na X ose a D na Y ose ) ale pouze o rozdílovou oblast mezi požadovanou plochou a naměřenou.

Ei = I * ( ( Poz - Nam)1 + (poz - Nam)2 + (Poz - Nam)X ) 1,2 X jsou indexy Ei = integrační korekce

A zde už začínám mít trochu problémy s implementací do programu, například kolik se obvykle počítá těch rozdílů dozadu, jak se ukládají (každé číslo odchylky tak jak se měří například do pole hodnot nebo jen jako prosté číslo zvětšující se o aktuální rozdíl (to by ale brzy narostlo do velkých hodnot)....

No a poslední derivační složka mi dělá největší problémy s pochopením. Derivace je v podstatě tečna k danému místu křivky tolik matematika převodem do numerické matematiky by to měl být rozdíl rozdílů požadované a naměřené hodnoty tedy asi nějak takto.

Ed = D * (( Poz - Nam)1 - (poz - Nam)2 ) Ed derivační korekční složka D konstatnta

No ale je to pouze jeden rozdíl nebo více rozdílů a opět je třeba někde do pole ukládat přechozí data a jak mnoho asi?

MartinL
Příspěvky: 116
Registrován: 24 úno 2013, 14:13

Re: PID regulátor

Příspěvek od MartinL » 22 bře 2016, 12:56

Vezmu to trochu zjednodušeně:
daton píše:Zdravím
Regulaci jsem nestudoval a proto mám několik dotazů ohledně PID regulátorů a jejich použití v programu například pro robota. Pročítal jsem si materiály o PID regulátorech a i když asi začínám tušit nedokážu se v tomto zatím orientovat. Hodně se mi líbil popis který udělal pan Aleš v balancujícím robotovi
Jinak ty konstanty P, I, D jsou prostě "parametry" toho PID regulátoru (tomu PID regulátoru je vlastně jedno, co reguluje, je to prostě rovnice). Konstanta "P" říká, jak silně bude výstup reagovat na rozdíl naměřené a požadované vstupní hodnoty (tím je zajištěna základní zpětná vazba). Konstanta "I" říká, jak silně bude výstup reagovat na součet odchylek naměřené hodnoty od požadované (tím dokáže lépe dorovnat obě hodnoty [než to dokáže samotná P složka regulátoru]). Konstanta "D" říká, jak silně bude výstup reagovat na rychlost změn rozdílu naměřené a požadované hodnoty (tím omezuje překmity regulátoru).
Proporcionální složka je mi snad jasná je to lineární vztah mezi konstantou a rozdílem požadované a naměřené hodnoty tedy něco jako

Ep = P * (Poz - Nam) kde Ep je hodnota korekce pro akční členy , P = konstanta , Poz = požadovaná hodnota a Nam = naměřená hodota

U integrační složky si už nejsem tak jistý svým výkladem, obecně je integrace zjištění plochy pod křivkou což znamená že pokud se to převede na numerickou matematiku je to součet jednotlivých naměřených částí ale vzhledem k tomu že se zde nejedná o celou plochu například rychlosti daného zařízení (pro představu v grafu S na X ose a D na Y ose ) ale pouze o rozdílovou oblast mezi požadovanou plochou a naměřenou.

Ei = I * ( ( Poz - Nam)1 + (poz - Nam)2 + (Poz - Nam)X ) 1,2 X jsou indexy Ei = integrační korekce

A zde už začínám mít trochu problémy s implementací do programu, například kolik se obvykle počítá těch rozdílů dozadu, jak se ukládají (každé číslo odchylky tak jak se měří například do pole hodnot nebo jen jako prosté číslo zvětšující se o aktuální rozdíl (to by ale brzy narostlo do velkých hodnot)....

No a poslední derivační složka mi dělá největší problémy s pochopením. Derivace je v podstatě tečna k danému místu křivky tolik matematika převodem do numerické matematiky by to měl být rozdíl rozdílů požadované a naměřené hodnoty tedy asi nějak takto.

Ed = D * (( Poz - Nam)1 - (poz - Nam)2 ) Ed derivační korekční složka D konstatnta

No ale je to pouze jeden rozdíl nebo více rozdílů a opět je třeba někde do pole ukládat přechozí data a jak mnoho asi?
P složka, tak jak píšete: up = P * e, kde e = požadovaná hodnota - naměřená hodnota (tomu se říká regulační odchylka)
I složka, funguje tak, že pokud je e nenulové, tak stále přidává/ubírá na akčním zásahu
váše rovnice je správná, pro výpočet se používá pouze přírůstek, abych si nemusel pamatovat celou historii, tedy ui(n) = ui(n-1) + I * e
Jak jste správně podotkl, pokud se regulační odchylka neodstraní (tj. nebude nulová), tak akční zásah poroste nade všechny meze. Proto je tam nutné implementovat tzv. omezení integrace (antiwind-up). Existuje mnoho různých přístupů.
D složka reaguje na rychlost změny regulační odchylky, tzn. potřebuje vypočítat derivaci v daném bodě. To se nahrazuje výpočtem diference, nějčastěji z aktuální a minulé hodnoty regulační odchylky (stačí si pamatovat jednu hodnotu zpět).
ud = D * (e - emin)

daton
Příspěvky: 413
Registrován: 16 bře 2013, 16:12

Re: PID regulátor

Příspěvek od daton » 22 bře 2016, 15:45

Zdravím
Tak to jsem rád že se mi podařilo sestavit rovnice, to je první krok. Nyní pokud budu mít výstupy ze tří rovnic, bych je asi měl sečíst ale dávat pozor na znaménka předpokládám že se tam může objevit i záporné číslo, matematika to nevylučuje a tedy zřejmě odečtením nebo přičtením k nějaké další konstantě bude již výsledkem vždy kladná hodnota která se pak bude posílat do driverů například motorů. Je tento postup správně?
A jak se řeší to omezení integrace, tedy omezení množství odchylek, které se načítají? Představoval bych si to jako posuvný registr například o deseti položkách který by při načtení nové tu poslední zapomněl ale pokud by se hodnoty pouze sečítaly pak by nebyla již přesná informace o posledním čísle a tedy by nebylo možné je správně odečíst, musel by se zavést nějaký průměrný odpočet například pokud by bylo deset čísel pak standardně
ui = ui- ui/10
Asi dost naivní představa že?

MartinL
Příspěvky: 116
Registrován: 24 úno 2013, 14:13

Re: PID regulátor

Příspěvek od MartinL » 22 bře 2016, 17:19

Všechny tři příspěvky od jednotlivých složek sečíst včetně znaménka. Akční zásah může klidně vyjít záporný, jen je nutné teď interpretovat výsledek.
Pokud např. řídím otáčky motoru jen jedním směrem, tak rozsah akčního zásahu je např. 0-255. Spočítaný akční zásah musím dle toho upravit. Pokud vyjde více než 255, dám jen 255, pokud vyjde záporný dám 0. (v případě řízení v obou směrech mám rozsah třeba -255 až 255, apod.). Toho, že jsme se dostal mimo rozsah akčního zásahu se právě může využít pro omezení integrace (existují i sofistikovanější přístupy). Tzn. pokud jsem mimo rozsah, tak integrační složku neměním (nechám předchozí).

Ovšem největší "legrace" vás teprve čeká, nastavení těch konstant regulátoru.

daton
Příspěvky: 413
Registrován: 16 bře 2013, 16:12

Re: PID regulátor

Příspěvek od daton » 22 bře 2016, 19:51

Jo takže představu o funkci regulátoru asi mám, ještě stále sice potřebuji vyřešit ty ščítané rozdíly u integrace protože stále to přičítat nejde potom by došlo ke znehodnocení informace které tato složka poskytuje. Vycházím z předpokladu, že na začátku se sčítané rozdíly uplatní protože jejich přírustek může být bud větší a tedy zasáhnout do děje dynamicky ale to jen při malém počtu těch rozdílů aby byl přírustek patrný, pokud budu sčítat stále dál bude výsledek čím dál vyšší a přírůstek byt stejně velký v porovnání k předchozímu součtu bude stále menší ( možná jsem se nevyjádřil jasně ale pokud bude například rozdíl 10 , tak u prvních řekněme 10 kroků je to 100 ale přírustek 10 je stále markantní ale pokud budu mít například 1000 kroků tak přírustek 10 je již malý a při 10000 už je skoro zanedbatelný. Musí tam být nějká hranice která jednak bude stále v určitém poměru ke vstupu aby přírustek byl relevantní ale zase aby se nevytratila ta urychlující složka integrálu. Toto omezení by teoreticky i mohlo zabránit ve velkých překmitech ale na druhé straně by nemělo ztrati na dynamice. Máte na to nějakou radu či trik?

Pokud tedy vyřešíme matematiku, pak je na čase nasadit pokus na arduino a zde je další dotaz. Jak provádíte simulace? Já jsem zatím vžd když jsem chtěl vyzkoušet program ho musel nahrát nasimulovat vstupy zjistit chování a dle toho upravit program a kolo opakoval. Existuje jiný způsob, nebo jak to děláte?

Nastavování konstant je asi velká alchymie, četl jsem postup ale moc moudrý z toho nejsem. Pokud jsem to dobře pochopil pak se nejprve nastaví P složka řekněme na odhadovaných 50% a ostatní na nulu pokud je nula nečinný stav. Ověří se chování a konstanta se zvyšuje až do doby než dojde k zákmitu (malý nevadí velký je moc otázkouje jak poznat že ten velký už je velký). Pokud se to podaří pak se začne zkoušet I konstanta, která by měla být o dost nižší , četl jsem že i desetina P konstanty. Opět se jde do překmitu ale ne velkého. No a nakonec D složka, která by měla zákmit eliminovat nebo omezit tak aby docházelo jen k mírnému překmitu.

MartinL
Příspěvky: 116
Registrován: 24 úno 2013, 14:13

Re: PID regulátor

Příspěvek od MartinL » 22 bře 2016, 20:13

daton píše:Jo takže představu o funkci regulátoru asi mám, ještě stále sice potřebuji vyřešit ty ščítané rozdíly u integrace protože stále to přičítat nejde potom by došlo ke znehodnocení informace které tato složka poskytuje. Vycházím z předpokladu, že na začátku se sčítané rozdíly uplatní protože jejich přírustek může být bud větší a tedy zasáhnout do děje dynamicky ale to jen při malém počtu těch rozdílů aby byl přírustek patrný, pokud budu sčítat stále dál bude výsledek čím dál vyšší a přírůstek byt stejně velký v porovnání k předchozímu součtu bude stále menší ( možná jsem se nevyjádřil jasně ale pokud bude například rozdíl 10 , tak u prvních řekněme 10 kroků je to 100 ale přírustek 10 je stále markantní ale pokud budu mít například 1000 kroků tak přírustek 10 je již malý a při 10000 už je skoro zanedbatelný. Musí tam být nějká hranice která jednak bude stále v určitém poměru ke vstupu aby přírustek byl relevantní ale zase aby se nevytratila ta urychlující složka integrálu. Toto omezení by teoreticky i mohlo zabránit ve velkých překmitech ale na druhé straně by nemělo ztrati na dynamice. Máte na to nějakou radu či trik?

Nastavování konstant je asi velká alchymie, četl jsem postup ale moc moudrý z toho nejsem. Pokud jsem to dobře pochopil pak se nejprve nastaví P složka řekněme na odhadovaných 50% a ostatní na nulu pokud je nula nečinný stav. Ověří se chování a konstanta se zvyšuje až do doby než dojde k zákmitu (malý nevadí velký je moc otázkouje jak poznat že ten velký už je velký). Pokud se to podaří pak se začne zkoušet I konstanta, která by měla být o dost nižší , četl jsem že i desetina P konstanty. Opět se jde do překmitu ale ne velkého. No a nakonec D složka, která by měla zákmit eliminovat nebo omezit tak aby docházelo jen k mírnému překmitu.
Můžete prosím, nastínit co, chcete regulovat? Bohužel nechápu význam slova krok ve vašem příspěvku. Pokud se tím chápe krok výpočtu, tak je to OK. Integrace v žádném případě nezlepšuje dynamiku, ale naopak dost kazí. Slouží pouze pro dosažení nulové regulační odchylku, což v případě řízení statických soustav P složka nezvládá (ve statickém režimu). K vašemu příkladu: opět se opakuji, ale jde o rozsah akční veličiny - pokud je 0-255, a přírůstek od integrační složky 10, tak dojde brzy k saturaci (omezení) a přírůstek tak má srovnatelnou váhu. Jen znovu zdůrazňuji, integrace je pouze doplňková, zásadní je P složka, integrace pouze dotahuje tzv. trvalou regulační odchylu P složky.

Nastavování konstant jste popsal v principu dobře, jen bych si dal velký pozor na tu derivační složku. Principiálně by měla regulaci vylepšovat (omezovat kmitání). Bohužel za běžných podmínek je to většinou naopak. Na vině je obvykle zašuměný signál měřené veličiny, nebo jeho malé rozlišení. Pak je nutné signál filtrovat nebo raději D složku vůbec nepoužívat.

daton
Příspěvky: 413
Registrován: 16 bře 2013, 16:12

Re: PID regulátor

Příspěvek od daton » 22 bře 2016, 21:13

Ano pochopil jste to velmi správně myslel jsem krok integrace. Zatím se totiž bavíme hypoteticky a já se zde snažím interpretovat a sumarizovat načtené znalosti a potvrdit jejich správnost s vámi, kdo již zkušenosti a vědomosti máte.
Chtěl bych si zkusit postavit svého prvního mobilního robota, ale nemám zkušenosti z robotiky a PID regulátory se za nás ještě neučily a tedy si chci nejprve něco nastudovat.

S PID regulátorem bych chtěl řídit dva motory tříkolého robota (pro vás zřejmě klasika) tak aby jezdil pokud možno rovně ale před překážkou plynule zastavoval a snažil se jim vyhýbat. Senzor předpokládám ultrazvukový a infračervený.
A to je další bod v regulaci. Jak správně sestavit jen základní myšlenku pro algoritmus. Možná nejprve budu pracovat jen s ultrazvukem tak že vstupem by mělo být ultrazvukové čidlo, což by byl základ nejen pro PID regulátor motorů. Předpokládám že jeden PID regulátor nebude postačovat. Ideální by bylo kdyby jeden regulátor řídil zomalování při blížící se překážce a naopak rozjezd při volnu a druhý potom natáčení. Jenže zde se to trochu komplikuje. Motory jsou dva tedy si nedokážu představit jak zařídit aby třeba robot zatáčel (tedy jeden motor zrychlil a druhý zpomalil) s jedním výstupem z PID regulátoru. Jak by se to mělo správně řešit?
Pokud vycházím z prosté logik pak bych musel mít PID regulatory tři, dva na zatáčení (jeden na každý motor ) a jeden pro oba na zrychlení či zpomalení. natáčení robota u překážky by se potom mohlo realizovat jako přidaná hodnota k žádané hodnotě do regulátorů.

Uživatelský avatar
gilhad
Příspěvky: 150
Registrován: 29 kvě 2015, 00:36

Re: PID regulátor

Příspěvek od gilhad » 22 bře 2016, 23:55

Zalezi na rychlosti toho PID regulatoru - kdyz skokem nastavite "plnou parou vpred", tak to neskoci hned na 100%, ale plynule tam doplachti. Kdyz pred prekazkou skokem nastavite "stop", tak taky nezastavi hned, ale plynule tam dobrzdi. Mozna by teda ten na rychlost reakce nebyl potreba.

Taky by slo zadavat "skokove" pozadovanou rychlost jako VzdalenostOdPrekazky - BezpecnostniLimit, cim bliz limitu, tim pomaleji chci jet az zastavim a vratim se (jednoduse P z toho tretiho PID)

Co se tyka delsich souctu (ci prumeru), tak pokud je pocet velky a scitani drahe, tak se muze vyplatit kruhovy buffer, kde prictu vzdy novou a odectu posledni. Dokud jde o cela cisla a vejdu se do rozsahu, tak neztracim presnost.

Pokud je scitani celkem levne a polozek malo, pak jde pouzit kruhovy buffer (co se pridavani tyce), ale pokazde ho secist od nejnizsi do nejvyssi adresy (protoze na poradi nezalezi a rezie se snizi)

Pekne o tom pise Petr Kubac (a o mnohem jinem z robotiky)

daton
Příspěvky: 413
Registrován: 16 bře 2013, 16:12

Re: PID regulátor

Příspěvek od daton » 23 bře 2016, 09:47

Zdravím
S tou nižší rychlostí PID regulátoru jsem nepočítal pravda je že jsem to ještě nepostavil a tedy neznám reakční doby a pokud by tyto byly delší mohl by vlastně regulátor jakoby obrousit hrany skoků z například čidla a tedy by jízda mohla být plynulejší. Stejně ale mám problém jak tedy i podle významu spojit ty výstupy do sebe.
Co se tyka delsich souctu (ci prumeru), tak pokud je pocet velky a scitani drahe, tak se muze vyplatit kruhovy buffer, kde prictu vzdy novou a odectu posledni. Dokud jde o cela cisla a vejdu se do rozsahu, tak neztracim presnost.

Pokud je scitani celkem levne a polozek malo, pak jde pouzit kruhovy buffer (co se pridavani tyce), ale pokazde ho secist od nejnizsi do nejvyssi adresy (protoze na poradi nezalezi a rezie se snizi)
Zde se trochu ztrácím předpokládám že to je výklad z nějaké fakulty kde bylo dříve upřesněno co je drahý součet a co je levný součet nebo za jakých podmínek se toto rozlišuje ale bez kontextu mi to mnoho neřekne. Předpokládám že se hovoří o výstupech z PID regulátorů.
Pekne o tom pise Petr Kubac (a o mnohem jinem z robotiky)
Mohl bych dostat odkaz na jeho články? - Tak blog už jsem našel ;)

Uživatelský avatar
gilhad
Příspěvky: 150
Registrován: 29 kvě 2015, 00:36

Re: PID regulátor

Příspěvek od gilhad » 24 bře 2016, 02:16

Ja znam jen jeho blog, kde strida radu temat, jedno z nich je robotika ... ale i ta ostatni stoji za precteni.

Levny a drahy soucet (a jine operace) - kazda operace "neco stoji" tedy neodehrava se v nulovem case, ale nejakou chvili zabere, kdyz je pro nas rychlost hlavnim kriteriem, tak nas bude zajimat pocet taktu procesoru na operaci potrebny. Kdyz nespechame, ale je malo pameti, budou nas zajimt spis pametove naroky a v pripade nutnosti naskladame do jednoho byte i vic kratsich promennych. Pokud mame problem s poctem registru, zase optimalizujeme jinak. Pokud je vseho dost, tak optimalizujeme na prehlednost a citelnost zdrojaku.

Takze nekdy muze byt vyhodne usetrit pamet za cenu slozitejsich vypoctu, jindy a jinde zase ziskat rychlost na ukor velikosti pouzite pameti.

Nekdy nam staci mala presnost a pocitame s byty, jindy potrebujeme presnost vyssi a pouzivame promenne delky 2, 4, 8, 10, pripadne i vice byte. Samozrejme pokud pocitame s dlouhymi promennymi, tak uz se to nevejde do jedne operace, ale pocita se jeden soucet nekolika instrukcemi (jako pri scitani jednomistnych cisel a scitani vicemistnych s prenosem).

Kdyz potebujeme kvanta pameti (ale ne naraz) a procesor je "dost rychly" tak je dynamicke pridelovani a uvolnovani pameti uzasna vac. (pamet je draha, rychlost levna). Jindy mame pameti celkem dost (nebo malo promennych), ale potrebujeme to zpracovat co nejrychleji - takze pamet alokujeme staticky (je levna, nesetrime) a vypocet na pak bezi velmi rychle, (operace jsou drahe, setrime jimi a vse mame predpocitano predem). Kdyz je levny procesor, tak slozitejsi funkce pocitame, kdyz je levna pamet, dame si vysledky do tabulky a jenom je cteme podle indexu ...

U Arduina, AVR, PICAXE, PIC a jim podobnych je casto jak malo pameti, tak malo vykonu, takze se delaji ruzne kompromisy a triky.

Takze to levne/drahe berte jen obrazne, jako to cim si muzete dovolit trochu plytvat, nebo co naopak potrebujete co nejvic usetrit. (Ceho je nedostatek, to je "drahe", ceho mam tolik, ze to ani vse nevyuziju, to je"levne")

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host