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 | 3° |
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:
- Senzor se musí kontinuálně otáčet.
- Rychlost skenování byla zvolena 5x za sekundu.
- Protože se senzor musí kontinuálně otáčet, je třeba využít rotujících kontaktů (slip ring). Zalovil jsem zde.
- 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.
- Jako pohon byl zvolen mikromotor 300 RPM @ 5V s hřídelí 15 mm, podobný tomuto.
- 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.
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.
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ů.
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í | 2° |
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 |
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.