Web nejen o robotice

Sledování čáry: pravidla, roboti a technika soutěžní disciplíny

Reklama:

Sledování čáry (anglicky Line Follower) je pravděpodobně první disciplína, se kterou se setká každý začínající stavitel robotů. Je vidět prakticky na každé soutěži od školních kroužků po fakultní klání typu Robotického dne nebo RoboTripu, a přesto v sobě skrývá kompletní inženýrský problém — senzoriku, regulaci, mechaniku i software. Tímto článkem otevírám sérii věnovanou robotickým soutěžím, a sledování čáry je logický první krok: je to disciplína, na které se dá demonstrovat prakticky vše, o čem jsem dosud na roboVěda.cz psal, od článku o PID regulaci až po rozbor toho, proč se DC motor otáčí v každém směru jinak.

Pravidla disciplíny: od základů po nástrahy tratě

Princip je na první pohled triviální — robot musí autonomně sledovat kontrastní čáru na podlaze a projet dráhu v co nejkratším čase. Ve skutečnosti je ale "sledování čáry" deštníkový pojem pro desítky mírně odlišných sad pravidel, protože každá soutěž si nastavuje vlastní obtížnost. Než se pustíte do stavby robota, je nezbytné znát pravidla konkrétní soutěže, na kterou cílíte — parametry se liší i v detailech, které rozhodují o vítězství.

Společný základ

Napříč českými soutěžemi (Robotický den, RoboTrip, Stopař pořádaný OK1KPI) se ustálilo několik shodných principů:123

  • Kontrastní čára na světlém podkladu. Standardem je černá čára o šířce zhruba 15 mm na bílé nebo světlé ploše — dost úzká na to, aby vyžadovala přesnou navigaci, dost široká, aby ji zvládl detekovat i jednoduchý senzor.3
  • Minimální poloměr zatáčky. Trať se nesmí lomit ostřeji, než robot dokáže sledovat — typicky 5–15 cm podle úrovně obtížnosti.23
  • Robot musí být plně autonomní. Žádné dálkové ovládání ani externí komunikace během jízdy — o pohybu rozhoduje výhradně program nahraný v robotovi.23
  • Diskvalifikace při ztrátě čáry. Pokud robot sjede mimo dráhu tak, že se čára nenachází mezi jeho koly (mimo definované výjimky u překážek), pokus končí.2

Až na tomto základu stojí skutečná obtížnost — a ta se skrývá v tom, co pravidla nazývají "prvky tratě".

Křižovatky: pravidlo pravé ruky

Křižovatky typu T a X jsou standardní součástí středně těžkých tratí. Naprostá většina soutěží řeší nejednoznačnost stejně jako silniční provoz — robot se na křižovatce drží vpravo.1 Prakticky to znamená, že řídicí algoritmus nesmí jen slepě sledovat "nejsilnější" signál ze senzorů, ale musí umět rozpoznat situaci, kdy se čára rozdvojuje, a aplikovat pevné pravidlo namísto snahy pokračovat rovně.

Vynechané a přerušované čáry

Trať nemusí být souvislá. Pravidla Robotického dne povolují přerušení čáry v délce až 7 cm na libovolném místě dráhy,2 RoboTrip pracuje s mezerami do 10 cm.1 Robot v tu chvíli "oslepne" — nemá žádný senzorický vstup k regulaci. Řešením je typicky setrvačná jízda: pokud senzor náhle ztratí čáru, robot krátce pokračuje posledním známým směrem a rychlostí, než čáru znovu zachytí. To je přesně situace, kde se projeví kvalita regulační smyčky — příliš agresivní D-složka bude na výpadek senzoru reagovat panicky, zatímco dobře odladěný regulátor "přejede" mezeru hladce.

Smyčky a rozdvojení tratě

Náročnější tratě obsahují místa, kde se čára rozděluje na dvě větve nezávisle dlouhé, nebo se dokonce vrací zpátky ve smyčce, která otočí robota proti původnímu směru.2 Robot musí umět zvolit jednu větev (typicky opět pravidlem pravé ruky) a nesmí se zaseknout v nekonečném kroužení — což se v praxi stává týmům, jejichž algoritmus řeší jen lokální stav senzorů bez jakékoliv paměti předchozích rozhodnutí.

Fyzické překážky na dráze

Pokročilejší kategorie (RoboTrip je nazývá výstižně Line Follower Enhanced1) přidávají skutečné fyzické překážky: krabici položenou přes čáru, tunel s minimálním průřezem, houpačku nebo můstek s převýšením do 10 cm, případně clonu, kterou musí robot fyzicky prorazit.21 Po překonání překážky se robot musí vrátit na čáru obvykle do 30 cm.12 Tyto prvky testují spíš mechanickou robustnost a šasi než regulaci — nízko posazený senzor line-followeru se o hranu krabice snadno zachytí.

Inverzní čára

Vzácnější, ale poctivě zákeřná varianta obrací kontrast — světlá čára na tmavém podkladu. Princip detekce (rozdíl v odrazivosti povrchu) zůstává stejný, ale mnoho amatérských konstrukcí má kalibraci prahové hodnoty pevně zadrátovanou v kódu pro "černou na bílé". Pokud robot rozpoznává čáru jen jako "tmavší než okolí" bez skutečné kalibrace při startu, na invertované trati selže úplně. Spolehlivá konstrukce proto vždy kalibruje černou a bílou hodnotu na začátku jízdy, ne napevno v kódu — k tomu se vrátíme v kapitole o softwaru.

Jakého robota na sledování čáry použít

Než se pustíme do elektroniky a kódu, je třeba mít samotné vozítko. Máte v zásadě tři cesty: koupit hotového nebo stavebnicového robota, postavit vlastní podle návodu nebo z 3D tištěných dílů, anebo sáhnout po klasické konstrukční stavebnici.

Jaké parametry robot potřebuje

Bez ohledu na zvolenou cestu platí pro dobrého sledovače čáry několik konstrukčních priorit:

  • Nízké těžiště a krátký rozvor. Line follower prochází ostrými zatáčkami vysokou rychlostí — vysoké těžiště zvyšuje riziko převrácení a dlouhý rozvor (vzdálenost mezi nápravami) zhoršuje schopnost rychle měnit směr.
  • Senzorová lišta blízko podlahy, vpředu na přední hraně podvozku. Čím dál senzor "vidí" před robota, tím dřív dokáže regulátor reagovat na nadcházející zatáčku — to je přímá analogie k lookahead principu, který jsme popisovali u D-složky PID regulátoru.
  • Nízká hmotnost vůči výkonu motorů. Zrychlení je nepřímo úměrné hmotnosti; těžký robot z ostré zatáčky prostě nedokáže zabrzdit ani zrychlit tak rychle jako lehký.
  • Diferenciální pohon (dvoumotorová konfigurace). Řízení zatáčení diferencí rychlostí obou kol (tzv. skid-steering nebo diferenciální řízení) je pro line follower prakticky univerzální volba — umožňuje otočení na místě, což kolová podvozek s natáčenou nápravou nenabídne. Podrobně jsem princip diferenciálu rozebíral v souvislosti s podvozky pro robotická auta.

Hotový robot k okamžitému nasazení

Kdo nechce řešit vlastní konstrukci, může sáhnout po hotové platformě. Referenční volbou v této kategorii je už léta Pololu 3pi+ — kompaktní, kruhový podvozek o průměru necelých 10 cm, poháněný řadičem ATmega32U4, s integrovaným polem IR reflexních senzorů přímo pod přední hranou šasi.4 Edice Turtle s převodovkou 75:1 dosahuje rychlosti kolem 0,4 m/s a je určená spíš pro přesnost než závodní rychlost, zatímco agresivnější převody (15:1, 30:1) cílí přímo na časovky.4 V Česku je 3pi+ dostupný sestavený i jako stavebnice přes Botland.cz,4 takže není nutné objednávat ze zahraničí. Robot se programuje v Arduino IDE, ale díky ATmega32U4 s ním bez problémů komunikuje i MicroPython přes připojený mikrokontrolér, pokud dáváte přednost Pythonu před C++.

Stavba podle návodu nebo z 3D tištěných dílů

Kdo chce robota postavit sám, ale nechce navrhovat elektroniku od nuly, má dvě rozumné cesty.

První je analogová stavebnice bez mikrokontroléru — typickým zástupcem je česká stavebnice Malý robot pro sledování čáry od Pajenicka nebo Stavebnice elektronického sledovače čáry D2-1 od LaskaKitu.56 Obě fungují na stejném principu: dvojice fotorezistorů nebo IR závory čte odraz světla, komparátor (typicky LM393) porovnává signál s referenční hodnotou a přímo spíná tranzistory, které pohánějí motory. Žádný kód, žádný mikrokontrolér — jen pájení a kalibrace potenciometrem. Je to výborný vstupní bod pro pochopení principu senzoriky, ale s pevně zadrátovanou logikou nezvládne složitější prvky tratě jako křižovatky nebo inverzní čáru.

Druhá cesta je 3D tištěné šasi s vlastní elektronikou. Na Printables najdete řadu volně stažitelných modelů šasi pro line followery — od jednoduchých podvozků pro Arduino7 až po kompletnější sady s prostorem pro senzorovou lištu a baterie.8 Výhodou je, že si zvolíte vlastní mikrokontrolér (typicky ESP32 nebo Raspberry Pi Pico s MicroPythonem — viz náš přehled MCU používaných v robotice) a vlastní senzorové pole, takže robota můžete postupně vylepšovat.

Vlastní konstrukce z konstrukční stavebnice

Kdo dává přednost šroubovanému mechanickému řešení před 3D tiskem, sáhne po klasické konstrukční stavebnici. Merkur nabízí dost tuhé kovové profily na to, aby udržely senzorovou lištu bez prohýbání i při vysoké rychlosti — podrobně jsme stavebnici rozebírali ve srovnání Merkuru, Meccana a Erectoru. LEGO Technic naopak nabízí rychlejší stavbu a snadnou modularitu přes Technic piny, ovšem za cenu vyšší hmotnosti — kompromisy jsme popisovali v průvodci LEGO Technic a robotika. Pro nejlehčí a nejpřesnější konstrukci je ale často nejlepší volbou BitBeam — 3D tisknutelná stavebnice kompatibilní s LEGO Technic, která umožňuje kombinovat tuhost šroubovaného spoje s hmotností odpovídající přesně vašemu návrhu, protože si díly sami tisknete v potřebné variantě. Volba mezi těmito třemi přístupy je ostatně přesně úlohou, kterou jsme řešili obecně v přehledu konstrukčních robotických stavebnic.

Senzor a pohon: fyzika pod kapotou

Ať zvolíte kteroukoliv cestu ke stavbě, dobrý line follower stojí na třech technických pilířích: jak čte čáru, jak ji vyhodnocuje, a jak reaguje pohybem.

Princip optického senzoru

Standardní senzor pro detekci čáry je IR reflexní senzor — dvojice infračervené LED a fototranzistoru (nebo fotodiody) umístěná těsně vedle sebe a namířená kolmo dolů, těsně nad podlahu (obvykle 3–8 mm).9 LED vyzařuje infračervené světlo, které se od podlahy odráží zpět k fototranzistoru. Bílý (nebo světlý) povrch odráží většinu dopadajícího záření, zatímco černá čára jej převážně pohltí. Fototranzistor tento rozdíl převádí na rozdílný proud, který se buď čte přímo jako analogová hodnota na ADC pinu mikrokontroléru, nebo se nejdřív porovná s referencí přes komparátor a vystupuje jako digitální signál 0/1.

Typickými zástupci jsou levné moduly TCRT5000 nebo QRD1114 pro stavbu jednotlivých senzorů, případně hotová senzorová lišta typu Pololu QTR-8A s osmi senzory na společné desce — právě takové pole najdete i pod šasi robotu 3pi+.4

Klíčový konstrukční parametr je rozteč senzorů vzhledem k šířce čáry. Pokud jsou senzory rozmístěné příliš daleko od sebe, robot ztrácí čáru mezi dvěma měřicími body a "kmitá" ze strany na stranu. Pokud jsou příliš blízko, senzorová lišta nezachytí ostrou zatáčku dřív, než do ní robot vjede. Praktické pravidlo je rozteč sousedních senzorů zhruba na polovinu až dvě třetiny šířky čáry — pro standardní 15mm čáru tedy typicky 8–10 mm mezi sousedními senzory.

Výpočet pozice čáry váženým průměrem

S polem šesti až osmi senzorů nejde jen o to "kde je jednička", ale o výpočet spojité pozice čáry pod robotem. Standardní metoda je vážený průměr — každému senzoru se přiřadí pozice (např. 0, 1000, 2000... pro osm senzorů v krocích po 1000) a výsledná pozice čáry je váženým průměrem těchto pozic podle naměřené intenzity signálu z každého senzoru. Tato jedna hodnota (typicky v rozsahu 0–7000 u osmi senzorů, se středem na 3500) je pak přímo chybou (ϵ) pro regulační smyčku — přesně ten vstup, který jsme v článku o PID regulaci označovali jako regulační odchylku.

Hmotnost, rychlost a přilnavost

Fyzika pohybu po zatáčkách je u line followeru neúprosná. Odstředivá síla v zatáčce roste s druhou mocninou rychlosti, takže zdvojnásobení rychlosti znamená čtyřnásobně vyšší nároky na tření mezi pneumatikou a podlahou, aby robot zatáčku vůbec udržel na dráze. Odtud plynou tři vzájemně provázané parametry:

  • Hmotnost. Lehčí robot má nižší setrvačnost, takže potřebuje menší brzdnou i hnací sílu ke stejné změně rychlosti — proto se u soutěžních line followerů šasi odlehčuje na hranu nutné tuhosti (odtud i obliba tenkých karbonových desek v pokročilejších konstrukcích).
  • Přilnavost pneumatik. Měkčí pryžové bandáže s vyšším koeficientem tření drží zatáčku při vyšší rychlosti, ale kladou větší valivý odpor v přímé jízdě — proto zkušení stavitelé volí různou tvrdost pneumatik podle poměru zatáček a rovinek na konkrétní trati.
  • Brzda. DC motor lze aktivně brzdit zkratováním obou svorek (tzv. dynamické brzdění) nebo krátkým impulzem v opačném směru přes H-můstek — právě tímto mechanismem se u motorových driverů jako L298N, které jsme popisovali v článku o PID regulaci, realizuje rychlé zastavení bez nutnosti čekat na doběh setrvačností. U rychlých line followerů je aktivní brzda před ostrou zatáčkou stejně důležitá jako akcelerace na rovince.

Výsledná rychlost průjezdu tratí tedy není otázkou "jak silný motor", ale vyvážení hmotnosti, přilnavosti a kvality regulace — silnější motor bez odpovídající přilnavosti kola jen prokluzuje.

Softwarové řízení: od senzoru k PWM v MicroPythonu

Poslední vrstva je software, který spojuje senzorické čtení s regulační smyčkou z předchozího dílu o PID. Následující ukázka v MicroPythonu je zjednodušená, ale funkční kostra — počítá s polem šesti analogových IR senzorů na ADC pinech a dvojicí DC motorů řízených přes H-můstek stylu L298N, tak jak jsme zapojení popisovali v článku o PID regulaci.

Kalibrace před startem

Aby robot fungoval na běžné i inverzní čáře, nesmí mít prahovou hodnotu černá/bílá zadrátovanou napevno — na začátku jízdy ji musí sám zjistit otočením nad čárou:

from machine import Pin, ADC, PWM
from time import sleep_ms

# Pole 6 IR senzoru na ADC pinech ESP32
SENSOR_PINS = [32, 33, 34, 35, 36, 39]
sensors = [ADC(Pin(p)) for p in SENSOR_PINS]
for s in sensors:
    s.atten(ADC.ATTN_11DB)  # rozsah 0-3.3V

min_vals = [4095] * len(sensors)
max_vals = [0] * len(sensors)

def calibrate(motor_left, motor_right, duration_ms=2000):
    """Robot se pomalu otaci na miste a zaznamenava extremy senzoru."""
    motor_left.forward(300)
    motor_right.forward(-300)
    t = 0
    while t < duration_ms:
        for i, s in enumerate(sensors):
            v = s.read()
            min_vals[i] = min(min_vals[i], v)
            max_vals[i] = max(max_vals[i], v)
        sleep_ms(10)
        t += 10
    motor_left.forward(0)
    motor_right.forward(0)

def read_normalized():
    """Vrati hodnoty 0-1000 nezavisle na tom, jestli cara je tmava na svetlem, nebo naopak."""
    result = []
    for i, s in enumerate(sensors):
        raw = s.read()
        span = max(1, max_vals[i] - min_vals[i])
        norm = (raw - min_vals[i]) * 1000 // span
        result.append(max(0, min(1000, norm)))
    return result

Kalibrace uloží pro každý senzor naměřené minimum a maximum nad černou i bílou plochou. Díky normalizaci read_normalized() je jedno, jestli je čára tmavá na světlém podkladu, nebo naopak — algoritmus dál pracuje jen s relativní hodnotou 0–1000, ne s absolutním jasem.

Výpočet pozice čáry a PID regulace zatáčení

POSITIONS = [0, 200, 400, 600, 800, 1000]  # vahy jednotlivych senzoru

def line_position(values):
    """Vazeny prumer pozic senzoru podle sily signalu. Vraci None, pokud cara neni videt."""
    weighted_sum = 0
    total = 0
    for pos, val in zip(POSITIONS, values):
        weighted_sum += pos * val
        total += val
    if total < 300:  # zadny senzor nevidi caru vyrazne
        return None
    return weighted_sum / total

SETPOINT = 500.0  # stred pole senzoru
Kp, Ki, Kd = 0.06, 0.0008, 0.02

integral = 0.0
last_error = 0.0
last_position = SETPOINT  # posledni znama pozice pro pripad vypadku cary

def steering_correction(position):
    """Vraci korekci rychlosti (kladna = zataceni doprava)."""
    global integral, last_error
    error = position - SETPOINT
    integral += error
    integral = max(-5000, min(5000, integral))  # anti wind-up
    derivative = error - last_error
    last_error = error
    return Kp * error + Ki * integral + Kd * derivative

Tento fragment je přímou aplikací principu z článku o PID regulaci: error je regulační odchylka, Kp, Ki a Kd mají stejný význam jako u regulace rychlosti motoru — jen zde neregulujeme otáčky, ale příčnou odchylku od středu čáry.

Hlavní smyčka s ošetřením výpadku čáry

BASE_SPEED = 500       # zakladni PWM vykon rovne jizdy (0-1023)
MAX_CORRECTION = 400
LOST_LINE_TIMEOUT_MS = 200

def main_loop(motor_left, motor_right):
    global last_position
    lost_since = None
    while True:
        values = read_normalized()
        position = line_position(values)

        if position is None:
            # Cara vypadla (mezera v draze) - kratce pokracujeme
            # posledni znamou korekci, pak zastavime
            if lost_since is None:
                lost_since = 0
            lost_since += 10
            if lost_since > LOST_LINE_TIMEOUT_MS:
                motor_left.forward(0)
                motor_right.forward(0)
                sleep_ms(10)
                continue
            correction = steering_correction(last_position)
        else:
            lost_since = None
            last_position = position
            correction = steering_correction(position)

        correction = max(-MAX_CORRECTION, min(MAX_CORRECTION, correction))
        motor_left.forward(int(BASE_SPEED - correction))
        motor_right.forward(int(BASE_SPEED + correction))
        sleep_ms(10)

Smyčka běží s konstantní periodou 10 ms — stejně jako u regulace rychlosti motoru je i zde stabilní vzorkovací čas nutný pro korektní chování derivační složky. Klíčová je logika pro přerušenou čáru: robot po dobu LOST_LINE_TIMEOUT_MS pokračuje s poslední známou korekcí, což odpovídá pravidlu tratí povolujícím mezery do 7–10 cm.12 Teprve po překročení časového limitu se zastaví, místo aby nekontrolovaně vyjel z dráhy.

Tuto kostru je samozřejmě potřeba doladit na konkrétní hardware — hodnoty Kp, Ki, Kd i BASE_SPEED se budou lišit podle váhy robota, převodu motorů a přilnavosti pneumatik, přesně podle metodiky ladění P → I → D, kterou jsme popsali dříve. Řešení křižovatek a pravidla pravé ruky by pak vyžadovalo rozšíření o detekci "čára viditelná na obou krajních senzorech současně" a stavový automat nad touto smyčkou — což je dobré téma pro některý z dalších dílů série.

Závěr

Sledování čáry je disciplína, která na první pohled vypadá jako otázka jednoho jednoduchého senzoru a dvou motorů, ale ve skutečnosti spojuje přesně tolik oborů, kolik jich robotika nabízí — mechanickou konstrukci, optoelektroniku, regulaci a software. Právě proto je ideálním úvodním kamenem této série o robotických soutěžích: kdo zvládne dobře postavený a odladěný line follower, má základ pro naprostou většinu dalších autonomních disciplín. V příštích dílech se podíváme na další soutěžní kategorie, které na těchto základech stavějí.

Citovaná díla


  1. Stopař s překážkami – Line Follower enhanced, RoboTrip http://robotrip.cz/discipliny/stopar-s-prekazkami-line-follower-enhanced/ 

  2. Line Follower – Sledovač čáry, Robotický den 2018 http://robotickyden.cz/2018/rules/2018-Line_Follower-CZv1.pdf 

  3. Pravidla kategorie Stopař, OK1KPI https://old.ok1kpi.cz/view.php?cisloclanku=2010080004 

  4. 3pi+ Turtle Edition – robot platform with 32U4 controller and LP 75:1 motors, Botland.cz https://botland.store/pololu-3pi-line-follower/20760-3pi-turtle-edition-robot-platform-with-32u4-controller-and-lp-751-motors-pololu-4976-5904422382544.html 

  5. Malý robot pro sledování čáry (stavebnice), Pajenicko https://pajenicko.cz/maly-robot-pro-sledovani-cary 

  6. Stavebnice elektronického sledovače čáry D2-1, LaskaKit https://www.laskakit.cz/en/stavebnice-elektronickeho-sledovace-cary-d2-1/ 

  7. Arduino Line Follower robot – chassis by zz2012, Printables https://www.printables.com/model/836711-arduino-line-follower-robot-chassis 

  8. PID Line Follower Robot Chassis by Dash Daring, Printables https://printables.com/model/786922-pid-line-follower-robot-chassis/files 

  9. QTR Reflectance Sensors, Pololu Robotics and Electronics https://www.pololu.com/category/123/qtr-reflectance-sensors