Point Cloud Library (PCL) je C++ knihovna pro 2D a 3D zpracování mračen bodů (point cloud) a obrazů. Byla vydána pod licencí BSD s otevřeným zdrojovým kódem. Knihovna nabízí řadu funkcí a algoritmů pro filtrování, rekonstrukci povrchu, registraci, model fitting, segmentaci, rozpoznávání objektů a odhad geometrických vlastností objektů (features). Každý modul je implementován jako menší samostatná knihovna, kterou lze kompilovat samostatně (například libpcl_filters, libpcl_features, libpcl_surface…). PCL má vlastní datový formát pro mračna bodů PCD (Point Cloud Data), ale umožňuje také načítání a ukládání datových sad v mnoha dalších formátech.

PCL pro svou funkčnost vyžaduje několik knihoven třetích stran, které musí být nainstalovány. Většina matematických operací je implementována s využitím knihovny Eigen. Vizualizační modul pro 3D mračna bodů je založen na VTK. Boost je využíván pro sdílené ukazatele a knihovna FLANN pro rychlé hledání nejbližších sousedů (k-nearest neighbor search). Další knihovny jako jsou QHULL, OpenNI nebo Qt jsou volitelné a rozšiřují PCL o další funkce.

PCL je multiplatformní software, který běží na nejpoužívanějších operačních systémech: Linux, Windows, macOS a Android. Knihovna je plně integrována do robotického operačního systému (ROS) a poskytuje podporu pro knihovny OpenMP a Intel Threading Building Blocks (TBB) pro vícejádrový paralelismus.

Knihovna je neustále aktualizována a rozšiřována a její využití v různých odvětvích stále roste. PCL se například se třemi projekty účastnila iniciativy Google Summer of Code 2020. Jedním z nich bylo rozšíření PCL pro použití s Pythonem pomocí Pybind11.

Na webových stránkách PCL je k dispozici velké množství příkladů a cvičení buď jako zdrojové soubory C++, nebo jako tutoriály s podrobným popisem a vysvětlením jednotlivých kroků.

Využití Point cloud library je široce používána v mnoha různých oblastech, zde je několik příkladů:

spojování 3D mračen bodů dohromady rozpoznávání 3D objektů podle jejich geometrického tvaru filtrace a vyhlazení zašumělých dat vytváření povrchu z mračen bodů zarovnání dříve zachyceného modelu objektu s nově snímanými daty rozpoznávání klastru a odhad pozice 6DOF stream mračen bodů do mobilních zařízení s vizualizací v reálném čase

Knihovny třetích stran PCL vyžaduje pro svou instalaci a plnou funkčnost několik knihoven třetích stran, které jsou uvedeny níže. Některé knihovny jsou volitelné a rozšiřují PCL o další funkce. Pro samotné sestavení PCL je zapotřebí software CMake build (http://www.cmake.org/) alespoň ve verzi 3.5.0.

Povinné knihovny:

Boost alespoň ve verzi 1.46.1. Tato sada C++ knihoven se používá pro vytváření vláken a především pro sdílené ukazatele, díky kterým není nutné znovu kopírovat data, která již v systému jsou. Eigen je vyžadován alespoň ve verzi 3.0.0. Jedná se o open-source knihovnu pro lineární algebru (matice, vektory). Většina matematických operací (optimalizovaných SSE) v PCL je implementována pomocí Eigen. FLANN ve verzi alespoň 1.6.8. Jedná se o knihovnu, která provádí rychlé přibližné hledání nejbližších sousedů v prostorech s vysokou dimenzí. V PCL je důležitá především v modulu kdtree pro rychlé hledání nejbližších sousedů. VTK – Visualization ToolKit alespoň ve verzi 5.6.1. Multiplatformní softwarový systém pro vykreslování 3D mračen bodů, modelování, zpracování obrazu, zobrazování objemových dat. Používá se ve vizualizačním modulu pro vykreslování a vizualizaci mračen bodů.

Volitelné knihovny, které umožňují některé další funkce:

QHULL ve verzi >= 2011.1 implementuje výpočet konvexního obalu, Delaunay triangulaci, Voronoiův diagram atd. V PCL se používá pro konvexní / konkávní rozklad povrchu. OpenNI ve verzi >= 1.1.0.25 poskytuje jednotné rozhraní pro senzory snímající hloubku. Používá se k načítání mračen bodů ze zařízení. Qt ve verzi >= 4.6 je multiplatformní C++ framework používaný pro vývoj aplikací s grafickým uživatelským rozhraním (GUI). Googletest ve verzi >= 1.6.0 je testovací knihovna pro C++. V PCL se používá k sestavení testovacích jednotek.

Formát souboru PCD PCD (Point Cloud Data) je formát souboru pro ukládání 3D mračen bodů. Byl vytvořen, protože stávající formáty nepodporovaly některé funkce, které poskytuje knihovna PCL. PCD je primární formát dat v PCL, ale knihovna také nabízí možnost ukládat a načítat data v jiných formátech (například PLY, IFS, VTK, STL, OBJ, X3D). Tyto ostatní formáty však nemají flexibilitu a rychlost souborů PCD. Jednou z výhod PCD je schopnost ukládat a zpracovávat uspořádané datové sady mračen bodů. Další je velmi rychlé ukládání a načítání bodů, které jsou uloženy v binární podobě.

Verze Verze PCD je uvedena v záhlaví každého souboru pomocí čísel 0.x (např. 0.5, 0.6). Oficiální verze v roce 2020 je PCD 0.7 (PCD_V7). Hlavní rozdíl oproti verzi 0.6 spočívá v tom, že byla přidána nová položka v hlavičce souboru – VIEWPOINT. Ta secifikuje informace o orientaci senzoru vůči datové sadě.

Struktura souboru Soubor PCD je rozdělen na dvě části – hlavička (header) a data. Hlavička má přesně definovaný formát a obsahuje potřebné informace o mračnu bodů, které je v něm uloženo. Hlavička musí být kódována v ASCII, data ale mohou být uložena i v binární podobě. Díky tomu, že je formát ASCII lehce čitelný pro člověka, lze jej otevřít ve standardních softwarových nástrojích a snadno upravovat.

Ve verzi 0.7 se na začátku hlavičky nachází verze souboru PCD, následuje název, velikost a typ každé dimenze uložených dat. Je zde také uveden počet bodů (výška * šířka) v celém mračnu a informace o tom, zda je datová sada bodů uspořádaná (organized) nebo ne. Datový typ určuje, ve jakém formátu jsou body uloženy (ASCII nebo binárním). Za hlavičkou následuje samotná datová sada bodů. Každý bod může být uložený na samostatném řádku (potom se jedná o neuspořádaný dataset) nebo jsou uloženy v obrazové struktuře (uspořádané mračno bodů). Níže je uveden příklad souboru ve formátu PCD. Pořadí položek záhlaví je důležité! # .PCD v.7 – Point Cloud Data file format VERSION .7 FIELDS x y z rgb SIZE 4 4 4 4 TYPE F F F F COUNT 1 1 1 1 WIDTH 213 HEIGHT 1 VIEWPOINT 0 0 0 1 0 0 0 POINTS 213 DATA ascii 0.93773 0.33763 0 4.2108e+06 0.90805 0.35641 0 4.2108e+06 0.81915 0.32 0 4.2108e+06 0.97192 0.278 0 4.2108e+06 … …

Moduly PCL je rozdělena do několika menších knihoven, které lze sestavit samostatně. Níže jsou popsány nejdůležitější moduly a jejich funkce.

Filtry Při skenování 3D mračna bodů mohou vznikat chyby a různé odchylky, které způsobují šum v datech. To komplikuje odhad některých lokálních charakteristik bodů, jako jsou normály povrchu. Tyto nepřesnosti mohou vést k významným chybám při dalším zpracování, a proto je dobré odstranit je vhodným filtrem. Knihovna pcl_filters poskytuje několik užitečných filtrů pro odstranění odlehlých hodnot a šumu a také k převzorkování dat. Některé používají k ořezávání bodů jednoduchá kritéria, jiné statistickou analýzu.

PassThrough filtr – slouží k filtrování bodů v jedné vybrané dimenzi. To znamená, že může odříznout body, které nejsou v rozsahu určeném uživatelem. VoxelGrid filtr – vytvoří mřížku voxelů v mračnu bodů. Body uvnitř každého voxelu jsou pak aproximovány jejich těžištěm. To vede k převzorkování (snížení počtu bodů) v mračnech bodů. StatisticalOutlierRemoval – odstraňuje šum z datové sady pomocí technik statistické analýzy aplikované na okolí každého bodu a odstraňuje všechny body, jejichž střední vzdálenosti jsou mimo definovaný interval. RadiusOutlierRemoval – odstraní ty body, které mají menší než vybraný počet sousedů v definované oblasti.

Vlastnosti Modul pcl_features obsahuje algoritmy a datové struktury pro odhad vlastností. Nejčastěji používané lokální geometrické vlastnosti jsou normály bodů a odhad zakřivení povrchu. Vlastnosti popisují geometrické vzory v určitém bodě na základě vybraného k-sousedství (prostor okolo zvoleného bodu). Okolí lze vybrat určením pevného počtu bodů z blízké oblasti nebo definováním poloměru koule kolem bodu.

Jednou z nejjednodušších implementovaných metod pro odhad normály povrchu je analýza vlastních vektorů a vlastních čísel kovarianční matice vytvořené z okolí bodu. Point Feature Histograms (nebo rychlejší FPFH) jsou pokročilou reprezentací vlastností a závisí na odhadu normály v každém bodě. Zobecňují střední zakřivení kolem bodu pomocí vícerozměrného histogramu hodnot. Další deskriptory vlastností jsou například: deskriptor VFH (Viewpoint Feature Histogram), deskriptory NARF, deskriptory založené na momentu setrvačnosti a výstřednosti, deskriptory GASD (Globally Aligned Spatial Distribution) a další.

Segmentace Knihovna pcl_segmentation obsahuje algoritmy pro segmentaci mračna bodů do různých klastrů. Shlukování se často používá k rozdělení cloudu na jednotlivé části, které se dále zpracovávají. V modulu je implementováno několik tříd, které podporují různé metody segmentace:

Segmentace rovinného modelu – jednoduchý algoritmus, který najde všechny body podporující rovinný model v mračnu bodů Euklidovské shlukování – vytváří shluky bodů na základě euklidovské vzdálenosti Podmíněné euklidovské shlukování – shlukování bodů na základě euklidovské vzdálenosti a uživatelem definované podmínky Rostoucí oblasti (Region growing segmentation) – sloučí body, které jsou dostatečně blízko a splňují podmínky hladkosti Rostoucí oblasti na základě barev (Color-based region growing) – stejný koncept jako region growing, ale místo normá používá barvu Min-Cut binární segmentace – rozděluje data na body popředí a pozadí segmentace založená na rozdílu normál (Difference of Normals) – segmentace založená na měřítku, hledání bodů, které patří do zadaných parametrů měřítka Shlukování supervoxelů – generuje objemové segmentace bodů

Vizualizace Knihovna pcl_visualization se používá k rychlé a snadné vizualizaci 3D mračen bodů. Modul využívá knihovnu VTK pro 3D vykreslování mračen a ‘range‘ obrazů. Knihovna nabízí:

Třída CloudViewer je pro jednoduchou vizualizaci mračen bodů.

RangeImageVisualizer lze použít k vizualizaci ‘range‘ obrazu jako 3D mračno bodů nebo jako obrázek, kde barvy odpovídají hodnotám rozsahu.

PCLVisualizer je třída pro vizualizaci s několika aplikacemi. Může zobrazovat jednoduchý dataset i mračno bodů, které obsahuje barevná data. Na rozdíl od CloudVieweru může také vykreslovat další užitečné vlastnosti bodů a jejich okolí, jako jsou normály, zakřivení a geometrie. Tato třída umožňuje zobrazit více mračen bodů vedle sebe, takže je lze snadno porovnávat, nebo kreslit různé primitivní tvary (např. válce, koule, čáry, polygony atd.) buď z bodů, nebo z parametrických rovnic.

Třída PCLPlotter se používá pro snadné vykreslování grafů, od polynomiálních funkcí až po histogramy. Tato třída umí zpracovávat různé typy vstupů pro vykreslení (souřadnice, funkce) a provádět automatické barvení.

PCLHistogramVisualizer je modul pro vizualizaci histogramu pro 2D grafy.

Shoda vzorků Knihovna sample_consensus obsahuje metody SAmple Consensus (SAC) jako RANSAC a modely pro detekci konkrétních objektů v mračnech bodů. Některé modely implementované v této knihovně zahrnují rovinné modely, které se často používají k detekci vnitřních povrchů, jako jsou stěny a podlahy. Dále jsou to modely pro čáry, 2D a 3D kružnice v rovině, koule, válec, kužel, model pro určení přímky rovnoběžné s danou osou, model pro určení roviny kolmé k uživatelem zadané ose, rovina rovnoběžná s uživatelem specifikovanou osou atd. Tyt modely mohou být použity k detekci objektů s obecnou geometrickou strukturou. Robustní odhady shody vzorků, které jsou k dispozici v knihovně:

SAC_RANSAC – RANdom SAmple Consensus

SAC_LMEDS – Least Median of Squares SAC_MSAC – M-Estimator SAmple Consensus SAC_RRANSAC – Randomized RANSAC SAC_RMSAC – Randomized MSAC SAC_MLESAC – Maximum LikeLihood Estimation SAmple Consensus SAC_PROSAC – PROgressive SAmple Consensus

Povrch