Analogová logika 1.

... aneb IF zloděj THEN peníze OR život

Když jsem stavěl svého prvního robota, který, jak už jsem psal, byl v jistém smyslu můj nejsložitější – nastal v určitém okamžiku čas, kdy bylo potřeba napsat software. Tehdy začínaly robotické vysavače, které fungovaly tak, že se náhodně toulaly po bytě. Tak jsem si řekl, naprogramuju si na to software.

Můj robot měl kolem celého obvodu celkem šest infračervených čidel přítomnosti překážky a to konstrukce, kterou už jsem popisoval. Principem softwaru mělo být jednoduché

IF je překážka THEN jeď jinam.

Tento přístup velice brzy narazil na dva problémy:

1.     infračervená čidla někdy informují falešně

2.     infračervená čidla někdy překážku nevidí

Výsledkem bodu 1 bylo divné chování, kdy robot jel a uprostřed místnosti prudce otočil. Výsledkem bodu 2 byl samozřejmě náraz.

Poměrně pomalu a poměrně bolestivě jsem se dopracovával k tomu, že psát software jako nekonečnou řadu IF – THEN není to pravé ořechové. Princip problému je totiž v tom co znamená „je překážka.“ Pokud čidlo vydává jenom jednobitovou informaci ANO/NE – a vlastní nestabilitou vám na okamžik vydá ANO. A pokud je váš software „hloupý“ a bude na to reagovat, budete mít problémy jako já.

PetrK_Robot1

Takže bod č. 1: Žádné čidlo nesmí vydávat jednobitovou informaci ANO/NE černá/bílá atd.

U infračervených čidel jsem to vyřešil tak, že vydávala „semianalogovou informaci“ – když neviděla nic, byla to 0; zcela jistě pozitivní detekce překážky bylo kolem 40 „z prstu vycucaných jednotek infračervené odrazivosti.

Co ale dělat, pokud koupíte mizerné čidlo typu sonaru SRF05, který vydává ANO / NE a nic s tím nenaděláte? V takovém případě je možné měřit častěji a výsledky průměrovat, tedy něco jako:

SONAR = 3/4 * SONAR + výstup_čidla

Co to znamená? Výstup sonaru se průměruje s minulými výstupy a teprve když je pozitivní vícekrát za sebou, dosáhne hodnota SONAR velikosti 2 nebo 3 nebo dokonce 4.

To sice přináší „zpoždění reakce“ , ale účinně to filtruje „falešné poplachy“ bez použití složité konstrukce IF-THEN typu:

IF je překážka teď AND byla i minule AND byla i předminule THEN jeď jinam.

Bod č. 2: IF – THEN je váš největší nepřítel.

Přestavte si blondýnu, která má v hlavě – když je venku zima, vezmu si kozačky – to úplně svádí k převedení do nějaké IF-THEN konstrukce typu:

IF Teplota < 10 THEN kozačky

Co když je 9,9, nebo když těch 9,9 je jenom zákmit na křivce která jinak ukazuje 11? Takže pokud vyhodnocujete analogové hodnoty pomocí prahu, který si sami stanovíte – nikdy nevíte jestli ten práh je správný.

Pokud jsem si tedy zakázal používat jednoduché binární rozhodování typu ANO / NE a zároveň jsem si zakázal používat IF-THEN (a obojí zakazuju i vám), jak jsem vyřešil problém typu IF překážka THEN jeď jinam?

Definoval jsem proměnnou strach, která se počítala jako:

STRACH = STRACH + IR_SIGNÁL^2

Nakonec se rozhodovalo takto:

IF STRACH > 3*Dlouhodobý_průměr_Strachu THEN Jeď_Jinam

Proměnná Strach měla složku Y – ve směru jízdy a složku X na ni kolmou – do kterých se sčítaly signály všech čidel a tudíž se dala použít i k nalezení směru kam se vydat – který byl většinou kolmý na směr „maximálního strachu“ – je otázka proč je ve vzorečku IR_SIGNÁL na druhou?

To je proto, aby s přibližováním se k překážce strach „prudce rostl“ a robot opravdu nenarazil.

Tím, že jsem do robota nenaprogramoval žádné „na tvrdo“ nastavené limity, se staly tři věci:

1.     robot se pohyboval po složitých drahách, které v sobě měly něco z „živé přírody

2.     robot se nikdy nikde nezasekl tak, že by pojížděl tam a zase zpátky mezi dvěma překážkami

3.     i dnes po letech, když už několik z jeho IR čidel nefunguje, pořád to na jeho chování není nijak dramaticky poznat

Takže vás vyzývám – dělejte to taky tak – čím více se vám pomocí „chytré matematiky“ podaří vyhnout tupému IF-THEN tím lépe. Takto totiž vzniká blbuvzdornost alias robustnost, o které jsme tady už psali.