Lidar chudého robotika

Není nad to se v létě trochu ochladit krátkou vzpomínkou na zimu, konkrétně na období mezi Vánocemi a Silvestrem.
Část tohoto období věnuji úvahám nad náplní budoucí hobby-robotické sezóny.
Úvahy bývají vzletné, vize barevné a odhodlání mocné.
Začátek pracovního procesu po Novém roce mě většinou rychle vrátí do reality, nicméně letos ve mě dozrálo jedno z klíčových rozhodnutí: Chci lidar!

Senzor vzdálenosti tohoto typu na svých robotech poměrně citelně postrádám a naivně doufám, že se díky němu zlepší jejich schopnost vyhýbání překážkám.
Nejsa univerzitou a nemaje sponzora můžu zapomenout na úžasná zařízení typu Velodyne Puck. Nezbylo tedy, než se pustit do vlastní tvorby.

Zde bych chtěl ukázat možnost vyrobit obstojně fungující skener v domácích podmínkách. Při konstrukci sice bylo použito 3D tisku, ale v dnešní době je tato technologie stále dostupnější a proto si dovolím i 3D tisk zařadit do „domácích“ podmínek.

Volba senzoru

Triangulační senzory (Neato a jemu podobné) byly zavrženy hned v počátku, protože jsem u kolegů na soutěžích viděl nevalné chování těchto senzorů ve venkovním prostředí.
Jako senzor byl proto zvolen TeraRanger One od francouzské firmy TeraBee.
Jedná se o pulsní lidar, který jako zdroj světla nepoužívá laser, ale infračervené LED.
Netvrdím, že TeraRanger One je nějaký extra zázrak (zatím se zdá, že se v outdoor prostředí zhoršuje stabilita měřených vzdáleností), ale z cenově dostupných senzorů se mi jeví nejvýhodnější.

Parametry lidaru převzaté ze specifikačního listu výrobce:

Principle Infrared Time-of-Flight (ToF)
Range Up to 14 m indoors (At least 5 to 6m in sunlight)
Update rate 1000 Hz in fast mode (Up to 600Hz in precision mode)
Range resolution 0,5 cm
Accuracy ± 4 cm in precision mode
Field of view
Supply voltage 12 V DC recommended (10 to 20V DC accepted)
Supply current 50 mA average (110mA peak @12V)
Interfaces UART, +5 V level, up to 115200,8,N,1. (Factory default when shipped) TWI (I2C compatible) +5 V level (Firmware available on request)
Connector 15 pin DF13 (open-ended cable provided)
Weight 8g (Spider) or 10g (Box)

No nekupte to za 150 EUR 🙂

Nemám v úmyslu zde opisovat manuál a proto případné zájemce odkazuji na výše uvedený link, kde je volně ke stažení veškerá dokumentace.

Koncepce

Cílem bylo vytvořit 360° skenující lidar se slušnou rychlostí skenování a přijatelným úhlovým rozlišením.
Z tohoto zadání vyplynulo:

  1. Senzor se musí kontinuálně otáčet.
  2. Rychlost skenování byla zvolena 5x za sekundu.
  3. Protože se senzor musí kontinuálně otáčet, je třeba využít rotujících kontaktů (slip ring). Zalovil jsem zde.
  4. S ohledem na stabilitu celého zařízení byla jako nosný prvek zvolena tenkostěnná nerezová trubka o vnějším průměru 8 mm. Pro uložení trubky byla zvolena miniaturní zapouzdřená kuličková ložiska.
  5. Jako pohon byl zvolen mikromotor 300 RPM @ 5V s hřídelí 15 mm, podobný tomuto.
  6. Celé zařízení musí mít základní odolnost proti dešti.

Ověření koncepce

Doba čekání na dodávku objednaných komponentů byla využita pro rychlé ověření koncepce a přípravu základního firmware.
Za tímto účelem jsem zničil jedno starší servo, které bylo upravené pro kontinuální rotaci a sloužilo jako jeden z pohonů mého prvního robota. Elektroniku serva jsem zcela vykuchal a převrtal otvor pro šroub ve výstupní hřídeli (plastové) převodovky tak, aby jím šly protáhnout vodiče sliprigu. Na křížovou páku serva jsem poté umístil lidar, doplnil optický snímač začátku scanu, něco drátování a mohlo se začít testovat.

Verze s upraveným servem jako ověření konceptu.

Verze s upraveným servem jako ověření konceptu.

Rychlost skenování se servem je přibližně 1 Hz, což se ukázalo jako nedostačující i pro pomalu se pohybující platformy.
Tato verze byla vyzkoušena v terénu během soutěže Robotem rovně 2016 a vyjma rychlosti skenování vykázala poměrně mravné chování.

Konstrukce lidaru

Především chci poděkovat mému kolegovi Víťovi za pomoc při mechanické konstrukci, 3D modelování a přípravě dat pro 3D tisk. Díky němu poběhla celá záležitost na moje poměry velmi rychle.

Lidar-Obr2

3D model

Lidar-Obr3

3D model

Skener byl logicky rozdělen na stacionární a rotující část. Pro přenos otáček z motoru byly zvoleny kladky a gumový O kroužek pro zachování možnosti snadné úpravy převodového poměru. Obě části byly přiměřeně zakrytovány. Při konstrukci byla preferována snadnost přístupu ke všem komponentům i za cenu ne příliš estetického vzhledu a větších celkových rozměrů.

Lidar-Obr4

Montáž 3D vytištěných dílů, motoru, převodu a slipringu

Lidar-Obr5

Sestava pohonu a připravený kryt

Detail sestaveného pohonu

Lidar-Obr7

Montáž senzoru do otočné věže

Lidar-Obr8

Montáž senzoru do otočné věže

Lidar-Obr9

Sestava lidaru bez krytů před provedením kabeláže

Lidar-Obr10

Sestava lidaru bez krytů před provedením kabeláže

Lidar-Obr11

Elektronika optického snímače začátku scanu a provedení kabeláže

Lidar-Obr12

Pohonná sekce s krytem

Lidar-Obr13

Namontovaný senzor bez krytu

Lidar-Obr14

Záběr z testování funkce. Infračervené světlo LED zobrazil fotoaparát v mobilu jako fialovou.

Záznam signálu z optického snímače začátku scanu - perioda otáčení je 5.319 Hz :-)

Záznam signálu z optického snímače začátku scanu – perioda otáčení je 5.319 Hz 🙂

Rozmazané foto celkové sestavy lidaru.

Rozmazané foto celkové sestavy lidaru

 


Video z testování funkce odkrytovaného lidaru

Zpracování dat ze senzoru

Z hlediska softwarové implementace nevznikly větší obtíže, pouze můj kus měl nastavené jiné parametry než byly v dokumentaci uvedeny jako „default“. Senzor je využíván ve fast-mode binárním režimu, dle mého jediném režimu, který je použitelný pro skutečné real-time nasazení. V tomto režimu ze sebe lidar přenosovou rychlostí 115200 bps sype 1000x za sekundu bloky 4 byte s jednoduchou strukturou:

1. byte = ASCII znak „T“, tj. 0x54
2. byte = vyšší byte vzdálenosti v milimetrech
3. byte = nižší byte vzdálenosti v milimetrech
4. byte = CRC8 předchozích tří byte

Naměřená vzdálenost je reprezentována jako kladné celé číslo, jehož rozsah platnosti je dle dokumentace omezen na 200 až 14000, což neznamená, že senzor nemůže vrátit jinou hodnotu 😉 Pokud měření vzdálenosti není úspěšné (například není překážka), vrací se hodnota 0x0000. Do bufferu scanu se samozřejmě zaznamenávají pouze údaje o vzdálenosti.

Začátek scanu je definován sestupnou hranou signálu z optického senzoru, který je aktivován clonkou na hřídeli pohonu rotující části zařízení. Tento signál je zaveden do řídícího mikrokontroléru jako přerušení a při jeho aktivaci je provedena inicializace nového scanu.
S ohledem na poměrně značný objem dat a nutnost přenášet kompletní scany do nadřízeného systému je pro skenování využito přepínání dvou bufferů. Vždy jeden buffer se plní daty z lidaru a druhý buffer se mezitím formátuje do paketu a odesílá do nadřízeného systému.
Abych alespoň částečně eliminoval úhlové nepřesnosti vzniklé nerovnoměrnou rotací celé platformy, má každý scan svou časovou značku, která říká, jak dlouho trval. Časová značka je neznaménkové celé číslo (4 byte) a má rozlišení 1/24 MHz (41,66666667 ns).
Z uvedeného rovněž vyplývá, že není konstantní počet měření v rámci scanu a proto je každý scan opatřen rovněž informací o počtu provedených měření. Potom se dá snadno dopočítat úhlové rozlišení každého scanu a tím i správné souřadnice detekovaných překážek.

V rámci inicializace nového scanu je tedy zaznamenána časová značka ukončeného scanu, počet provedených měření (záznamů v bufferu) a poté přepnut buffer a vynulována časová značka.

Výsledky

V současnosti byly provedeny statické testy lidaru namontovaného na robotovi.
Technické parametry aktuální verze zařízení jsou následující:

Rychlost skenování 5 Hz
Úhlové rozlišení
Minimální měřená vzdálenost 0.2 m (dle specifikace – netestováno)
Maximální měřená vzdálenost zatím softwarově omezená na 4 m
Rozlišení vzdálenosti softwarově redukováno na 1 cm
Přesnost měření vzdálenosti +/- 10 cm pro vnější prostředí (dle specifikace – netestováno)
Napájení +10 V až +20 V (v robotovi je skener napájen přímo ze systémové baterie 3S1P LiPol 11.1 V)
Příkon 0.7 W

 

 

Foto obrazovky programu pro testy funkce a kalibrace mých robotů.

Foto obrazovky programu pro testy funkce a kalibrace mých robotů.

Snímek z videa zuřivě rotujícího lidaru namontovaného na robotovi Speedy.

Snímek z videa zuřivě rotujícího lidaru namontovaného na robotovi Speedy.

 


Video z testů lidaru namontovaného na robotovi

Na videu je zřejmé mírné „poletování“ polohy scanu, které je, předpokládám, způsobeno rozdílným počtem hodnot ve scanu a proto se v důsledku jiného úhlového rozlišení body grafu vykreslují na mírně odlišné souřadnice.
Pro navigaci bude zřejmě nutné mírné vyhlazení dat, protože na ostrých hranách a lesklých předmětech vzniká značný šum v měřených vzdálenostech.

Závěr

Je zřejmé, že volně přístupná rotující část zařízení není dobré řešení. Zde bylo použito především pro jednoduchost a možnost získat opravdová 360° data. Pokud se skener osvědčí, příští verze bude kompletně zakrytovaná za cenu ztráty části zorného pole.

Aktuálně probíhá implementace základního algoritmu pro vyhýbání překážkám a měla by následovat integrace lidaru do systému pro navigaci robota. Potom konečně dojde na testování v terénu.