10 Sledovanie čiary pomocou Stateflow a PID regulátora

V predchádzajúcom návode sme si ukázali, ako môžeme sledovať čiaru pomocou PID regulátora. Ak by sme chceli okrem sledovania čiary pridať ďalšie časti algoritmu (postupnosti krokov), schéma by bola s využitím blokov komplikovaná a menej prehľadná na ladenie. Z návodu o postupnosti krokov tiež vieme, že postupnosť krokov sa ľahko modeluje v prostredí Stateflow. V tomto návode si ukážeme ako vieme integrovať PID regulátor ako stav Stateflowu.

Čo budeme potrebovať?

V tomto návode využijeme robot z predchádzajúceho návodu.

PID regulátor ako program v stave

Aby sme si uľahčili prácu využijeme schému, ktorú sme už vytvorili v návode o Stateflow, pomocou ktorej sme sledovali čiaru.

Keďže obsah stavu Sleduj_ciaru nahradíme príkazmi, môžeme schému upraviť nasledovne. Prechod zo stavu Inicializacia do prvku križovatky odpojíme ľavým kliknutím na koniec šípky a potiahnutím na hranu stavu Sleduj_ciaru. Obsah stavu Sleduj_ciaru môžeme zmazať a zmazať môžeme aj vstupy S0 až S4 zo zoznamu symbolov. Namiesto nich vytvoríme vstup pre hodnotu váženého priemeru z bloku snímača čiary. V Simulinku prepojte tento signál na vstup bloku Chart.

Do stavu Sleduj_ciaru môžeme zadať príkazy, ktoré vypočítajú hodnoty pre oba motory s využitím PID regulátora. V tomto príklade využijeme výpočet s P regulátorom. P regulátor zosilní chybu, ktorú vypočítame ako rozdiel želanej hodnoty (stredný snímač na čiare je v našom prípade hodnota 300) a aktuálnej hodnoty váženého priemeru. Vypočítanú hodnotu odpočítame ju od požadovanej rýchlosti na ľavom kolese (motor M1) a pripočítame ku požadovanej rýchlosti na pravom kolese (motor M2). Výpočet teda vieme vyjadriť vzťahom:

  • motor = rychlost +- P * (300 - priemer)

Vzťah môžeme zapísať do stavu pre každý motor (hodnotu P regulátora zvolíme napr. ako 0.8) a dostaneme nasledujúcu schému.

Vrátime sa o úroveň vyššie a pripojíme signály pre rýchlosť a snímač čiary.

Schému môžeme spustiť na Arduine pomocou Monitor & Tune a overiť na testovacej dráhe. Ladením P zosilnenia vieme zlepšiť kvalitu sledovania čiary. Nevýhodou takéhoto prístupu je, že pokiaľ by sme chceli využiť a ladiť zložitejšiu štruktúru regulátora ako je PD lebo PID, museli by sme pridať ďalšie premenné a príkazy. Do grafu Stateflow však môžeme pridať stav, ktorý nám prácu uľahčí.

PID regulátor ako program v stave

V predchádzajúcom návode sme vytvorili schému, ktorá obsahovala subsystém s blokom PID regulátora. Tento regulátor vieme zahrnúť do grafu Stateflow. Skôr ako začneme si uložte model pod iným menom, aby ste neprišli o aktuálnu schému, ktorú budeme modifikovať. Ako prvé môžeme zmazať stav Sleduj_ciaru. Na vytvorenie stavu, ktorý bude obsahovať PID regulátor využijeme komponent z palety objektov Stateflowu - Simulink State (ikonka stavu s logom simulinku). Tento stav nazvime Sleduj_ciaru_ PID a pripojme prechod zo stavu Inicializacia do tohto stavu. Do stavu Sleduj_ciaru_ PID tiež pripojíme nepripojený prechod do stavu Stop.

Dvojklikom sa dostaneme do tohoto stavu a môžeme si všimnúť, že v tomto stave sa vytvorili porty pre vstupy a výstupy do Simulinku, ktoré sú definované v Stateflowe. Pre regulačný obvod nebudeme potrebovať button, takže tento vstup môžeme zmazať. Bloky pre regulačný obvod môžeme skopírovať z predchádzajúceho návodu zo Enabled subsystému (okrem bloku Enable), prípadne vytvoriť nanovo. Vstupy a výstupy zmažeme a nahradíme ich tými, ktoré vygeneroval Simulink State.

Model môžeme opäť nahrať na Arduino a otestovať. Takýto model ma niekoľko výhod. Prvá je, že môžeme využiť aj zložitejšie štruktúry PID regulátora, bez toho, aby sme ich zložito programovali. Ďalšou výhodou je, že v bloku Simulink State môžeme ladiť parametre regulátora aj za behu programu pomocou Monitor & Tune. V neposlednom rade môžeme našu logiku rozšíriť (napr. zvoliť smer pri rozdelení čiary) a monitorovať priamo v prostredí Stateflow.

V tomto návode sme rozšírili výhody modelovania v prostredí Stateflow s využitím stavu Simulink State, ktorý umožňuje pridať do Stateflow model vytvorený v Simulinku.