Analýza vzdálenosti překážek v prostoru



Author:

Categories: Tutorials

Tagged with: | | | | |


Hlavním cílem této práce je analyzovat pohyb vozíčkáře v prostoru a posoudit vhodnost tras s ohledem na jeho potřeby. Zaměřuji se na šířku průjezdnosti (min. 900 mm) a dostatečný prostor pro otočení (min. 1500 mm). Pomocí algoritmů hledání cesty a komponenty Isovist hodnotím překážky, které by mohly pohyb omezovat, a testuji různé scénáře v půdorysech.

Popis algoritmů pro tvorbu cesty

Co to jsou a proč se používají?

Algoritmy pro hledání cesty pracují s grafy, což jsou matematické struktury složené z bodů (uzlů) a spojnic (hran). Tyto grafy mohou mít podobu mřížky (například čtvercové rozdělení prostoru) nebo jakékoliv jiné křivky.
Existuje několik různých algoritmů pro hledání nejkratší cesty (například: Dijkstra, A*, Breadth-First Search (BFS), Depth-First Search (DFS)). Nejznámějšími algoritmy jsou A* a Dijkstra.

Dijkstrův algoritmus

Dijkstra je neheuristický algoritmus, který zaručuje nalezení nejkratší cesty, ovšem je pomalejší než A*. Prochází všechny možné trasy a vždy hledá tu nejkratší. Hodí se pro situace, kde je důležité najít skutečně nejoptimálnější trasu bez jejího zjednodušení.

File:Dijkstras progress animation.gif: (210 × 210 pixels, file size: 128 KB, MIME type: image/gif, looped, 382 frames, 43 s). Online. In: Wikipedia: the free encyclopedia. San Francisco (CA): Wikimedia Foundation, 2001-. Dostupné z: https://en.m.wikipedia.org/wiki/File:Dijkstras_progress_animation.gif. [cit. 2025-02-08].

A (A star)*

A* je heuristický algoritmus. Jedná se o vylepšený algoritmus Dijkstra, který využívá odhad vzdálenosti k cíli. Je rychlejší, ale nemusí být tak přesný jako Dijkstra.

File:Astar progress animation.gif: (210 × 210 pixels, file size: 50 KB, MIME type: image/gif, looped, 195 frames, 24 s). Online. In: Wikipedia: the free encyclopedia. San Francisco (CA): Wikimedia Foundation, 2001-. Dostupné z: https://commons.wikimedia.org/wiki/File:Astar_progress_animation.gif. [cit. 2025-02-08].

Co je vlastně ta heuristika?

HEURISTIKA = chytré hádání.
Představte si, že hledáte nejrychlejší cestu ze školy domů. Místo toho, abyste zkoušeli úplně všechny možné trasy, použiješ svou zkušenost – víte, že kratší cesta bývá lepší a že rušné ulice můžou zdržovat. Takže si vyberete nejlepší trasu odhadem, aniž byste ji musel celou zkoušet.
To je heuristika! Pomáhá nám najít řešení rychleji, i když nemusí být vždycky úplně nejlepší.
Dijkstra
A*

Doporučuji rozkošné vysvětlení:

Introduction to the A* Algorithm. Online. From Red Blob Games. Dostupné z: https://www.redblobgames.com/pathfinding/a-star/introduction.html. [cit. 2025-02-08].

Použití v mé práci:

V mé analýze jsem použila komponentu Shortest Walk, která využívá právě Dijkstrův algoritmus.

1.    Hledání cesty na mřížce

Praktický návod:

Moje první myšlenka byla hledat tedy cestu na mřížce a tu následně implementovat na daný půdorys (to se později ukázalo, jako časově neefektivní řešení, ale k tomu později). Jak jsme si tedy už řekli, pro analýzu cesty je nutné vytvořit graf -> např. mřížku:

1. krok:

Komponenta “Square Grid”: Slouží k vytvoření pravidelné mřížky na základě zadaných parametrů (velikost buněk, počet řádků a sloupců). Tento grid jsem rozložila (Explode), obarvila na růžovo (Custom prewiew) a přetvořila na jednu spojitou křivku (Curve), kterou lze dále napojit do komponentu Shortest Walk.

2. krok:

Do komponenty je nutné napojit ještě dva body: Start a Cíl (Point), které jsem určila pomocí souřadnic (Construct Point“). Šlo by je také jednodušeji zadat ručně dosazením bodu na plochu v Rhinu bez určování přesných souřadnic (Set one point), čehož jsem také využila v budoucí tvorbě. Pro lepší přehlednost jsem body obarvila a doplnila je o příslušný text (START, CÍL).

3. krok:

Komponenta “Shortest Walk”. Výstup (“Shortest Walk” (W)) představuje křivku nejkratšího spojení trasy a (“Length” (L)) její délku. V tomto případě je vše v milimetrech.

2. Isovist a hledání cesty

Cestu jsem sice nalezla, ale její trasa v mřížce vytváří úskoky, které v případě hledání v dané situaci a v daném objektu nepůsobí zrovna ideálním dojmem, a tak jsem přikročila k vytváření cesty v grafu z předem stanovených křivek.

(Pro zajímavost, jsem to testovala také na generovaných labyrintech od Laurent Delrieu (https://discourse.mcneel.com/t/how-to-create-a-path-for-this-maze-without-having-deadends/110483/5, který je vytváří za pomocí pluginu Clliper.

Zde ovšem ukazuji implementaci scriptu na mnou vytvořeném labyrintu.

Ještě předtím jsem hledala i jiné způsoby jakými se při hledání cesty vydat, například přímo ve 3D prostoru za pomocí pluginu Fallcon a jeho Pathfinderu.

https://www.food4rhino.com/en/app/falcon

https://github.com/jingcheng-chen/AstarPathFinder?tab=readme-ov-file

Což je komponent využívající zase na druhou stranu A star algoritmus. Je velmi dobrý, ale v určitých situacích nepředvídavý.

Praktický návod:

1. krok:

Stačí mít tedy jakoukoliv cestu určenou křivkou (tedy graf), dva body k tomu a na ní už zvládneme (jak jsme si ukázali na příkladu mřížky) nalézt cestu.

2. krok:

Ale jak přikročit k druhému problému, a to určení vzdálenosti od překážky? Za tímto účelem jsem použila komponent Isovist.

3. krok:

Komponenta “Isovist”: Analyzuje viditelnost z určitého bodu v prostoru. Jednoduše řečeno vám pošle několik paprsků z určitého bodu a pokračuje, dokud buď nepřekročí stanovenou hranici anebo nenarazí do definovaného objektu. To znamená, že abych pomocí Isovistu mohla určit vzdálenost potřebuji bod. Tento bod představuje můj cestovatel.

Jedná se o bod na cestě, který díky definici parametru t a funkci reparametrize pohybuje od 0 do 1, od začátku do konce cesty. Ovšem v jednu chvíli se může vždy nacházet pouze na jednom místě.

4. krok:

Dále bylo nutné pro Isovist určit zmíněné objekty (hranice, překážky), které stačilo ve formě “Curve připojit do vstupu Obstacles (O) a maximální délku vyslaného paprsku, aby nám při neuzavřené hranici neputovala do nekonečna, a „ještě dál jako Buzz Rakeťák“. Na přiloženém slidu je nastavená 10 m do vstupu R tedy což nás už nemůže ani překvapit Radius.

5. krok:

Posledním krokem bylo určit kritickou vzdálenost, kterou bychom graficky znázornili. Díky kombinaci komponent Length a Smaller than jsme schopni tuto kritickou vzdálenost určit (zde je nastavena jako kritická hranice hodnota 0.5), zároveň díky komponentě Length jsme schopni získat nejmenší vzdálenost, která se zde nachází (popřípadě i tu největší), ta je vidět na žlutém panelu.

Paprsek, který bude mít menší délku, než stanovenou kritickou hranici se takto dokáže zbarvit do červena a zbylé paprsky se obarví zeleně. V případě, že spojení mezi komponenty, se rozzáří oranžově – znamená to pouze ten fakt, že takovýto krátký paprsek nebyl z daného bodu vyslán a tudíž všechny paprsky mají pouze jednu barvu, jak můžete vidět na screenu = všechny paprsky jsou zeleně, to znamená, že paprsky jsou delší než stanovená kritická délka. Může dojít i k opačné situaci = všechny paprsky by byli kratší tudíž černěné a náš vozíčkář by nedokázal projet.

Důležité je ještě zmínit, že bod je středem kružnice, která je vytvořena paprsky o max. délce, tedy rádiusem 10 m, a že tedy naše kritická délka je polovina průjezdné šířky (900/2 = 450 mm = 0.45 m).

Výsledek
Použití na jiném půdorysu

Vždycky je to tedy jenom jeden bod?

To je trochu omezující, že? Nevíte, zda tudy projedete, dokud tam nedojedete.
Co mě tedy logicky napadlo, je hodit na cestu těch bodů více a do každého dát Isovist. (Ano zní to trochu praštěně a také jsem nakonec došla k úplně jinému řešení, ale byl to logický postup, a tak ho tu přikládám):

Namísto jednoho bodu, jich máme najednou 100 a každý má kolem sebe svůj kruh z paprsků, každý nezávisle na sobě analyzuje a obarvuje svoje paprsky.

Nikdy se nemůžeme takto dostat k přesnému výsledku, protože to byste těch bodů neměli 100, ani 200 a kdo typuje 10 000 se také plete, ale nekonečno.

Přesto s takovýmto mužstvím vícero bodů, už má člověk mnohem lepší představu než pouze s jedním bodem.

Oba scripty s baked labyrintem najdete v souboru: DK_FA_CAD_isovisth path

3. Analýza plochy

Tak když jsem poznala limity samotného Isovistu přešla jsem k nové myšlence. Co ho s něčím nakombinovat a vytvořit analýzu celé dané plochy. Přeci nemusíme hledat cestu, pokud chceme vědět pouze kde všude je nedostatečná šířka chodeb. A tak jsem se vrhla na plugin DeCodingSpaces.

https://toolbox.decodingspaces.net/category/analysis/


DeCodingSpaces je plugin určený pro analýzu převážně městského prostoru. Tento plugin nabízí neuvěřitelně širokou škálu komponent. Obsahuje vlastní Isovist i Isovist3D, což umožňuje analyzovat viditelnost v prostoru jak ve 2D, tak ve 3D. Kromě toho umí pracovat s Analysis Grid, což je analytická mřížka, která umožňuje hodnotit různé prostorové charakteristiky v pravidelném rastru. A právě tuto funkci jsem využila pro svou analýzu.

Praktický návod:

1.krok:

Grid lze nastavit do určitého obdélníku, který nastavíme jako první. Poté je potřeba zadat resolution (Cell size (CS)), ta určí, jak hustě bude rastr analýzy v obdélníku vytvořen.

Pro hodnotu 0.6 (čtverec 0.6 x 0.6 m):               
Pro hodnotu 1 (čtverec 1×1 m):

Čím menší tím i menší jednotlivé čtverce gridu a tím také přesnější analýza, ovšem pro výpočet náročnější. (Dalo by se případně rovnou zvolit resolation 0.9, to by mohlo představovat průjezdnou šířku. Ovšem to, jak hustá má být síť být, záleží také na daném půdorysu. Můžeme si všimnout, že pro hodnotu 1 nejsou některé chodby vůbec rastrem vyplněny.).

2. krok:

Dále je potřeba společně s ohraničujícím obdélníkem zapojit do vstupu Obstacal lines (OL) křivky zdí tvořící překážky. A nakonec přidat do prostoru bod, který určí, jestli grid bude uvnitř nebo vně zdí.

3. krok:

Pro lepší názornost jsem do výstupu Aalysis grid zapojila Cirle. Pro který když nastavíme rádius 0.45 bude přesdtavovat kruh o průměru 900 mm a když 0.75 – kruh o průměru 1500 mm.

Podstatné je, jestli “Circle zapojit do výstupu Analysis Points (AP) nebo Grid Cells (GC). Osobně doporučuji AP, které vytvoří kruh vždy ze středu čtverce gridu, na rozdíl od GC, který by jej vytvořil z každé hrany.

GC: 
AP:

4. krok:

Jak už jsem zmínila, i tentokrát využijeme služby komponenty Isovist. Nejdůležitější je zapojení překážek do vstupu Obtacle lines (OL), požadovaného vektoru do Viewing direction (VD), ten nám určuje na jaké rovině hodnoty analyzujeme a Viewing range (VR), která nám určí do jaké maximální vzdálenosti od bodu má být prostor analyzován (přesněji jednotlivé čtverce v tomto případě už kruhy.

5. krok:

Plugin umožňuje analyzovat prostor dle několika kritérií. Pro vyhodnocení nejmenší vzdálenosti od překážky jsem zvolila Min Radial, abych zjistila nejmenší vzdálenost od středu kruhu k překážce. Ale jde samozřejmě analyzovat prostor různě, a to díky komponentě Value list. Při dvojkliku na této komponent se otevře panel, do kterého napíšeme:

Area = 0
Area (Dist Weighted) = 1
Perimeter = 2
Compactness = 3
Circularity = 4
ConvexDeficiency = 5
Occlusivity = 6
Min Radial = 7
Max Radial = 8
Mean Radial = 9
Standard Deviation = 10
Variance = 11
Skewness = 12
Dispersion = 13
Elongation = 14
Drift Magnitude = 15
Drift Angle = 16

6. krok:

Script jsem pro grafické znázornění doplnila o gradient a legendu 10 hodnotách.

V tuto chvíli už bych mohla být s výsledkem spokojená, ale výsledky z analýzy neukazují, kde přesně už je kritická šířka pro průjezd překročena a kde prozatím ne. Lze to vyvodit to ano, ale přesné to není.

Přehlednost kruhů jsem chtěla zachovat a rozhodla jsem se tudíž pouze vyměnit gradient za systém zbarvení kruhů podle toho, zda už jsou moc blízko překážkám či nikoliv.

Použití Analysis grid i Isovist zůstává stejné a pouze závěrečná část skriptu je nahrazena. Za pomocí nám už známého komponentu Smaller than jsem určila kritickou vzdálenost a nastavila pro menší hodnoty barevnost kruhů červenou a pro ostatní hodnoty zelenou.

Resolation 0.6
Resolation 0.3

Pro ještě lepší přesnost nastavíme resolation (Cell size (CS)) u komponenty Analysis Grid na menší číslo.

Po přiblížení jsou vidět jednotlivé kruhy přestavující průjezdnou šířku.

Resolation 0.6
Resolation 0.3
Oba scripty je možné najít v souboru DK_FA_CAD_isovist field.gh

Poděkování

Ráda bych poděkovala tvůrcům pluginů DeCoodigSpaces a Shortest Walk za jejich vytvoření. https://www.food4rhino.com/en/app/shortest-walk

Také děkuji mé kamarádce Jolaně za poskytnutí půdorysu k nezávislému testování.

Zadání více samostatných ploch k analýze – CÍL
Zadání více samostatných ploch k analýze – CHYBNÉ

Doporučení

U tohoto příkladu je krásně vidět, ještě malou drobnost. Při používání analýzy doporučuji mít jednotnou plochu a pokud jich je více tak analyzovat postupně. Lze samozřejmě provádět analýzu pro více určujících bodů, ale můžeme tím program zmást a výsledek tak může být chybný.

Závěr

V této práci jsem se původně zaměřila na analýzu vzdáleností k překážkám z určitého místa na cestě pomocí komponenty Isovist, která se běžně používá ke zkoumání viditelnosti. Postupně jsem ale přešla k plošné analýze, při níž jsem vytvořila mřížku pokrývající celý zkoumaný prostor. Díky tomu jsem mohla lépe porovnat různé části analyzované plochy a zjistit, jak rozmístění překážek ovlivňuje pohyb a dostupnost.

Tento přístup poskytl podrobnější pohled na to, jak jsou překážky v prostoru rozmístěné a jak mohou omezovat průchodnost. Výsledky mohou být užitečné například při navrhování a úpravách veřejných prostranství nebo samotných budov. A nejlepší na tom je, že pomocí pluginu DecodingSpaces mohu analyzovat nejen minimální vzdálenost, ale i další hodnoty, jako je například plocha.