Matematika v robotice 24. ANO nebo NE

25. února 2016 v 5:07 | Petr |  Roboti a Matematika
Přestože jsem prohlašoval, že s robotickými a elektronickými články je konec, mám tady "jeden takový projekt" při jehož zpracovávání jsem si vzpoměl na to, že jsme sice probírali "oscilující" rozhodování jestli A = B nebo A > B, ale neprobrali jsme to nejjednodušší - jak přiměřeně "bezpečně" alias "blbuvzdorně" alias "robustně" programovat jednoduché dvoustavové rozhodování - tedy máte teplotu a rozhodujete zda je "horko" nebo "zima" - máte světelnou intenzitu a rozhodujete zda je "světlo" nebo "tma" neboli máte analogový - numerický - signál z čidla a vy musíte dynamicky rozhodnout zda je to "málo" nebo "hodně".

Při té příležitosti bych si dovolil upozornint, že už kdysi dávno jsem prohlašoval, že čidlo, které produkuje jenom informaci ANO nebo NE - je nebezpečné a nemělo by se v robotech používat. A taky jsem kdysi prohlašoval, že veškerá čidla, která jsem kdy postavil dávala dokonce až DVĚ výstupní hoddnoty
  1. Samotnou "intenzitu signálu" ( ne ANO / NE ) ale v analogové škále
  2. Analogovou informaci o "kvalitě" tedy jak mnoho je si dané čidlo touto hodnotou jisto.
Takže si modelově ptředstavme tu nejjednodušší situaci - robot má měřič intenzity světla a má určit zda je "na slunku" nebo "ve stínu". Předpokládejme, že měřič má jednoduchý AD výstup, kde 0 je "absolutní tma" a 255 je "absolutní světlo". Taky si představme, že vůbec netušíme jakou hodnotu má stav "trochu šero" nebo "docela jasno" a přesto musíme nějak rozhodnout. Ba dokonce si představme, že hodnota "středně šero" nemusí být 128 - jak bychom naivně očekávali.
Víte co potom ? Opět částečně naivní postup je získat nějakou "rozhodovací mez" tedy třeba "pod 60 je to ve stínu", ale jak se k takové mezi dopracovat ? Dosti často se používá "startovní kalibrace" tedy změří se hodnota "než se vyjede" a od ní se pak odvodí rozhodovací limit. Někdy to funguje, ale představte si robota, který startuje a netuší jestli přitom stojí ve stínu, nebo na slunku. A potom některá čidla, aby zvládla třena venkovní světelné intenzity, mohou mít velice úzké rozmezí jako 63 je světlo a 58 je už tma ?

Předpokládám, že jste právě propadli nihilismu a odpovědí na mé otázky je prohledat "Aliexpress" s příslušným čtyřdírkovým modulem pro "Arduííno" a pokud Číňani nic nevymysleli ( neukradli chytřejším ), máte tendenci předvést, že nejste chytřejší než Číňani - a na všecno se vykašlat ?

Nicméně to by nebyl tento blog, aby nějaké "vidlácké" ba dokonce "assemblerové" východisko nebylo. Berte tedy tento článek jako informaci, jak v mých robotech probíhá ( probíhalo ) jednoduché rozhodování typu SVĚTLO / TMA nebo prostě ANO / NE.

Celé kouzlo je v tom, že není jedna rozhodovací mez, ale DVĚ, který říkejme INTENZITA_SVĚTLA a INTENZITA_TMY. Pokud tedy předpokládáme vstup v hodnotách 0-255 je dobré obě intenzity na začátek nastavit na střední hodnotu 127.

Pak přijde nějaká hodnota z AD převodníku a pro rozhodování obecně platí
  1. Pokud NOVÁ_HODNOTA <= INTENZITA_TMY pak je výsledek TMA
  2. Pokud NOVÁ_HODNOTA >= INTENZITA_SVĚTLA pak je výsledek SVĚTLO
  3. Pokud je výsledek uprostřed mezi oběma "intezitami" - rozhodne se podle toho zda je NOVÁ HODNOTA blíže k hodnotě INTENZITY_SVĚTLA nebo k hodnotě INTEZITY_TMY
Mimochodem "numerická vzdálenost" na jednorozměrné číselné ose se počítá jako ABS ( NOVÁ_HODNOTA - INTENZITA_SVĚTLA ) případně jako ABS ( NOVÁ_HODNOTA - INTENZITA_TMY ). Takto složitě to však dělat nemusíme, porotože vyloučením varianty 1 a 2 víme. že NOVÁ_HODNOTA je uprostřed tedy naše zjednodušená podmínka bude

IF ( NOVÁ_HODNOTA - INTENZITA_TMY ) > ( INTENZITA_SVĚTLA - NOVÁ_HODNOTA ) THEN světlo ELSE tma

Co dělat v případě, že NOVÁ_HODNOTA je naprosto přesně uprostřed - nevím, ale v reále to za mně vyždy vyřešily nestability hodnot čidel, které způsobily, že výsledek se vždy nakonec "někam skulil".

Doposud se to zdá být jenom příliš složité řešení prajednoduché věci, ale teď přijde "genialita Cimrmanovy myšlenky" - poté co jsme rozhodli zdali výsledek je SVĚTLO nebo TMA - vezmeme příslušný limit a jeho hodnotu "updatujeme" nějakým třeba - dosti dlouhým exponenciálním klouzavým průmerem.

Příklad - vyšla nám "tma" tak provedeme následující výpočet
INTEZITA_TMY = ( 7 * INTENZITA_TMY + HODNOTA ) >> 3
neboli bez assemblerovských bitových posuvů
INTEZITA_TMY = ( 7 * INTENZITA_TMY + HODNOTA ) / 8.
totéž s INTENZITOU_SVĚTLA, pokud je výsledek "světlo".

Matematikům mezi vámi, což jsou ostatně všichni - je to jasné. Kouzlo je totiž v tom, že po čase se INTEZITA_SVĚTLA dostane na typické hodnoty pro výsledek SVĚTLO a INTENZITA_TMY se dostane na hodnoty typické pro výsledek TMA.

To stále vypadá jako zbytečná kravina, ale není. Používání dvou limitů tímto způsobem má v sobě to kouzlo, že rozdíl mezi nimi nám dává potřebnou informaci o "kvalitě" neboli "blbuvzdornosti" rozhodování. Takže pokud po nějaké době jízdy je INTENZITA_TMY = 30 a INTENZITA SVĚTLA = 210 - je jasné, že čidlo je kvalitní a robot je si svými rozhodnutími perfektně jistý.

Pokud naopak i po nějaké době jízdy platí že INTENZITA_TMY ( téměř ) = INTENZITA SVĚTLA je jasné, že čidlo i jeho závěry nestojí za nic. Ba dokonce, pokud budeme úplní matematici - můžeme si krom "průměrných intenzit" počítat i jejich směrodatné odchylky a podle nich určit s jakou "statistickou významností" se obě intenzity liší a tudíž určit jestli "nejistota rozhodnutí" je 20, 10, 5, 1, nebo ještě méně procent. To je složitost, kterou sice umím, ale nikdy jsem ji v robotech nepoužíval, tudíž bych ji nechal na někdy jindy.

Detailisti mezi čtenáři jistě namítnou, že ani tento způsob není chráněn před špatnými rozhodnutími, hlavně na samém začátku. Ano je to pravda - tento algoritmus má potenciál rozhodovat stejně špatně jako prosté porovnání proti jednomu limitu. Na druhé straně chyba rozhodnutí v tomto algorimtu není "překvapivý zásah nepříznivého osudu" a dá se dopředu odhadnout, pokud se oba limity liší jenom málo. Což mimochodem vzhledem k nastavení obou "doprostřed škály" - je pravda i na začátku, při startu robota.

Jasné ?
 

1 člověk ohodnotil tento článek.

Komentáře

1 Petr G. Petr G. | 25. února 2016 v 6:14

Vítejte zpět do světa reálných čísel a absolutních hodnot i pravd. Neměl by jste článek jak bezpečně měřit frekvenci signalu (dobu impulsu) jde mi o demodulaci FSK. Před rokem jste téma nakousl při psaní  o mixérech.

2 Honza Honza | 25. února 2016 v 16:30

Jedna díra v robustnosti je asi zřejmá - co když světlo i tma je výrazně menší než výchozí společná hodnota (třeba 5 a 30)? Nebo třeba po adaptaci na původní stav 50/200, skokové snížení intenzity na 10/50 (někdo zhasnul)? Pak bude jen kolísat hranice intenzity tmy a světlo nebude detekováno nikdy. Máte nějaký trik jak se před tím bránit? Nebo jste to nikdy nepotřeboval?

3 dotaz dotaz | 25. února 2016 v 18:34

[2]: Tma je opak světla (opačná fáze), ne? Zezačátku budou průměry jenom klesat/stoupat, pak budou chvíli oscilovat a pak se to někde ustálí. Můžete si navíc např. průměrovat krátkodobý a dlouhodobý průměr, abyste si mohl být jistější významem těch naměřených hodnot.

4 petr-kubac petr-kubac | 25. února 2016 v 19:12

[2]: Finta na to existuje, ale nikdy jsem nebyl donucen ji použít - pokud po nějakou dobu je výsledek rozhodování jenom "tma" algoritmus nastaví oba limity na "intenzitu_tmy" a jede se dále - se "světlem" ´je to pak naopak....

5 Derak Derak | 26. února 2016 v 12:33

Na MCU bez násobičky je to INTEZITA_TMY = ( INTENZITA_TMY + INTENZITA_TMY << 1 + INTENZITA_TMY << 2 + HODNOTA ) >> 3. 8)

6 petr-kubac petr-kubac | 26. února 2016 v 14:44

[5]:: Existuje i rychlejší varianta

INTEZITA_TMY = ( INTENZITA_TMY <<3 -  INTENZITA_TMY + HODNOTA ) >> 3

A pokud to řešíme na molekulární úrovni - není špatné se vyhnout zaokroulovacím chybám a to tak, že máme pomocnou proměnnou INTEZITA_TMY_X_8 nebo li osminásobek sumy v exponenciálním průměru a s tou se pracuje takto

INTEZITA_TMY_X_8 = INTEZITA_TMY_X_8 - INTEZITA_TMY + HODNOTA

INTEZITA_TMY = INTEZITA_TMY_X_8 >>3

Ještě rychlejší ( přesnější ) za cenu větší spotřeby paměti.

U všech variant ( včetně vaší ) se musí dívat pozor na možné přetečení registrů při sčítání a bitových posunech.

7 dotaz dotaz | 27. února 2016 v 11:29

[4]: ono taky není důvod, pokud si člověk hlídá minima a maxima dodávaná z čidla, tak při první změně fáze (soumrak se změní v rozednívání či naopak) se bude měnit už jen jedna z těchto hodnot, a tak jsem tedy schopen rozlišit směry (na intenzitě změny pro účel rozlišení směru nezáleží). Nicméně stále platí to co už jste napsal v článku, pokud trvale dostávám z čidla takovéto „divně nízké” hodnoty, tak je to čidlo asi celkem na ho...

8 Petr G. Petr G. | 27. února 2016 v 19:22

[7]: Celkově pokud někdo postaví čidlo co se řídí okolním osvětlením. Pak je nejen čídlo, ale celá komstrukce na hovno. Nebo nikoho nenapadlo, k čemu si například optická myš osvětluje podložku, když to světlo uživatel v podstatě nevidí a myš tedy svícením, jen plýtvá elektřinou z baterky/USB.

9 Václav IV Václav IV | 27. února 2016 v 20:51

[8]: A co například rozbřeskem a soumrakem ovládaná dvířka kurníku, v místě kde se to kunami a lasičkami jen hemží. I tam je to na hovno? Nebo si mám na ten rozbřesk a soumrak svítit?

10 Petr G. Petr G. | 27. února 2016 v 21:08

[9]: při rozbřesku vám někdo z minuty na minutu udělá noc a v noci vám chodí do kurníku lasička s čelovkou? Teoreticky znáte optické kabely, kde se snímá světlo / tma. Napadlo Vás že jsou ty kabely "jednosměrné" a tudíž svícení do zdroje světla má na jeho intenzitu nulový vliv? (odraz od čočky na konci kabelu pro zjednodušení zanedbáme)

11 Václav IV Václav IV | 27. února 2016 v 21:24

[10]: Psal jste, že: "Celkově pokud někdo postaví čidlo co se řídí okolním osvětlením. Pak je nejen čídlo, ale celá komstrukce na hovno." Dávám vám příklad čidla které je v praxi nutné (nebo třeba soumrakové spínače čehokoliv) jako protiklad. Až ho budete konstruovat (ne jen o něm spekulovat), přijdete na to, že tak jednoduché to není. Lasička sice s čelovkou nechodí ale musíte se vypořádat s velkými skoky osvětlení a nereagovat na každý mrak, bouřku, nepřímé osvětlení umělými zdroji atd. atd. Potom musíte sáhnout např. k metodě popsané v článku.

12 Petr G. Petr G. | 28. února 2016 v 6:59

[11]: "Celkově pokud někdo postaví čidlo co se řídí okolním osvětlením."

"Soumrakový spínač má za úkol měřit intenzitu denního (okolního) světla"

Pro Vás teoretika tedy znovu a lépe "U soumrakoveho spínače se za OKOLNÍ světlo považují zdroje umělého osvětlení či zmíněná bouřka."

13 dotaz dotaz | 28. února 2016 v 9:54

[12]: Ale no tak pánové, zachovejme trochu kultury. Soumraková čidla reálně existují a dokonce se používají, např. Tesla model S jedno takové má (využívá ho k přepínání mezi denními a plnohodnotnými světly), ale vy jste se dokázali pohádat kvůli nedostatečné definici (kdy jeden z vás buď rozebírá teorii a druhý přemýšlí nad konkrétní realizací, a nebo z rozdílů mezi konkrétními realizacemi v rozdílných oblastech).

Konkrétní realizace (i v té Tesle) musí používat ještě další algoritmy, aby se úspěšně vyrovnala s dalšími vlivy v úrovních osvětlení - například dokáže bleskově přepnout při vjezdu do tunelu, ale už v něm nepřepíná světla tam a zpátky podle toho, jestli v tom tunelu zrovna projíždí pod lampou nebo ne… Zrovna tak není v silničním provozu žádoucí, aby při výjezdu z tunelu nebo z pod mostu přepla okamžitě zpět na denní, a taky to nedělá. U počítačové myši budou požadavky (a tedy i korekční algoritmy) zase „poněkud” jiné.

14 dotaz dotaz | 28. února 2016 v 9:59

A navíc doplním, že zrovna počítačová myš není dobrý příklad, protože ta vůbec  nepoužívá žádné čidlo osvětlení, ale zpracovává obraz - má kamerku s malým rozlišením a předsazenou čočkou a sleduje změny v textuře povrchu.

15 Petr G. Petr G. | 28. února 2016 v 12:51

Pane(?) Dotaz, já velice rád reaguji na Ty co vytrhávají věty z kotextu a snaží se mě přesvědčit ke studiu. Co se tyká myši, ta by mohla mít snímač umístěný i tak, aby ji stačilo OKOLNÍ světlo ;) O její nespolehlivost a nepoužitelnosti v šeru se doufám shodneme :)

16 dotaz dotaz | 28. února 2016 v 14:27

Tak za prvé: Reagoval jste vy na mne. 2. kterou vaši větu jsem vytrhl z kontextu? Že jste do toho zamotal myš, která sem nepatří protože používá naprosto jiné algoritmy než průměrování hodnot - to jste asi něco nepochopil vy, ne (o nějakém "by mohla" nebo lasičce s čelovkou se radši ani nebudu zmiňovat)? 3. kde vás přesvědčuju ke studiu? 4. Pochopil jsem, nevím proč tu s vámi vůbec ztrácím čas.

17 Petr G. Petr G. | 28. února 2016 v 19:48

bože Růžo, Dotaz nevytrhl jste žádnou mou větu, to udělal Václav, ke studiu mě přesvědčuje Václav. A co se týká myši tak ta přesto že ke snímání používá kameru, tak je to technicky matice světlocitlivých bodů!

Je jedno jestli máte jednu fotodiodu rozlišující odstín podložky, nebo řadu fotodiod v robotu na minisumo, či matici bobů v myši.

Ve všech třech případech je získaná hodnota závislá na odražené intenzitě světla!

Český jazyk je na pochopení těžší jak Čínština. Přesto nás dnes číňané zaplavují svými výrobky. Zřejmě je to i tím, že porozumění psanému textu dělá mnoha čtenářům neskutečné problémy.

18 Václav IV Václav IV | 28. února 2016 v 20:40

[17]: No jestli jsem vytrhl něco z kontextu citováním poloviny vašeho přispěvku tak to se moc omlouvám... příště budu citovat i tu myš.

19 dotaz dotaz | 28. února 2016 v 20:42

[17]: Ano, je to matice světlocitlivých bodů např. 15x15, ale přesto se tam neděje průměrování dvěstěpětadvaceti standalone hodnot (a už vůbec ne dvojím průměrem), ale děje se tam vyhodnocování změn ve vztahu k ostatním pixelům, tzn když mi nějakej tmavej pixel zesvětlal, tak hledám, kterej sousední mi místo něj ztmavnul. Znovu opakuju že je to kamera a dodává video, a děje se tam vyhodnocování obrazu! Něco si o tom přečtěte třeba na Fandoramě, jeden projekt se tam zabýval strojovým vyhodnocováním videa (hledání cesty při letu kvadrokoptéry), je to celkem zajímavé čtení. Pak možná pochopíte, že jste se tu odborně znemožnil.

20 petr-kubac petr-kubac | 28. února 2016 v 23:22

[8]: WOW - jakápak vášnívá diskuse - jenom aby se ne nevytratila podstata : Sám mám taky radeji aktivní čidla ( měřím odraz energie, kterou jsem sám vyslal )  

Nicméně i u aktivních čídel musím nějak rozhodnout jestli odraz UŽ nastal nebo ne - takže hardware čidla a tenhle algoritmus jsou tak trochu paralelní věci.

21 Petr G. Petr G. | 29. února 2016 v 2:32

[19]: mám dotaz, proč mě Vy Dotaz nabádáte ke studiu? Jistě že vím jaký je princip optické myši a chápu narozdí od Vás proč si povrch podložky přisvěcuje a chápu i proč někdo nechápe když na lesklém povrchu nefunguje. Na Václava z doby Karla IV. nemá smysl reagovat, ten si plete OKOLNÍ světlo se světlem DENNÍM.

U levných kamer máme něco jako AWB a pak tu máme ty co se budou ohánět zkratkou ISO.

22 Václav IV Václav IV | 29. února 2016 v 14:25

[21]: Od začátku jsem popisoval příklad čidla jehož princip se neliší od čidla popsaného v článku a tedy jsem psal k věci. Kdo si tedy co s čím plete musí posoudit ostatní. S "myšma" o kterých článek není a jejichž čidla pracují na diametrálně odlišném principu než je ten popsaný v článku jste přišel vy.

23 dotaz dotaz | 29. února 2016 v 17:20

[22]: Asi tak nějak. Navíc podle toho, jak nechápe běžný mluvnický obrat a pořád si chce myslet že ho někdo k něčemu nutí… (doplňte dle libosti, nechci soudit).

24 Petr G. Petr G. | 1. března 2016 v 8:08

Pro Dotaz a Vacka: běžný slovní obrat OKOLNÍ --> DENNÍ světlo, je třeba asi vyšší dívčí. Myš si přisvětluje podložku, aby byl vysoký kontrast obrazu a nemuselo se algoritmem dopočítávat co je a co není ještě tmavý a co už světlý pixel. Při konstatním osvětlení se jednoduše porovnává o kolik px hore, dole, vlevo, vpravo se obraz-myš pohnula. U kamer pro záznam videa se hodnoty ze snímače průměrují a je to pro Vás ona neznámá zkratka AWB. Máte to i v mobilu a ti vzdělanější si to umí přepnout na sluníčko, mráček, domeček atd. Dle toho kamera mění parametry rovnice počítající AWB. No pro blbé by to jako vysvětlení snad stačí. Zbytek si dostudujte.

dodatek: ISO 100,200, 400 ... v kameře nastavuje kolikrát bude signál ze snímače zesílen, neupravuje obraz.

dodatek2 pro Dotaz a Vacka: ISO 100 neznamená 100x vynásob v zesilovači.

25 Vacek Vacek | 1. března 2016 v 10:04

[24]: Díky! To jem nevěděl.

26 dotaz dotaz | 1. března 2016 v 22:46

[25]: Já jsem to věděl... že nedá pokoj. "Je to marný, je to marný... je to marný."

Komentáře jsou uzavřeny.


Aktuální články

Reklama