Operácie

Kobuki: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Balogh (diskusia | príspevky)
 
(2 medziľahlé úpravy od rovnakého používateľa nie sú zobrazené.)
Riadok 252: Riadok 252:
== Kinematika diferenciálneho podvozku ==
== Kinematika diferenciálneho podvozku ==


Robot má dve kolesá vzdialené ''L'' = 0,23 m. Stredom medzi nimi je referenčný bod ''P'', ktorého polohu <math display="inline">(x, y)</math> a orientáciu <math display="inline">\theta</math> chceme sledovať.
Robot má dve kolesá vzdialené ''L'' = 0,23 m. Stredom medzi nimi je referenčný bod ''P'', ktorého polohu (x, y) a orientáciu θ chceme sledovať.


<div id="fig:kinematika" class="figure">


V každom časovom kroku (medzi vzorkou <math display="inline">k{-}1</math> a ''k'') enkodéry napočítajú <math display="inline">\Deltatick_L</math> a <math display="inline">\Deltatick_R</math> impulzov. Dráha jednotlivých kolies je: <math display="block">d_L = \Deltatick_L · c_f,      d_R = \Deltatick_R · c_f,
\label{eq:dl_dr}</math> kde ''c<sub>f</sub>'' = 0,000085292 m tick<sup>−1</sup> je prepočtový faktor.


V každom časovom kroku (medzi vzorkou ''k-1'' a ''k'') enkodéry napočítajú ''Δtick_L'' a ''Δtick_R'' impulzov. Dráha jednotlivých kolies je: ''d_L = Δtick_L · c_f,  d_R = Δtick_R · c_f'',
kde ''c<sub>f</sub>'' = 0,000085292 m tick<sup>−1</sup> je prepočtový faktor.
<div id="fig:kinematika" class="figure"></div>
'''Obr. 1:''' ''Kinematický model diferenciálneho podvozku. d<sub>L</sub>, d<sub>R</sub> sú dráhy kolies, d<sub>c</sub> je stredná dráha bodu P.''
'''Obr. 1:''' ''Kinematický model diferenciálneho podvozku. d<sub>L</sub>, d<sub>R</sub> sú dráhy kolies, d<sub>c</sub> je stredná dráha bodu P.''


Stredná dráha (pohyb bodu ''P'') a zmena orientácie sú: <math display="block">\boxed{d_c = \frac{d_L + d_R}{2}},      \boxed{\Delta\theta = \frac{d_R - d_L}{L}}.
Stredná dráha (pohyb bodu ''P'') a zmena orientácie sú:  
\label{eq:dc_dtheta}</math>
d_c = (d_L + d_R)/2,       
  Δθ = (d_R - d_L)/L.


Intuitívne: ak sa obe kolesá pohnú rovnako (<math display="inline">d_L = d_R</math>), robot ide rovno (<math display="inline">\Delta\theta = 0</math>). Ak sa pravé koleso pohne viac, robot zatáča doľava (<math display="inline">\Delta\theta > 0</math> v štandardnej konvencii).
Intuitívne: ak sa obe kolesá pohnú rovnako (d_L = d_R), robot ide rovno (Δθ = 0). Ak sa pravé koleso pohne viac, robot zatáča doľava (Δθ > 0 v štandardnej konvencii).


== Aktualizácia polohy (dead reckoning) ==
== Aktualizácia polohy (dead reckoning) ==


Polohu robota aktualizujeme iteratívne. Používame ''aproximáciu stredným uhlom'' (second-order midpoint method), ktorá je výrazne presnejšia než jednoduchá Eulerova metóda: <math display="block">\boxed{
Polohu robota aktualizujeme iteratívne. Používame ''aproximáciu stredným uhlom'' (second-order midpoint method), ktorá je výrazne presnejšia než jednoduchá Eulerova metóda:  
\begin{aligned}
 
\theta_{mid} &= \theta(k{-}1) + \frac{\Delta\theta}{2} \\[4pt]
θ_mid = \theta(k-1) + Δθ/2
x(k) &= x(k{-}1) + d_c · \cos(\theta_{mid}) \\[2pt]
  x(k) = x(k-1) + d_c · cos(θ_mid)  
y(k) &= y(k{-}1) + d_c · \sin(\theta_{mid}) \\[2pt]
  y(k) = y(k-1) + d_c · sin(θ_mid)
\theta(k) &= \theta(k{-}1) + \Delta\theta
  θ(k) = θ(k-1) + Δθ
\end{aligned}
}
\label{eq:update}</math>


Počiatočné podmienky: <math display="inline">x(0) = 0</math>, <math display="inline">y(0) = 0</math>, <math display="inline">\theta(0) = 0</math> (robot smeruje v osi ''x'').
Počiatočné podmienky: x(0) = 0, y(0) = 0, θ(0) = 0 (robot smeruje v osi ''x'').


== Tri zdroje orientácie ==
== Tri zdroje orientácie ==

Aktuálna revízia z 19:16, 6. máj 2026

Mapovanie bludiska mobilným robotom

Cvičenie z mobilnej robotiky — Kobuki + RPlidar A1


Cieľ cvičenia

Cieľom cvičenia je ručne previesť mobilného robota cez bludisko, zaznamenať dáta z odometrie a laserového diaľkomera (lidaru), a následne z nameraných dát zrekonštruovať:

  1. trajektóriu robota v rovine xy (dead reckoning z enkodérov a gyroskopu),
  2. plánik bludiska (mračno bodov z lidaru transformované do globálnych súradníc).

Spracovanie dát vykonáte offline v prostredí Matlab alebo Python na základe dvoch logovacích súborov: robot.log (odometria) a laser.log (lidar).

Technický opis zariadení

Mobilný robot Kobuki

Kobuki je kompaktná mobilná platforma s diferenciálnym podvozkom — má dve nezávisle poháňané kolesá a jedno voľnobežné (kastorové) koleso. Pohyb robota sa meria inkrementálnymi optickými enkodérmi na oboch kolesách a jednoosovým gyroskopom.

Technické parametre robota Kobuki
Kategória Parameter Hodnota
Rozmery Priemer tela 351.5 mm (kruh)
Výška 124.8 mm
Pohon a kinematika Typ podvozku diferenciálny (2 kolesá + kastor)
Rozchod kolies (wheelbase) L = 230 mm
Polomer kolesa r = 35 mm
Šírka kolesa 21 mm
Dynamika Max. translačná rýchlosť 70 cm s−1
Max. rotačná rýchlosť 180°/s (gyroskop spoľahlivý do 110°/s)
Enkodéry Rozlíšenie enkodéra 52 tick/ot. enkodéra
Prevodový pomer 6545 : 132 = 49,5833
Ticky na otáčku kolesa 52 × 49,5833 = 2578,33 tick/ot.
Registre enkodérov 16-bit unsigned (0–65 535)
Prepočtové konštanty Tick → metre cf = 0,000085292 m tick−1
Ekvivalent ≈ 11,7 tick/mm
Gyroskop Typ 1-osový, továrensky kalibrovaný
Rozsah do 110°/s
Senzory a bezpečnosť Nárazníky (bumpers) ľavý, stredný, pravý
Senzory útesu (cliff) ľavý, stredný, pravý
Senzor poklesu kolesa ľavý, pravý
Dátová frekvencia 50 Hz
Pripojenie k PC USB alebo RX/TX piny
Ochrana motora vypnutie pri
Napájanie Batéria Li-Ion 14.8 V, 2200 mAh
Výdrž 3/7 h (malá/veľká batéria)
Nosnosť 5 kg (tvrdá podlaha) / 4 kg (koberec)

Laserový diaľkomer RPlidar A1

RPlidar A1 je 2D laserový skener (lidar), ktorý rotáciou laserového lúča okolo zvislej osi sníma vzdialenosti k prekážkam v celom rozsahu 360°. Senzor je upevnený na robot v strede medzi kolesami (offset ).

Technické parametre lidaru RPlidar A1
Kategória Parameter Hodnota
Rozmery a hmotnosť Rozmery 98,5 × 70 × 60 mm
Hmotnosť 170 g
Napájanie externé (z robota)
Rozsah Vzdialenosť 0.15 – 12 m (biele objekty)
Uhlový rozsah 0 – 360°
Rozlíšenie vzdialenosti < 0,5 mm
Rýchlosť Uhlové rozlíšenie < 1°
Doba jedného merania 0.5 ms
Vzorkovacia frekvencia 2000 – 2010 Hz
Rýchlosť otáčania (scan rate) 1 – 10 Hz, typicky 5.5 Hz
Kvalita merania Rozsah hodnôt 0 – 15 (vyššia = lepšia)

Postup merania

  1. Umiestnite robota na štartovaciu pozíciu pred vstupom do bludiska. Zapnite robota a spustite záznam dát.
  2. Pomocou joysticku preveďte robota cez celé bludisko. Prejdite aj všetky slepé uličky — cieľom je získať kompletný obraz o geometrii bludiska.
  3. Pohybujte sa plynulo, bez prudkých zmien smeru. Pri otáčaní neprekračujte rotačnú rýchlosť 110°/s (limit gyroskopu).
  4. Po prechode bludiskom zastavte robota a ukončite záznam.
  5. Z robota stiahnite dva logovacie súbory: robot.loglaser.log.

Formát záznamových súborov

Súbor robot.log — odometria

Každý riadok obsahuje jedno meranie, hodnoty sú oddelené medzerami:

<timestamp_us> <enc_left> <enc_right> <gyro_deg>

Štruktúra súboru robot.log
Stĺpec Typ Popis
1 — Timestamp uint64 Čas merania v mikrosekundách
2 — Enc. Left uint16 Kumulatívny počet tickov ľavého enkodéra (0–65 535)
3 — Enc. Right uint16 Kumulatívny počet tickov pravého enkodéra (0–65 535)
4 — Gyro float Uhol z gyroskopu v stupňoch (-180 až +180)

Príklad záznamov:

 3067284773  1288  58777  174.98
 3067301111  1288  58777  174.98
 3067323915  1288  58777  174.98

Frekvencia záznamu zodpovedá dátovej frekvencii robota, t. j. približne 50 Hz.

Súbor laser.log — lidar

Každý riadok obsahuje jedno meranie laserového lúča:

<timestamp_us> <distance_mm> <angle_deg> <quality>

Štruktúra súboru laser.log
Stĺpec Typ Popis
1 — Timestamp uint64 Čas merania v mikrosekundách
2 — Distance float Vzdialenosť k prekážke v milimetroch
3 — Angle float Uhol laserového lúča v stupňoch (0–360), v smere hodinových ručičiek od prednej časti robota
4 — Quality int Kvalita merania (0–15); 0 = neplatné

Príklad záznamov:

 3067236764  3713.75  351.047   15
 3067237463  3666.75  352.438   15
 3067237467  3708.75  353.812   15

Jedna kompletná otáčka lidaru (sken) obsahuje typicky okolo 260 bodov. Pri scan rate cca 7,8 Hz to zodpovedá vzorkovacej frekvencii cca 2000 Hz.

Teoretický základ — ideálny prípad

V tejto kapitole odvodíme všetky vzťahy za predpokladu, že dáta sú bezchybné: enkodéry nepretekajú, gyroskop nedriftuje a časy sú presne synchronizované. Praktické komplikácie riešime v kapitole 6.

Kinematika diferenciálneho podvozku

Robot má dve kolesá vzdialené L = 0,23 m. Stredom medzi nimi je referenčný bod P, ktorého polohu (x, y) a orientáciu θ chceme sledovať.


V každom časovom kroku (medzi vzorkou k-1k) enkodéry napočítajú Δtick_LΔtick_R impulzov. Dráha jednotlivých kolies je: d_L = Δtick_L · c_f, d_R = Δtick_R · c_f, kde cf = 0,000085292 m tick−1 je prepočtový faktor.

Obr. 1: Kinematický model diferenciálneho podvozku. dL, dR sú dráhy kolies, dc je stredná dráha bodu P.

Stredná dráha (pohyb bodu P) a zmena orientácie sú:

d_c = (d_L + d_R)/2,      
 Δθ = (d_R - d_L)/L.

Intuitívne: ak sa obe kolesá pohnú rovnako (d_L = d_R), robot ide rovno (Δθ = 0). Ak sa pravé koleso pohne viac, robot zatáča doľava (Δθ > 0 v štandardnej konvencii).

Aktualizácia polohy (dead reckoning)

Polohu robota aktualizujeme iteratívne. Používame aproximáciu stredným uhlom (second-order midpoint method), ktorá je výrazne presnejšia než jednoduchá Eulerova metóda:

θ_mid = \theta(k-1) + Δθ/2
 x(k) = x(k-1) + d_c · cos(θ_mid) 
 y(k) = y(k-1) + d_c · sin(θ_mid)
 θ(k) = θ(k-1) + Δθ

Počiatočné podmienky: x(0) = 0, y(0) = 0, θ(0) = 0 (robot smeruje v osi x).

Tri zdroje orientácie

Pre výpočet zmeny uhla máme tri možnosti:

A) Len enkodéry

Uhol sa počíta podľa rovnice [eq:dc_dtheta]. Jednoduché, ale citlivé na šmýkanie kolies.

B) Len gyroskop

Gyroskop Kobuki dáva priamo absolútny uhol (firmvér integruje uhlovú rýchlosť interne). Zmenu uhla medzi dvoma vzorkami vypočítame ako: Syntaktická analýza (parsing) neúspešná (syntaktická chyba): {\displaystyle \Delta\theta_{gyro} = [gyro(k) - gyro(k{-}1)] · \frac{\pi}{180} \label{eq:gyro_delta}} s korekciou pretečenia cez Syntaktická analýza (parsing) neúspešná (syntaktická chyba): {\textstyle ±180^{\circ}} (pozri sekciu 6.2). Táto metóda je odolná voči šmyku kolies, ale dlhodobo trpí driftom gyroskopu.

C) Komplementárny filter

Fúzia oboch zdrojov jedným parametrom : Syntaktická analýza (parsing) neúspešná (neznáma funkcia „\boxed“): {\displaystyle \boxed{\Delta\theta = \alpha · \Delta\theta_{gyro} + (1 - \alpha) · \Delta\theta_{enc}} \label{eq:compfilter}}

Parameter vyjadruje “dôveru” v gyroskop. Typicky — gyroskop je na krátkych škálach presnejší, enkodéry kompenzujú jeho dlhodobý drift. Na ladenie použite uzavretú trasu — správne Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \alpha} minimalizuje odchýlku koncovej polohy od štartu.

Transformácia lidarových bodov do mapy

Lidar meria vzdialenosť d v smere uhla Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \alpha} (v stupňoch, rastúci v smere hodinových ručičiek od prednej časti robota). Cieľom je transformovať tento bod zo súradníc robota do globálnych (mapových) súradníc.

Priama transformácia z polárnych súradníc lidaru do mapy: Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\displaystyle \boxed{ \begin{aligned} \alpha_{world} &= \theta - \alpha · \frac{\pi}{180} \\[4pt] x_{global} &= x_R + \frac{d}{1000} · \cos(\alpha_{world}) \\[2pt] y_{global} &= y_R + \frac{d}{1000} · \sin(\alpha_{world}) \end{aligned} } \label{eq:lidar_transform}} kde je orientácia robota v radiánoch, Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \alpha} je uhol lidaru v stupňoch (CW), d je vzdialenosť v mm a Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle (x_R, y_R)} je poloha robota v metroch. Znamienko mínus pred Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \alpha} konvertuje smysel otáčania z CW na matematicky kladný (CCW).

Riešenie praktických problémov

Pretečenie enkodérov

Enkodéry Kobuki sú 16-bitové bezznamienkové čítače s rozsahom Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle 65 535} . Keď čítač dosiahne Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle 65 535} a koleso sa ďalej otáča, hodnota preskočí na Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle 0} (a opačne pri pohybe vzad). V surovom rozdiele Syntaktická analýza (parsing) neúspešná (neznáma funkcia „\Deltatick“): {\textstyle \Deltatick = enc(k) - enc(k{-}1)} sa to prejaví obrovským skokom.

Korekcia: Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\displaystyle \Deltatick_{cor} = \begin{cases} \Deltatick - 65536 & \text{ak } \Deltatick > 32768 \\ \Deltatick + 65536 & \text{ak } \Deltatick < -32768 \\ \Deltatick & \text{inak} \end{cases} \label{eq:wrap_enc}}

Šablóna:Upozornenie

Ukážka v Matlabu / Pythone:

dTick = enc(k) - enc(k-1);
if dTick &gt; 32768
    dTick = dTick - 65536;
end
if dTick &lt; -32768
    dTick = dTick + 65536;
end
dTick = enc[k] - enc[k-1]
if dTick > 32768:
    dTick -= 65536
if dTick < -32768:
    dTick += 65536

Pretečenie gyroskopu

Gyroskop vracia uhol v rozsahu Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle (-180^{\circ}, +180^{\circ}]} . Pri prechode cez Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle ±180^{\circ}} hodnota skočí, napr. z  na Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle -179^{\circ}} . To nie je skutočná zmena o Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle 358^{\circ}} , ale o Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle +2^{\circ}} .

Korekcia: Syntaktická analýza (parsing) neúspešná (neznáma funkcia „\Deltagyro“): {\displaystyle \Deltagyro_{cor} = \begin{cases} \Deltagyro - 360 & \text{ak } \Deltagyro > 180 \\ \Deltagyro + 360 & \text{ak } \Deltagyro < -180 \\ \Deltagyro & \text{inak} \end{cases} \label{eq:wrap_gyro}}

dGyro = gyro(k) - gyro(k-1);
if dGyro &gt; 180
    dGyro = dGyro - 360;
end
if dGyro &lt; -180
    dGyro = dGyro + 360;
end
dTheta = dGyro * pi / 180;
dGyro = gyro[k] - gyro[k-1]
if dGyro &gt; 180:
    dGyro -= 360
if dGyro &lt; -180:
    dGyro += 360
dTheta = dGyro * math.pi / 180

Synchronizácia časových značiek

Odometria sa zaznamenáva s frekvenciou Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle ≈ 50 Hz} , lidar produkuje Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle ≈ 2000} bodov za sekundu. Časové značky pochádzajú z rovnakých hodín, ale nie sú identické. Pre každý lidarový bod musíme nájsť najbližšiu polohu robota.

Efektívne riešenie — paralelný prechod oboma logmi s jedným ukazovateľom:

ridx = 1;
for i = 1:length(laser_ts)
    while ridx &lt; N &amp;&amp; ...
      abs(robot_ts(ridx+1) ...
        - laser_ts(i)) &lt; ...
      abs(robot_ts(ridx) ...
        - laser_ts(i))
        ridx = ridx + 1;
    end
    % robot_ts(ridx) je 
    % najblizsi k laser_ts(i)
end
ridx = 0
for i in range(len(laser_ts)):
    while ridx &lt; N-1 and \
      abs(robot_ts[ridx+1] 
        - laser_ts[i]) &lt; \
      abs(robot_ts[ridx] 
        - laser_ts[i]):
        ridx += 1
    # robot_ts[ridx] je 
    # najblizsi k laser_ts[i]

Tento algoritmus má lineárnu zložitosť Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle O(N+M)} , pretože ukazovateľ ridx sa nikdy nevracia — funguje to, pretože oba logy sú chronologicky usporiadané.

Filtrovanie neplatných lidarových meraní

Nie všetky lidarové body sú platné. Pred spracovaním je nutné vyradiť:

  • merania s nulovou vzdialenosťou () — lidar nezachytil odraz,
  • merania s nízkou kvalitou (odporúčame prah Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \text{quality} ≥ 10} ),
  • voliteľne merania mimo dosahu senzora (Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle d > 12000 mm} ).
if laser_dist(i) &lt; 20 || ...
   laser_qual(i) &lt; 10
    continue;
end
if dist < 20 or quality < 10:
    continue

Postup spracovania dát

Tu je celkový algoritmus zhrnutý do piatich krokov. Kúsky kódu z predchádzajúcich sekcií spojte do jedného skriptu.

  1. Načítajte oba súbory.

    R = load('robot.log');
    robot_ts = R(:,1);
    encL = R(:,2); encR = R(:,3);
    gyro = R(:,4);
    
    L = load('laser.log');
    laser_ts = L(:,1);
    laser_d  = L(:,2);
    laser_a  = L(:,3);
    laser_q  = L(:,4);
    
    import numpy as np, math
    R = np.loadtxt('robot.log')
    robot_ts = R[:,0]
    encL = R[:,1]; encR = R[:,2]
    gyro = R[:,3]
    
    L = np.loadtxt('laser.log')
    laser_ts = L[:,0]
    laser_d  = L[:,1]
    laser_a  = L[:,2]
    laser_q  = L[:,3]
    
  2. Vypočítajte trajektóriu robota (sekcie 5.15.2).

    Pre každý krok Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle k = 2, \ldots, N} :

    1. Vypočítajte Syntaktická analýza (parsing) neúspešná (neznáma funkcia „\Deltatick“): {\textstyle \Deltatick_L} , Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \Deltatick_R} s korekciou pretečenia (rov. [eq:wrap_enc]).

    2. Prepočítajte na dráhy d_L, d_R (rov. [eq:dl_dr]).

    3. Vypočítajte d_cSyntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \Delta\theta} (rov. [eq:dc_dtheta] alebo [eq:gyro_delta] alebo [eq:compfilter]).

    4. Aktualizujte Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle x(k)} , , Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \theta(k)} (rov. [eq:update]).

    Výsledkom sú polia robot_x, robot_y, robot_theta o dĺžke N.

  3. Transformujte lidarové body do mapy (sekcia 5.4).

    Pre každé platné meranie i (po filtrovaní, sekcia 6.4):

    1. Nájdite najbližšiu polohu robota k podľa timestampu (sekcia 6.3).

    2. Aplikujte transformáciu (rov. [eq:lidar_transform]) s použitím Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle (x_R, y_R, \theta)} z kroku k.

    3. Uložte globálne súradnice bodu do poľa mapy.

  4. Vykreslite výsledok.

    figure; hold on; axis equal;
    grid on;
    
    % Steny bludiska
    plot(map_x, map_y, '.', ...
         'Color', [.5 .5 .5], ...
         'MarkerSize', 1);
    
    % Trajektoria
    plot(robot_x, robot_y, ...
         'b-', 'LineWidth', 2);
    
    % Start a ciel
    plot(0, 0, 'go', ...
         'MarkerSize', 10, ...
         'MarkerFaceColor', 'g');
    plot(robot_x(end), ...
         robot_y(end), 'rs', ...
         'MarkerSize', 8, ...
         'MarkerFaceColor', 'r');
    
    xlabel('x [m]');
    ylabel('y [m]');
    title('Mapa bludiska');
    legend('Steny', 'Trajektoria', ...
           'Start', 'Ciel');
    
    import matplotlib.pyplot as plt
    
    fig, ax = plt.subplots()
    ax.set_aspect('equal')
    ax.grid(True)
    
    # Steny bludiska
    ax.plot(map_x, map_y, '.',
            color='gray',
            markersize=0.5)
    
    # Trajektoria
    ax.plot(robot_x, robot_y,
            'b-', linewidth=2)
    
    # Start a ciel
    ax.plot(0, 0, 'go',
            markersize=10)
    ax.plot(robot_x[-1],
            robot_y[-1], 'rs',
            markersize=8)
    
    ax.set_xlabel('x [m]')
    ax.set_ylabel('y [m]')
    ax.set_title('Mapa bludiska')
    ax.legend(['Steny',
               'Trajektoria',
               'Start', 'Ciel'])
    plt.show()
    
  5. Porovnajte tri metódy orientácie.

    Vykreslite trajektóriu a priebeh uhla Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \theta(t)} pre všetky tri prístupy (A, B, C) do spoločného grafu. Diskutujte rozdiely.

Kontrolné otázky a bonusové úlohy

  1. Prečo používame stredný uhol a nie Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \theta(k{-}1)} ? Aká chyba by vznikla pri čistej Eulerovej metóde?
  2. Čo sa stane, ak vynecháte korekciu pretečenia enkodérov? Vyskúšajte a porovnajte výsledky.
  3. Pomocou mapy z lidaru odmerajte rozmery bludiska. Porovnajte so skutočnosťou.
  4. Dokážete z lidarových dát overiť prepočtovú konštantu c_f? Pomôcka: lidar meria vzdialenosti v milimetroch absolútne — nezávisí od c_f. Nájdite vzdialenú stenu viditeľnú zo začiatku aj z konca trasy a porovnajte posun nameraný lidarom s počtom tickov enkodéra.
  5. (Bonus) Implementujte jednoduchú mriežkovú mapu (occupancy grid) a porovnajte s mračnom bodov.
  6. (Bonus) Čo sa stane s mapou pri dlhšej jazde (desiatky metrov)? Prečo sa steny “rozmazávajú”? Aké riešenie ponúka SLAM?

Príloha: Užitočné konštanty a vzorce

Rozchod kolies L = 0,230 m
Prepočtový faktor cf = 0,000085292 m tick−1
Pretečenie enkodérov 16-bit: rozsah Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle 0}Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle 65 535} , prah Syntaktická analýza (parsing) neúspešná (syntaktická chyba): {\textstyle ±32 768}
Pretečenie gyroskopu rozsah Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle ±180^{\circ}} , prah Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle ±180^{\circ}}
Konverzia stupne → radiány Syntaktická analýza (parsing) neúspešná (MathML s fallbackom na SVG alebo PNG (odporúčané pre moderné prehliadače a nástroje pre zjednodušenie prístupu): Neplatná odpověď („Math extension cannot connect to Restbase.“) od serveru „https://wikimedia.org/api/rest_v1/“:): {\textstyle \alpha_{rad} = \alpha_{\deg} · \pi / 180}
Konverzia mm → m