… aneb kde je čára ?
Přestavte si, že máte robota pro sledování čáry. A protože nejste žádní troškaři, máte vpředu rovnou osm čidel čáry. Čidlo čáry se většinou zapojuje přes komparátor přímo na pin mikrokontroléru, takže dává jenom jednoduchoučkou informaci černá/bílá, ale to jsem v prvním díle o analogové logice nedoporučoval, protože dopadnete jako ten chudák mladík na Mini-Sumu, co s námi nemohl soutěžit, protože mu nevyhovovala „černá“ na naší aréně.
Takže – máte robota ten má vpředu 8 odrazových čidel typu CNY70 a všech 8 je zapojeno na AD převodník. Představme si, že máme udělanou analogovou elektroniku tak dobře, že bílá je hodnota AD převoníku 255 a černá je 0. Přestavte si, že jedete a potřebujete zjistit, pod kterým čidlem je čára. Zase vás budu zrazovat od „zdánlivě jednoduchého“ IF Čidlo1 THEN…, IF Čidlo2 THEN… atd, protože budu klást klasické sugestivní otázky – co když dráha není dokonale bílá a páska dokonale černá, nebo je dokonce dráha lehce flekatá? Nebylo by lepší použít algoritmus, který vám rovnou vysype číslo čidla pod kterým je čára – a pokud je trošku pod třetím a trošku pod čtvrtým tak dokonce vysype třeba „3,6“ ?
Pokud jste minule pochopili jak se to dělá, bude to úplně jednoduché.
Čidlo | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
Číslo | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | |
Signál | 230 | 220 | 240 | 250 | 100 | 30 | 200 | 230 | |
Obrácený signál | 25 | 35 | 15 | 5 | 155 | 225 | 55 | 25 | |
O_Signál * Číslo | 525 | 770 | 345 | 120 | 3875 | 5850 | 1485 | 700 | |
Součet Násobků | 13670 | ||||||||
Součet O_Signálů | 540 | ||||||||
Poloha čáry | 5,3 |
Máme čidla číslo 1-8 – tím pádem číslo 8 čidla je 8x větší než číslo prvního – to se nám z jistých důvodů nehodí, tak si čidla očíslujeme 21 až 28 – tam už rozdíl není tak veliký (to je druhý řádek). Pak máme ten problém že podložka je bílá a čára černá – my ale pro náš algoritmus potřebujeme aby čára dávala vyšší signál než pozadí – tak uděláme jednoduchou operaci typu
Obrácený signál = 255 – Signál.
Pak už jenom pořadové číslo čidla násobíme jeho hodnotou a výsledek si poznamenáme někam do paměti. (to je 5. řádek tabulky). Pak spočteme dva součty – součet násobků a součet obrácených hodnot (oba součty tam vidíte) podělíme-li oba součty vyjde nám 25,3 což je „těžiště signálu“ neboli poloha čáry, od té musíme odečíst 20, které jsme na počátku připočetli k číslu čidla. Pokud se vám zdá že hodnota čidla č. 6 je „více černá“ než hodnota čidla č. 5 a proto by výsledek měl být spíše 5,7 než 5,3 – tak je to proto, že jsem podložku udělal uměle „flekatou“ a hodnoty čidel 1-3 udělal schválně nízké, abyste viděli, že tenhle agoritmus je docela robustní a má „autokalibraci“ tedy co je „bílá“ a co je „černá“ rozhoduje podle okamžitých hodnot z čidel …
Jako vždy to není úplně snadné – co když žádné čidlo nevidí čáru ?
V tom případě se bude hodnota polohy „čáry“ divoce měnit podle náhodných šumů v čidlech, proto je vhodné brát jako platnou hodnotu polohy čáry teprve tu hodnotu, která má dosti vysoký parametr označený v tabulce „Součet O_signálů“ – jak vysoký zjistíte pokusem, kdy robota dáte na čáru a pak na úplně bílou podložku – a uvidíte rozdíl – pro naše podmínky by to mělo být alespoň 200.
Pro zkušenější mezi vámi – celá matematika v tomto i předchozím díle je o počítání vážených průměrů a těžišť vektorů – což zní strašně, ale třeba naprosto stejný algoritmus, který jsme si dneska popsali, jen doplněný ještě o druhou osu, se používá pro hledání významných útvarů při analýze obrazu. Jistě pochopíte, že pro 2 megapixelový obrázek musí mít roboti něco jiného než 2 mega IF-THEN ;-)))