close
Vážení uživatelé,
16. 8. 2020 budou služby Blog.cz a Galerie.cz ukončeny.
Děkujeme vám za společně strávené roky!
Zjistit více

Vážení uživatelé,
16. 8. 2020 budou služby Blog.cz a Galerie.cz ukončeny.
Děkujeme vám za společně strávené roky!

Matematika v robotice 17. Hammingovy kódy

5. prosince 2013 v 5:57 | Petr |  Roboti a Matematika
Už kdysi dávno jsem psal o "robotické blbuvzdornosti" tedy o tom, že i do malinkatých robotů je dobré vestavět jisté ochranné prvky, zejména tehdy pokud to nestojí moc práce ani peněz.
Jednou ze součástí takové blbuvzdornosti je spolehlivost posílání dat mezi moduly v robotech. Takže teď odbočím a zopakuju starou větu : KATEGORICKY ZAKAZUJU POUŽÍVAT I2C SBĚRNICI PRO DŮLEŽITÁ DATA. Kdysi jsem doporučoval používat diferenciální sběrnice RS485, CanBus, Robbus, USB, Ethernet atd. Vtip je v tom, že pokud máme i přes použitou sběrnici jsté množství chyb v doručených datech - je čas začít uvažova zda místo surových dat poslaných po sběrnici není čas používat "samoopravné kódy".

Takže přestavte si, že posíláme data poruchovým kanálem - máme celkem 3 možnosti
  1. vůbec nekontrolujeme správnost - přijmeme vadný paket - robot podle něj jede - škubne a něco rozbije ...
  2. V datovém paketu máme nějakou kontrolu - paritní bit, kontrolní součet atd.... Takže přijmeme paket - vyloučíme jej jako vadný a čekáme na další, který může být taky vadný, další taky a další ...
  3. Už při připravě dat pro paket před vysíláním - přidáme "něco navíc" data, která umožní poznat a dokonce i obnovit původní informaci. Pak přijmeme vadný paket, obnovíme jeho data a jedeme dále jakoby se nic nedělo.
Patrně je vám jasné, že samoopravné kódy jsou to nejběžnější kolem nás. Vtip je v tom, že tolik věcí jsme dotlačili až na fyzíkální limity - jako datové toky ve WIFI, kapacitu pevných a flash disků, kapacitu CD/DVD, že chyby v datech na těcho médiích jsou zcela běžné - "ale zákazník to nesmí poznat...."

Takže jsem se kdysi rozhodl, že ovládnu alespoň nějakou formu samoopravného kódovaní, a protože jsem matematický nedouk, tak jsem ovládl jenom tu historicky první a nejjednodušší metodu - což jsou tzv. Hammingovy kódy.
Richard Hamming v roce 1950 zavedl způsob jak výrazně zvýšit spolehlivost děrných štítků a to tím, že ke každým 4 bitům dat přidal 3 bity parity. Jeho 7 bitový kód pak vypadá následovně

P1P2D1P3D2D3D4

Tedy první dva bity jsou parita, pak je jeden datový bit, pak je poslední paritní bit a další tři datové bity.

Malá odbočka k pojmu PARITA. Tedy od pradávných digitálních dob se nejzákladnější kontrola dat dělala tak že k určitému počtu datových bitů se přidal bit navíc - paritní - a jeho hodnota se nastavila tak, aby datový paket měl vždy SUDÝ nebo vždy LICHÝ počet "jedničkových" bitů (proto sudá nebo lichá parita). Pokud tomu tak nebylo bylo jasné, že některý bit se přenosem změnil. Pokud se prohodily vzájemně dva bity - parita zase seděla ačkoliv data byla špatná - ale pravděpodobnost dvou chyb v jednom paketu (bajtu) se považovala za velmi nepravděpodonou.
Paritní bit se spočte prostě tak že uděláte XOR všech datových bitů - výsledek dává SUDOU paritu, pokud výsedek NEGujete dostanete LICHOU paritu.
/P1P2D1P3D2D3D4
P11010101
P20110110
P3000111
1

Takže Hammingovy kódy mají 3 paritní bity, které každý počítají paritu z jiné části datového slova ze kterých bitů se počítá který paritní bit máte označeno v tabulce označeno. Tedy pokud XORem budeme počítat jednotlivé paritní bity potom platí
P1 = D1 xor D2 xor D4
P2 = D1 xor D2 xor D3
P3 = D2 xor D3 xor D4
Tak tohle už smrdí maximální černou magií - takže je čas vysvětlovat. Paritní a datové bity jsou totiř rozmístěny tak šikovně, že nám umožňují poznat který bit je špatný. Postup je následující:
  • Přijmu datový paket a někam si uložím tři paritní bity.
  • Potom si spočtu paritní bity z datových
  • Pak tři paritní bity z datového paketu XORuju s vypočtenými paritními bity
  • Získám 3 bitové číslo které nabývá hodnot 0-7
  • na tuto hodnotu se mohu rovnou dívat jako na pozici chyby - tedy 0 - vše správně 3 - chyba je ve 3 bitu (D1) nebo třeba 4 - chyba je v paritním bitu P3
  • takže pokud získám číslo různé od nuly prostě jenom mechanicky XORuju bit na patřičné pozici jedničkou a mám správný paket.
Opět drobní ďáblici v detailech - co když dojde k poruše více než jednoho bitu - pak patrně nepoznám, že i po korekci mám špatný paket.
Toho využívají i technici a nepraktické 7 bitové pakety doplní ještě o jeden paritní bit, který počítá paritu všech 8 bitů - to je tzv Hammingův kód 8/4, který se také nazývá "Single error correcting double error detecting" - tedy jednu chybu opravím dvě chyby poznám.
Jak se pracuje s takovým kódem :
  • Dekóduju a opravím bity jako v předchozím postupu
  • Pak opravené celé slovo zkontroluju jesti i 4 paritní bit sedí
  • Pokud sedí mohu data použít
  • Pokud nesedí - je zjevné, že datové slovo bylo poškozeno "beyond repair" (za hranice opravitelnosti) a musím jej vyhodit.
Jak to budeme programovat v praxi ? - nemá smysl smolit s v mikrokontroléru s XORováním bitů takže je dobré:
  • Rozdělit odesílaný bajt na 2 4 bitové úseky
  • Pro každou možnou 4 bitovou hodnotu mít v tabulce už předem předvypočtenou hodnotu hammingova kódu, který se odešle (je jich jenom 16).
  • Při příjmu mít v druhé tabulce předem vypočtenou hodnotu všech 265 hodnot, které mohou přijít spolu s hodnotou jaký 4 bitový "nibble" to vlastně je a u těch kombinací které jsou poškozeny "beyond repair" mít hodnotu třeba 16 - abychom věděli, že tento nibble nesmíme použít.
Osobně jsem používal pro výpočet P1-P3 sudou paritu, ale pro P4 lichou paritu - to proto aby "plochá lajna na lince" tedy hodnoty 00000000 a 11111111 dávaly chybu.

Prográmek v assembleru zase neuvádím (protože se za něj stydím). Místo toho jsem nahrál na ULOŽ.TO excelovskou tabulku, pomocí které jsem si celou věc zkoušel (a vypočetl jsem si pomocí ní obě tabulky do programu). Doporučuju prozkoumat a při trápení se jak to mám udělané - Hammingovy kódy pochopit.

Zbývá už jenom tradiční rada pro brunety : nejsou jenom vysoké kozačky až na stehno - ale jehlové kozačky po kotník a odtamtud černé legíny vedoucí po vašich dlóóóuhých nohách "až k pipně" - taky dovedou chlapem otřást.
 

Buď první, kdo ohodnotí tento článek.

Komentáře

1 kolemjdoucí kolemjdoucí | 5. prosince 2013 v 9:47

Dneska výborný... i když to tak autor asi nezamýšlel, skoro se tu řežu smíchy :D

Teď ještě jaký samoopravný kód vymyslet pro tenhle blogovací systém, aby byly články bez překlepů alespoň v odkazech a tučně zvýrazněných částech - závěrečná "pipna" se mnou taky otřásla :D

Ale abych jenom nerýpal, tak musím říct že "jinak dobrý", a dokonce mě možná autor i pomůže, taky brzo budu řešit nějakou komunikaci.

Pro zajímavost uvádím, že jsem někde četl článek (už bohužel nevím zdroj, ale pokusím se to dohledat), ve kterém se zabývali RAM v počítači a její chybovostí (z hlediska nepoužití ECC, řeč byla o 2GB RAM), a došli k tomu, že v průměru jednou za 1,5 hodiny v ní chybuje nějaký bit. Samozřejmě platí, že čím víc RAM, tím hůře (dnes celkem běžně i 8GB). Poučení je myslím nasnadě - čímů víc RAM a čím důležitější systém, tím spíš RAM s ECC

2 Dalík Dalík | 5. prosince 2013 v 9:51

Na přírodě je nejfantastičtější, že vždycky dokáže stvořit ještě chytřejšího člověka, než je člověk sám.
Před geekovým přehledem a záběrem od márnice po roboty se hluboce skláním.

3 kolemjdoucí kolemjdoucí | 5. prosince 2013 v 9:59

achjo, to je strašnej blogsystém, za reposty se omlouvám.

Dalík: Geekovy vědomosti tu nikdo nezpochybňuje. Chce to jen udržet si nadhled a nebrat si hned všechno osobně. Ostatně zrovna na ostravsku jsem často slýchával, že "sranda musi byt, i kdyby na chleba nebylo". Ale pokud Vám snad doopravdy něco vadí, buďte upřímný a konkrétní, to bude užitečnější.

4 kolemjdoucí kolemjdoucí | 5. prosince 2013 v 10:08

Dalík: Geekovy vědomosti tu nikdo nezpochybňuje. Chce to jen udržet si nadhled a nebrat si hned všechno osobně. Ostatně zrovna na ostravsku jsem často slýchával, že "sranda musi byt, i kdyby na chleba nebylo". Ale pokud Vám snad doopravdy něco vadí, buďte upřímný a konkrétní, to bude užitečnější.

5 kolemjdoucí kolemjdoucí | 5. prosince 2013 v 10:11

Ou maj gád, spammer =[

Kdyžtak prosím autora, aby ty duplicity trochu probral.

6 Karel Karel | 5. prosince 2013 v 12:23

Hammingovy kody mě taky docela zajímaly, ale zabrat "zbytečně" půl byte je moc velký luxus. Pro komunikaci mezi moduly robota mi přijde vhodnější použít CRC a zprávu případně opakovat. Zase ale třeba pro povel k odpálení rakety je lepší pan Hamming. Konkrétně třeba Obama má digitálky od raytheonu, levé tlačítko je raketa Sýrie, pravé Rusko a obě dvě současně je nastavení budíku. Tam určitě Hammingův kod používá, jinak by nedopatřením mohl špatně nastavit budík.

7 Dalík Dalík | 5. prosince 2013 v 14:08

kolemtento:
Tý vole, mně vůbec nic nevadí. Mně tu vše naprosto vyhovuje.

8 Petr G. Petr G. | 6. prosince 2013 v 16:06

Mě tu naopak vadí, že není debata k článku. A Karle tvůj vtip s hodinkami také pokulhává, možná kdyby jsi doplnil třetí bit (platná doba stisku) tak bych se i zasmál. Takhle dám po večerech přednost knize Čárové kódy, kde se různé metody kontroly dat probírají a porovnávají se zkušenostmi z praxe. Ale co je to EAN v době RFID, vždyť už je to mrtvá technologie ... pro Vás pokrokovou  mládež.

9 Vladimir Vladimir | 7. prosince 2013 v 10:04

Tak to je masakr :) Sami duplicitni komentare!! Tady nebo blogovaci system pro je spatny, nebo vetsinou muze za to "neco" mezi zidli a klavesnici. K tematu: staci pouzivat deferencni sbernici a pro ochranu kodu pouzit 8-10 a 10-8 serializatory/deserializatory. Jako vyhoda - velka rychlost a nenachylnost k ruseni na dlouhem vedeni. Asi proto to pouziva jak SATA, PCIe, DVI, HDMI a tak dale... A jak vidime data tam vetsinou chodi dobre. Nekde jsem videl clanek o tom jak na CPLD udelali paralelni zbernici pro Kontrolery - ale sbernice je paralelni. Tak jz prave zvazuji neco podobneho udelat ale pouzit DIF paru nebo rovnou CAN sbernici jako fizickou vrstvu. Protokolova vrstva CANu je pro moje ucely zbytecne pomala a slozita.

10 Vladimir Vladimir | E-mail | 7. prosince 2013 v 14:57

Napsal tady pomalu clanek - a ten se ne zobrazil.. Skoda. Ted to uz nebudu rezepisovat. Jen uvedu link na praci : http://blog.tkjelectronics.dk/2012/09/a-practical-approach-to-kalman-filter-and-how-to-implement-it - neni to moje prace. Ale uvazuji o necem podobnem - ale ne s paralelni sbernici. Chci pouzit DIF serial s serializatorem/desirealizatorem 8-10/10-8 a na fiz vrstve CAN.

11 Vladimir Vladimir | 8. prosince 2013 v 9:17

A sakra :) Kdyz nevidis co pises - dal jsem spatny link :) Tohle je ten co ma byt: http://jiiira.ajetaci.cz/FastPort/

12 m.marianek m.marianek | 9. prosince 2013 v 17:59

[11]: Bezva, někdo po velkém úsilí vymyslel na CPLD obvod 8255. No já nevím, ale nestačilo by se podívat do starého katalogu? Pevně věřím, že se stará dobrá 8255ka vyráběla i v rychlejších CMOS verzích.

13 Vladimir Vladimir | 10. prosince 2013 v 18:18

[12]: Zaperve prectite vo co se jedna nez budete psat.. Za druhe, zklamu Vas - uz se neprodavaji. Respektive ne v obyc obchodech - jen nejake vykopavky na ebay a podobne. A take nechapu jak umite nahradit kontroler sbernice obvodem 8255???

14 m.marianek m.marianek | 11. prosince 2013 v 7:04

[13]: Četl jsem si oč se jedná, je to v podstatě jen vylepšené a sofistikovanější řešení toho co 8255ka umí. 8255 umí obousměrný port s handshakingem a podporou pro IRQ a DMA řadič, takže umí mezi dvěma systémy přesouvat bloky dat nezávisle na procesoru. Jasně že to řešení na CPLD má "fíčury" navíc (taky používá obvod, který má o několik řádů víc tranzistorů na čipu), ale principiálně je to stejné, protože 8255ka je na svou dobu prostě geniální obvod. Samozřejmě tím nechci snižovat hodnotu  FastPortu, je to jistě užitečné a sofistikované zařízení, jen chci říct, že to řešení není převratná novinka, ale že má kořeny v počítačovém "pravěku" a již staří 8080tníci věděli... :-)). A stoprocentně tohle řešení není pro začátečníky, kteří jezdí do GME utrácet tatínkovo kapesné. Tak mě napadá, když už se 8255 nevyrábí, jestlipak není alespoň ve formě knihovny pro CPLD (FPGA)? Rok 2027, rozhovor dvou školáků - elektroniků, "tak se mi konečně podařilo rozchodit ten středovlnnej přijímač s MAA125", "nekecej a kde jsi sehnal MAA125?", "no, naprogramoval jsem ji na FPGA". :-))

15 Vladimir Vladimir | 11. prosince 2013 v 11:43

[14]: Ale tady stale paralelni sbernice!!! Ja prece navrhoval udelat neco podobnehi jen na fiz vrstve CAN nebo podobnej sbernice. Je to stale pohodlnejsi spojit zarizeni prez 4 draty nez 8+RS A jednoznacne je treba rozsirovat pocet portu. A teke se da implementovat do toho treba i opravu dat prez kodovani. Dokonce by na FPGA(ne CPLD) udelat i kompress signalu :) Prece probirame tu opravu dat pri predani po sbernici!!!

16 m.marianek m.marianek | 11. prosince 2013 v 16:42

[15]: Mno, ten FastPort je také paralelní.
Je jasné, že seriový přenos je velice pohodlný z hlediska drátování, proto taky miluju UART, je to velice jednoduché a univerzální rozhraní pro pomalý přenos dat (když se to softwarově ošetří, je možné poloduplexně komunikovat po jednom drátu + zem). Ovšem pokud máme přenášet větší tok dat nabývá seriová komunikace slušných frekvencí a už si nejde vystačit s obyčejným drátem, je třeba použít symetrický signál a kroucený pár, impedančně přizpůsobit přijímač k vedení, jinak nám to na delší trase odrazy rozbijí atd. Zkrátka už to přestává být v amatérské praxi sranda a může nastat okamžik, kdy bude lepší jít do nějakého profesionálnějšího řešení např. ethernetový či wifi modul.

Komentáře jsou uzavřeny.


Aktuální články

Reklama