Roboti a Matematika

Matematika v robotice 4. Svět celých čísel 1.

6. června 2013 v 4:32 | Petr
Jako borec, který začíná být starý neustále vzpomínám na "zašlou slávu mládí". A jedním z mých minulých programátorsko-elektronických majstrštyků byl stereofonní ultrazvuk, o kterém jsem psal tolikrát, že asi právě klikáte na tlačítko zpět.
V době, kdy jsem ultrazvuk dával dohromady jsem byl správně drzý a tak mi nepřipadalo jako problém na 16 MHz procesoru zpracovávat datový tok 320 kB/sec - pro vaši informaci 16M/320K = 50 strojových cyklů na jeden vzorek. Samozřejmě, že smyčka, která zpracovávala data (mohu-li to napsat) byla mistrovské dílo v assembleru, kde jeden kanál se načítal AD převodníkem (což trvalo 26 taktů) a druhý se mezitím zpracovával matematicky. Samozřejmě, že v těch 50 taktech se nic moc převratného spočíst nedalo, nicméně stereofonní ultrazvuk pro MiniSumo fungoval zázračně.

Vzhledem k tomu, že dnes už pro takové datové toky byste vzali spíše nějaký STM32 tak minimálně na 70 MHz, nebo možná i vice tak patrně nikdy nebudete řešit problém, typu - "jestli spočtu z těchto hodnot průměr - už se nevejdu do patřičného času". Nicméně věc, kterou budete řešit bude asi otázka zdali cpát z čidel do centrálního počítače (izolepou přilepeného notebooku) rovnou surová data, nebo jestli je nějak předzpracovat.
Srovnání z praxe - pokud používáte 40 kHz ultrazvuk, který dle Shanona-Nyquista digitalizujete na ideální frekvenci 160 kHz a měříte vzdálenost max. 4 metry, a to 10x za sekundu je to datový tok 38 kilobyte/sec. Pokud budete posílat jenom změřenou vzdálenost překážky v milimetrovém rozlišení bude to 20 byte / sec.

Pokud zvolíte verzi - posílat surová data - pak asi narazíte na to, že s rostoucím počtem čidel vám žádná sběrnice nebude dosti rychlá a že nároky na centrální počítač velice vzrostou.
Pokud zvolíte verzi zpracovávat data mikrokontrolérem co nejblíže jejich vzniku, tedy přímo v procesoru řídícím čidlo (což osobně považuju za správné) narazíte na problém omezených prostředků mikrokontrolérů.

Jedním ze základních omezení, které je i u většiny 32 bitových MCU je nutnost používat celočíselnou aritmetiku.
Exisutjí sice procesory s matematickým komprocesorem, nebo v C je možno přilinkovat emulační knihovny. Obojí ale znamená značné omezení. Jestli si právě říkáte, že se vykašlete na rady konzervativního dědka a budete si psát své algoritmy ve "float" jak budete chtít - tak si vás dovolím upozornít, že dnes nejčastěji používané DSP algoritmy - to jest dekódování MP3 a dekódovaná GSM signálu jsou taky - zcela úmyslně naprogramovány v celočíselné matematice, aby pro MP3, nebo mobil od Vietnamce za 299,- nebylo nutno používat procesor s koprocesorem nebo s velkou ROM (FLASH) pamětí.

Takže v nejbližší době probereme celočíselné algoritmy. Dnes už jsem psaním poněkud unaven, tak si dáme jenom ochutnávku.

A = 7/8 X spočteme jako A = ( ( X << 3 ) - X + 4 ) >> 3

Tušíte proč je to mnohem rychlejší než násobení 7 a dělení 8 ?
Tušíte proč je tam + 4 ?

Zbývá už jenom oblíbená rada pro blondýny : Když v Cosmopolitanu píšou, že začíná léto - není to rozkaz lézt do plískanice v minišatech - oni píšou své články půl roku dopředu, a navíc někde v Anglii - takže prd vědí jak je zrovna teď u vás v Zatopené Lhotě.

Post Scriptum : Protože moje matematické schopnosti, se blíží svým hranicím - hledám už předem "hostujícího autora" který napíše srozumitelnou lekci (nebo vice lekcí) o Kalmanových numerických filtrech a to nejlépe vidláckým způsobem, abych to i já (konečně) pochopil. Hlaste se hojně - v diskusi. Pokud by psaní "vidláckým způsobem" mohlo znamenat, že vás vyhodí z Matfyzu nebo ČVUT, nebo s vámi přestanou chodit na pivo - můžu identitu autora utajit (nebo s ním začít chodit na pivo sám)....

Matematika v robotice 3. Co je to přesnost.

23. května 2013 v 5:39 | Petr
Dneska už tak ostře neodmítám ideu robota, který má na hřbetě izolepou přilepený notebook, ale pořád se mi mnohem více líbí roboti řízení mikrokontroléry, co z nich nikde nic neleze a robot vás nemá tendenci zabít, protože propadl "computerovému šílenství", protože Windows, místo plánování trasy, právě "nahrávají aktualizace".

Pokud nemáte v robotovi notebook, a přesto potřebujete mít nějaký sofistikovaný software. Sofistikovaný software většinou vznikne tak, že použijete chytrá čidla a chytrou elektroniku a chytré digitální (matematické) zpracování. Pod pojmem "chytrý" tady myslím chytrý jako Eurobot Martina Lockera z roku 2005 - tedy jednodušší než si kdo dovedl představit a přesto dokonale fungující. Ne "chytrá" jak si představují dnešní marketingoví mágové - to jest "žďorbo" nabité zbytečnostmi, aby se dala zákazníkovi účtovat cena, co se z ní podlamují kolena.

Takže bez nějakých těch výpočtů to nepůjde. A tady narážíme na problém - matematici většinou předpokládají absolutní přesnost výpočtu. To je tzv "Arbitrátní přesnost", kdy můžete výpočet spočíst na tolik míst až je chyba nekonečně malá. My však máme k dispozici jenom procesor, který v lepším případě má k dispozici matematický koprocesor a je schopen jakž takž počítat s reálnými čísly, nebo nemá ani to a pak počítáme s reálnými čísly za cenu krvavého zpomalení (a zvětšení) programu matematickými knihovnami, nebo si musíme vystačit s celými čísly.

Samozřejmě, pokud nějaký algoritmus osekáme z "nekonečné" přestnosti jak předpokládají matematici na 8 bitů celočíselných - zdá se to být takový masakr, že je lepší se do programování takového výpočtu ani nepouštět.
Moje zkušenost však říká něco jiného - často i zjednodušený výpočet s hrubými chybami je lepší než nic.
Příklad na obrázku. Představte si robota na Mini Sumo, který stojí na kraji hřiště a má dorazit do místa kde je soupeř - který je v průsečíku os. K tomu aby se trefil má čidlo soupeře (stereofonní sonar), které mu dává azimut k protivníkovi. Pokud je toto čidlo dokonale přesné - pojede podél červené čáry. Co se stane když čidlo má nějakou úhlovou odchylku - na obrázku jsem zvolil hrozivých 45 stupňů. Nedojede do cíle ? Kdepak - dojede jenom ne po červené přímce, ale po modré dráze - což je logaritmická spirála, která taky skončí v cíli, akorát je třeba ujet trasu přibližně 2x delší.

Jasné - 45 stupňová chyba v azimutu nepřekáží nalezení soupeře.
Proč to ? Pokud by robot měřil azimut jenom jednou - nikdy by netrefil, protože ale měří opakovaně, a pořád se snaží svoji chybu korigovat (byť pořád stejně špatně) nakonec dojede.

Poučení z tohoto případu ? Časté opakované měření, které není zatíženo kumulující se chybou nevede k dramatickým problémům ani pokud je zatíženo velkou systematickou chybou každého měření. Takže pokud budete počítat siny a kosiny v celočíselné matematice a budete tam mít 10% chybu - stále to nemusí být žádné drama. ( A stále to není důvod se na tu trochu počítání vykašlat).

Proto počítejte s tím, že po letech programování výpočtů na 8 bitovém AVR v assembleru - jsem se rozhodl zveřejnit svoji "tajnou kuchyni", přestože jsem původně o programování nechtěl vůbec psát. Takže postupně probereme úplně všechno, o čem se v učebnicích málokdy dočtete. pro dnešek končíme, abyste mohli nabrat síly na dalších milión pokračování.

Zbývá už jenom oblíbená rada pro blondýny : Geometrické tvary jsou letos OUT, jenom kosočtverec je věčný !!!

Matematika v robotice 2. Problém společného jazyka 2.

16. května 2013 v 4:42 | Petr
Už jak jsem psal v "Analogové logice" - analogová logika - alias matematika má tu krásnou vlastnost, že mnohdy vyřeší problém aniž byste si vůbec uvědomili, že problém vznikl - jako třeba už mnou zmiňovaná pokažená čidla za která zaskakují sousední - fungující.
Proto je veliká škoda a je pro vás veliké mínus, pokud se "nějakému tomu počítání" vyhýbáte. Jenomže to vyhýbání určitě má své důvody. Jako třeba hrozivé názvy - "Výpočet odmocniny Newtonovou iterační metodou" - nikdo vám nenapíše že odmocninu z X spočtete takto

ODMOCNINA = 1
FOR I = 1 TO 10 DO
ODMOCNINA = (X / OMOCNINA + ODMOCNINA) /2
NEXT I

V čem je vtip - v tom že pokud číslo dělíte jeho vlastní odmocninou dostanete zpátky zase odmocninu takže na konci výpočtu X/ODMOCNINA bude totéž co ODMOCNINA a jejich součet dělený 2 (vlastně tedy průměr) bude úplně stejný. Neboli cyklus probíhá stále dokola a dokola dokud se hodnota ODMOCNINA neustálí na skutečné hodnotě odmocniny z X. Dokonce existuje matematická teorie, že každou iterací (průchodem smyčkou) se nám spočtou 2 cifry výsledku, proto jsem dal opakovat 10x protože odmocnina na 20 míst bohatě stačí ( i se všemi nepřesnostmi to stačí k ustálení výsledku na obstojné přesnosti). Proč jsem nedal podmínku že cyklus skočí až se hodnota ODMOCNINy přestane měnít - protože v numerické matematice jsou problémy s výrazy typu A==B. Místo nich se musí používat abs (A-B) < SKORO_NULA - s hodnotou SKORO_NULA jsou taky problémy - jaká by vlastně měla být ? Pokud ji nastavíte blbě algoritmus, pro určité vstupy, nikdy neskončí - takže hrozí prakticky nepolapitelný "bug" ve vašem softwaru - takže v rámci blbuvzdornosti se vše natvrdo zopakuje 10x a hotovo....

Mimochodem víte že se takto dají velice jednoduše a přesně počítat odmocniny i s celými čísly v mikrokontroléru, dokonce v assembleru. A víte že se takto dají počítat vzdálenosti dvou bodů při robotické navigaci ? Nevíte ? Patrně to v článku o Newtonově iterační metodě nebylo.

Čili je jasné, že pokud člověk není matematik, ale potřebuje matematiku používat, potřebuje jednak něco odvahy a potom způsob jak číst matematické články. K tomu bych rád poskytl několik rad.
  1. Čtěte moje články - netrpím "matematickým" ani "inženýrským" syndromem a dvojitým integrálům sám moc nerozumím, tak mám tendenci obejít se bez nich.
  2. Vyberte si něco co bezpečně znáte, třeba Pythagorovu větu a najděte si ji na Wikipedii a zkuste trénovat matematicky hieroglyfické písmo.
  3. Když čtete náročnější text - nejprve přečtěte to, co je psáno běžnou latinkou a až při druhém čtení se ponořte do vzorečků.
  4. Mějte na pamětí, že "ani počítače matematikům nerozumějí" - proto se výpočty musí z hieroglyfů přepsat do programovacího jazyka, který je často mnohem srozumitelnější, hledejte tedy popis algoritmu nebo "numerické řešení" z toho se dá často pochopit vo co go.
  5. Hledejte grafy a snažte se je pochopit.
  6. Nepropadejte panice - většina složitých výpočtů vede k jednoduchým prográmkům - kolem takového exponenciálního klouzavého průměru byly napsány stohy a přitom to je to prosté Xi = (1-n)*Xi-1 + n*A, kde n je z intervalu (0,1), což se ale pro n=0.25 dá napsat jako X = (3X + A) / 4 ;-)))
Za domácí úkol si zadejte heslo "Výpočet odmocniny Newtonovou iterační metodou" do Googlu a teď když víte vo co go se pokochejte tím, jak v tom všichni hledají vědu - tímto exemplárním příkladem můžete klidně začít - legračnějším o to, že to má být návod jak danou věc naprogramovat - futajbl.

Zbývá už jenom tradiční rada pro blondýny - když dojde na - minule zmiňovaný - sešitek se vzorečky a vy budete utíkat z rande - víte že možná utíkáte od zajištěného, inteligentího, solidního muže - do náruče prošoustaného hochštaplera - blbce ?

Matematika v robotice 1. Problém společného jazyka 1.

9. května 2013 v 5:48 | Petr
Tradicí u mně už je, že vždy začnu nějaké téma z prostředka, a teprve když je vše zveřejněno napadají mě souvislosti, které mohou věc objasnit. Takže jsem pro Robodoupě.CZ napsal sérii článků, které jsem se styděl nazvat "Matematika" protože to by je asi nikdo nečetl, tak jsem použil krycí název "Analogová logika" což je rozhodování vzniklé výpočtem - což je matematika ....

Osobně jsem lidmi považován za matematika, matematiky bych však nepochybně byl považován za "analfabeta", protože sdílím s matematiyk jejich postupy a vizuální představy, ale bohužel nemám IQ dostatečně vysoké abych plynule četl a psal jejich "verbálním jazykem".

Když si nalistujete v učebnici kapitolu Aritmetický průměr. První co na vás vyskočí je tohle :
A to ještě není to nejhorší co můžete číst - vzorečky s dvojitými integrály pro X od mínus do plus nekonečna atd ... Matematici totiž toto "Egyptské hieroglyfické písmo" sají už s mateřským mlékem, a jsou hrdí na to, že mu rozumí. Problém je v tom, že matematici bývají zvláštní, takže si nejsem jist jestli je to náhoda, nebo jestli jsou taky hrdí na to, že jiní jim nerozumí.

Navíc kdysi ve školách učil jeden kantor všechny předměty a vládla "trojčlenka" takže se řešily úlohy jako od babičky typu:
Když na bábovku ze 400 g mouky potřebujeme 3 vajíčka kolik vajíček potřebujeme na bábovku ze 700 g mouky. A pak se psalo
X = (3 / 400) * 700 = 5 a čtvrt vajíčka
Dneska jsou kantoři - matematici specialisti a ti vás donutí naučit se na to vzorec. Pak máte vzorec na "vajíčka a mouku" a vzorec na "tři kopáče za 10 hodin" a vzorec na ..... A pak jde život tak dlouho až narazíte na úlohu, která je sice stejného typu, ale vzorec na ni vás neučili ....

Takže se vrátíme ještě jednou k průměru - můžeme napsat
Nebo můžeme říct "průměr se počítá tak, že sečteme všechna X dohromady a soušet vydělíme jejich počtem" .... Jenomže to můžu napsat já, protože se nebudu muset jít oběsit, když tohle přečte nějaký matematik a jako s primitivem už se mnou nikdy nepromluví.

Že mládež matematice nerozumí, tuto nenávidí, učit se ji nebude, opravdovým matematíkům v jejich genialitě nevadí, a možná že v jejich střelenosti, to dokonce lechtá jejich EGO.
Jako vidlák z vesnice, si můžu dovolit i hrubé a primitivní věci, proto, když narazím na nějaké výpočty (což mám v nejbližší době opět v úmyslu) budu je vysvětlovat primitivně jako příklad s babiččinou bábovkou.

Protože já i moji čtenářové jsme dnes poněkud unaveni, dáme si už jenom oblíbenou radu pro blondýny - když "potenciální kořist" na prvním rande vytáhne sešitek se vzorečky - máte vyřešeno jestli se přivinete, nebo budete prchat ??
 
 

Reklama