Analogová logika 2

… aneb odkud vítr věje

Minule jsem vám striktně zakazoval používat konstrukce IF-THEN při řízení robotů, protože napsat do svého softwaru stovky a stovky IF-THEN a pak se v nich nevyznat umí každý…

PetrK_Azimut1

Takže si přestavte, že jste v podobné situaci jako kdysi já – na Dealextreme jste koupili infračervené čidlo, které má 8 kanálů kolem dokola celého robota. Jezdíte s robotem po místnosti a chcete aby robot v každém okamžiku věděl jestli není blízko překážky. Takže máte 8 čidel a vy píšete software…

IF Čidlo_1 > 100 THEN (dělej něco vhodného)

ELSE IF Čidlo_2 > 100 THEN (dělej něco jiného)

ELSE IF Čidlo_3 > 100 THEN (dělej něco jiného)

ELSE IF Čidlo_4 > 100 THEN (dělej něco jiného)

ELSE IF Čidlo_5 > 100 THEN (dělej něco jiného)

ELSE IF Čidlo_6 > 100 THEN (dělej něco jiného)

ELSE IF Čidlo_7 > 100 THEN (dělej něco jiného)

ELSE IF Čidlo_8 > 100 THEN (dělej něco jiného)

A co teprve když jsou „pozitivní“ signály ze dvou sousedních čidel, nebo jedno nefunguje – to je teprve mazec…

Doufám, že je vám jasné, že tohle prostě bez jisté (celkem jednoduché) matematiky nejde.

Takže jak na to – prosté signály ze všech čidel „vektorově sečteme„…

Fúúúj – matematika – vtip je v tom, že sčítat vektory v ploše je dětsky jednoduché. Viz tabulka, ve které jsem si signály čidel vymyslel.

PetrK_Azimut2

Rozumíte ?

Každé čidlo někam směřuje a tudíž má vzhledem ke „předku robota“ určitý azimut – čidlo, které kouká přímo dopředu má 0, dozadu 180, doprava 90, doleva 270 stupňů atd.

My zpracujeme signál z čidel tímto způsobem: každý signál si rozdělíme podle azimutu čidla na složku ve směru osy Y (osa dopředu dozadu ) a na složku ve směru osy X (osa vlevo-vpravo). Ke každému čidlu si vypočteme patřičný sinus a kosinus jejich azimutu – a pak ty složky X a Y vypočteme tak, že signál z čidla násobíte tím sinem a kosinem.

Pak už jenom X-ové a Y-ové složky hodnot sečteme a získáme vektorový součet. Většinou nám stačí X- ová a Y-ová složka vektoru, ale pokud potřebujeme přesný azimut musíme využít funkce Arcustangens a to takto:

Arcustangens (alfa) = Signál_Y / Signál_X

Součty i výsledný azimut vidíte v tabulce. Aby to bylo ještě jasnější, zde je obrázek:

PetrK_Azimut3

Ptáte se „tohle jako má být jednodušší než zmatek IF- THEN“ – a já odpovídám – ano tohle je jednodušší – předem vypočtené hodnoty SIN a COS si pro všechny azimuty uložíte do paměti programu a pak už jenom v jedné smyčce FOR – čtete signály čidel, hodnoty SIN a COS, násobíte a sčítáte.

Jednoduchost“ ale není hlavní výhodou tohoto postupu – hlavní výhodou je „robustnost“ alias „blbuvzdornost“ – pokud jedno čidlo zakmitne, nebo vynechá – a sousední mají správné hodnoty – azimut se vám nespočte úplně přesně, ale pořád lépe než když program díky chybě v datech z čidel zabloudí v bludišti IF-THEN. Nemluvě o tom, že tento algoritmus automaticky řeší i situace kdy se „blížím do rohu“ a mám alarm z předních a bočních čidel zároveň.

Jak využívat hodnoty Čidlo_X a Čidlo_Y bez počítání azimutu ?

Počítat Arcustangens v mikrokontroléru je dost záhul, takže se lze obejít i bez toho. Pokud mám hodnotu Čidlo_Y vysokou kladnou vím, že překážka je někde před robotem, pokud je Čidlo_Y vysoké záporné – vím, že je to za robotem.

Pokud mám Čidlo_X vysoké kladné, vím, že je to vlevo, pokud jej mám vysoké záporné, vím, že je to vpravo. Stejně platí i kombinace – např Y záporné + X kladné = vzadu + vpravo.

Jelikož sám si pletu pravou a levou ruku – než to začnete programovat – udělejte si v Excelu stejnou tabulku jako já, kde si chvíli hrajte s hodnotami z čidel. Stejně ji budete potřebovat pro počítání sinů a kosinů. Ještě drobná poznámka – když jsem se snažil z Excelu vydolovat obrázek – pořád mi vycházel divně otočený – jakoby osou Y vodorovně – tak si lehkého nesouladu obrázek – tabulka nevšímejte a zkuste si to v Excelu sami.

Co když nemám čidla kolem celého kruhu ?

To není tak velký problém – vtip celého algoritmu je i v tom, že „klidové“ hodnoty z čidel proti sobě se vzájemně odečtou, proto pokud byste třeba zadní půlku kruhu vynechali, vypadalo by to jako by to, jako že „vpředu něco je“ – v tom případě není nic jednodušího než místo hodnot čidel, „které tam nejsou“ dosadit obvyklou klidovou hodnotu ostatních čidel.

Velice podobným způsobem se dá vyhodnotit, které čidlo snímá čáru, což probereme zase příště.