8 Sledovanie čiary s pomocou Stateflow

V predchádzajúcich návodoch sme si pripravili bloky/subsystémy, ktoré využijeme na hlavnú úlohu celej súťaže a to je sledovanie čiary. Existuje niekoľko spôsobov ako to dosiahnuť. V tomto návode si ukážeme ako môžeme sledovať čiaru pomocou binárnych výstupov zo snímačov čiary. Znamená to, že máme k dispozícii informáciu, či je pod snímačom čiara (logická 1) alebo nie je (logická 0). Túto informáciu využijeme v prostredí Stateflow na vytvorenie rozhodovacej logiky správania robota tak, aby sledoval čiaru.

Čo budeme potrebovať?

V tomto návode využijeme na robota, ktorého sme zložili v predchádzajúcej časti. Mal by obsahovať Arduino, ovládač motorov, snímač čiary a tlačidlo.

Sledovanie čiary

Skôr ako začneme vytvárať algoritmus sledovania čiary v prostredí Stateflow si pripravíme bloky, ktoré budú nevyhnutné na jeho vytvorenie. Vytvorte nový model, nastavte cieľové zariadenie Arduino MEGA 2560. Čas simulácie môžeme nastaviť na nekonečno. Do schémy pridajme bloky z predchádzajúcich úloh. Z návodu č.6 (modelovanie postupnosti krokov) môžeme skopírovať všetky bloky, ktoré sme vytvorili a z návodu č.7 (snímanie čiary) môžeme skopírovať subsystém, ktorý využíva blok MinMax na zabezpečenie binárnej hodnoty iba z jedného snímača. Schéma by mala vyzerať nasledovne.

Blok snímača čiary by mal vyzerať takto

a vo Stateflow by mala byť nasledovná logika

Logika sledovanie čiary bude potrebovať niekoľko ďalších vstupov. Prvým vstupom bude rýchlosť, ktorou pôjde robot v ideálnom prípade, ak bude na čiare stredným snímačom. Ďalšími vstupmi budú binárne hodnoty jednotlivých snímačov. Do Statefow teda pridáme pomocou Editora symbolov ďalšie premenné

  • S0 - Input Data
  • S1 - Input Data
  • S2 - Input Data
  • S3 - Input Data
  • S4 - Input Data
  • rychlost - Input Data

Niektoré predchádzajúce stavy už potrebovať nebudeme, takže môžeme zmazať všetko okrem stavov Inicializácia a Stop. Po týchto úpravách by mal diagram obsahovať nasledujúce časti

Stateflow nám ohlasuje problémy v grafe ako sú nevyužité premenné, neprepájané stavy a podobne. Zatiaľ tieto upozornenia môžeme ignorovať. Pomocou modrej šípky nahor, alebo pomocou Explorer Baru sa môžeme presunúť späť do Simulinku. Môžete si všimnúť, že sa na bloku stavovej logiky (Chart) pridali ďalšie vstupy. Blok Chart môžeme zväčšiť pomocou kliknutia na blok a potiahnutím myšou za roh bloku. Do schémy pridáme blok Constant, ktorý bude reprezentovať ideálnu rýchlosť robota a nastavíme jeho hodnotu napríklad na 60. Konštantu a binárne výstupy zo snímača čiary pripojíme na blok Chart. Vážený priemer v tomto návode používať nebudeme

Môžeme sa vrátiť do bloku Chart a dokončiť logiku sledovania čiary. Do stavovej logiky pridáme stav reprezentujúci sledovanie čiary. Keďže na každý snímač budeme musieť reagovať ináč, potrebujeme použiť ďalších 5 podstavov. Pomenujeme si ich vzhľadom na snímače kvôli prehľadnosti. Na rozdelenie prechodov medzi jednotlivými stavmi použijeme prvok križovatky (Junction - z Palety vyberte krúžok, na ktorý ukazujú šípky). Do križovatky pripojte prechod z inicializácie a z križovatky vytvorte prechody na jednotlivé stavy. Schéma by mala vyzerať nasledovne

Čísla, ktoré sa objavili pri križovatke reprezentujú poradie vyhodnocovania prechodov. Z predchádzajúceho obrázka teda vyplýva, že najvyššiu prioritu má prechod do stavu S0_stav. My však budeme ovládať prechody pomocou jednotlivých snímačov. V prechodoch teda využijeme podmienky. Ak sa na snímači objaví logická jednotka presunieme sa do zodpovedajúceho stavu. Podmienky uvádzame v hranatých zátvorkách. Kliknite na prechod, ktorý chcete editovať a namiesto symbolu ? napíšte váš príkaz. Príkazy v prechodoch môžete po potvrdení presunúť na iné miesto v schéme, čo vám ju pomôže sprehľadniť.

Aby sme neuviazli v jednom stave potrebujeme sa vrátiť späť do križovatky a znovu otestovať, či nehlási čiaru iný snímač. Na túto úlohu môžeme znovu využiť prvky križovatky (kľudne aj viaceré), aby sme sprehľadnili schému. Zo stavov sa napojíme na križovatku a prechodmi sa vrátime do pôvodnej križovatky. V tomto kroku môžeme ešte pripojiť stav Stop na stav Sleduj_ciaru. V prechode napíšeme, že chceme počkať 10 sekúnd a musí sa stlačiť tlačidlo. Dosiahneme tým to, že hocikedy počas sleldovania čiary vieme robota zastaviť a vyhneme sa viacnásobnému stlačeniu tlačidla.

Posledná otázka, ktorú si musíme položiť je, ako rýchlo sa majú točiť kolesá v jednotlivých stavoch tak, aby sme sledovali čiaru. Budeme to robiť podľa nasledujúceho vzorca

  • motor = rychlost + prirastok

Pokiaľ budeme stredným snímačom na čiare môžeme ísť robotom rovno, teda prírastok bude nulový. Ak nám budú hlásiť jednotky snímače na ľavej strane robota, budeme sa musieť robotom točiť doľava (aby sme sa narovnali do stredu). Dosiahneme to tak, že ľavému motoru (M1) znížime rýchlosť a pravému motoru (M2) prírastok zvýšime. Naopak ak nám budú hlásiť jednotky snímače na pravej strane urobíme motormi opačné pohyby.

Správanie robota pri sledovaní čiary ovplyvňujú hlavne 2 parametre. Rýchlosť, ktorou sa robot pohybuje dopredu a prírastky na motoroch v jednotlivých stavoch. Aby váš robot prešiel dráhu najrýchlejšie bude potrebné ladiť tieto parametre. Model môžeme nahrať do robota a otestovať.

Navrhnuté riadenie využíva práve jeden aktívny snímač nad čiarou. Ako by sme mohli našu logiku zjemniť? Nahradíme subsystém snímača čiary, tým v ktorom len porovnávame hodnoty snímačov na hodnotu. Nasledujúce riešenie už nemusíte vytvárať.

Pri využití tohoto bloku a správnej hodnote konštanty v bloku porovnania môžu byť "aktívne" aj viaceré snímače napríklad 2. Takáto informácia môže pomôcť pri tvorbe jemnejšej logiky zatáčania. Nevýhodou je, že na pokrytie všetkých možných kombinácii snímačov potrebujeme vytvoriť veľa stavov a prechodov. Logika takéhoto prípadu je zložitejšia a je na nasledujúcom obrázku.

Ukázali sme si možnosť využitia stavového automatu na sledovanie čiary pomocou binárnych výstupov zo snímačov. Na zjemnenie algoritmu sme využili viaceré snímače naraz. Existuje však spôsob, ako využiť vážený priemer zo všetkých snímačov na sledovanie čiary pomocou regulátora. To si ale ukážeme v nasledujúcom návode.