Il mondo `e tridimensionale.
I sistemi che operano nel mondo fisico o che si occupano della sua simulazione de- vono spesso elaborare dati tridimensionali. Tali dati assumono la forma di nuvole di punti (point cloud), mesh e altre rappresentazioni. I dati in questa forma sono prodotti da sensori come LiDAR e telecamere di profondit`a e da sistemi software che supportano la ricostruzione e la modellazione 3D [30]. Nonostante il ruolo centrale dei dati 3D in campi come la robotica e la computer grafica, scrivere un software che elabori tali dati `e piuttosto laborioso rispetto ad altri tipi di dati. Ad esempio, un’immagine pu`o essere caricata e visualizzata in modo efficiente con poche righe
di codice OpenCV. Non `e emerso un framework software altrettanto facile da usa- re per i dati 3D paragonabile a open3D. Un notevole sforzo precedente `e la Point Cloud Library (PCL) [30]. Sfortunatamente, dopo un afflusso iniziale di contributi opensource, il PCL `e diventato ingombrante ed `e ora in gran parte dormiente. Altri sforzi open source includono MeshLab [30], che fornisce un’interfaccia utente grafica per l’elaborazione delle mesh; libigl [30], che supporta la geometria differen- ziale discreta e la ricerca correlata e una variet`a di soluzioni per la ricostruzione basata su immagini [30]. Tuttavia, attualmente non esiste una libreria open source veloce, facile da usare, che supporti i flussi di lavoro di elaborazione dati 3D comuni e sia sviluppata in conformit`a con le moderne pratiche ingegneristiche, paragonabile a Open3D.
Open3D `e stato creato per rispondere a tutte queste esigenze. `E una libreria open- source che supporta lo sviluppo rapido di software che si occupa di dati 3D. Il frontend Open3D espone un insieme di strutture di dati e algoritmi accuratamente selezionati sia in C ++ che in Python. Il backend Open3D `e implementato in C ++, `e altamente ottimizzato ed `e configurato per la parallelizzazione OpenMP. Open3D `e stato sviluppato con un insieme di dipendenze piccolo e attentamente considerato. Pu`o essere impostato su diverse piattaforme e compilato dai sorgenti con il minimo sforzo. Open3D `e in sviluppo dal 2015 ed `e stato utilizzato in numerosi progetti di ricerca pubblicati [30].
7.4.1
Design
Due principi di progettazione principali di Open3D sono l’utilit`a e la facilit`a d’uso. L’utilit`a ha motivato il supporto per rappresentazioni, algoritmi e piattaforme po- polari. La facilit`a d’uso funge da forza di contrasto che protegge dalle dipendenze pesanti e dallo scivolamento delle funzionalit`a. Open3D fornisce strutture di dati per tre tipi di rappresentazioni: nuvole di punti, mesh e immagini RGB-D. Per ogni rappresentazione, esiste un set completo di algoritmi di elaborazione di base come I/O, campionamento, visualizzazione e conversione dei dati.
Inoltre, esiste una raccolta di algoritmi ampiamente utilizzati, come la stima delle normali, la registrazione ICP e l’integrazione volumetrica [30].L’insieme di dipen- denze ”leggere” comprende Eigen per l’algebra lineare, GLFW per il supporto di finestre OpenGL e FLANN per la ricerca veloce del vicino pi`u vicino [30]. Per una compilazione facile, alcune librerie come Boost e Ceres sono escluse [30]. Invece Open3D utilizza alternative ”leggere” o implementazioni interne. Il codice sorgente di tutte le dipendenze `e distribuito come parte di Open3D. Le dipendenze possono cos`ı essere compilate dai sorgenti se non rilevate automaticamente dallo script di configurazione. Ci`o `e particolarmente utile per la compilazione su sistemi operativi privi di software di gestione dei pacchetti, come Microsoft Windows.
Lo sviluppo di Open3D `e iniziato da zero e la libreria `e mantenuta il pi`u semplice possibile. Vengono aggiunti solo algoritmi che risolvono un problema di ampio inte- resse.
Se un problema ha pi`u soluzioni, viene scelta quella che la comunit`a considera stan- dard. Un nuovo algoritmo viene aggiunto solo se la sua implementazione dimostra risultati significativamente migliori su un benchmark ben noto. Open3D `e scritto
nello standard C ++ e utilizza CMake per supportare le comuni toolchain C ++ tra cui:
• GCC 4.8 e versioni successive su Linux; • XCode 8.0 e versioni successive su OS X;
• Visual Studio 2015 e versioni successive su Windows.
Una caratteristica fondamentale di Open3D `e l’onnipresente associazione Python. Open3D `e avvezza a problemi di visione artificiale e deep learning: il backend `e implementato in C ++ ed `e esposto attraverso interfacce frontend in Python. Gli sviluppatori usano Python come linguaggio collante per assemblare i componenti implementati nel backend. L’implementazione che utilizza l’interfaccia Open3D Py- thon `e circa la met`a della lunghezza dell’implementazione che utilizza l’interfaccia Open3D C ++ e circa cinque volte pi`u breve dell’implementazione basata su PCL. Come ulteriore vantaggio, il codice Python pu`o essere modificato, ed eseguito il debug in modo interattivo in un notebook Jupyter.
7.4.2
Dati
Il modulo Geometry implementa tre rappresentazioni geometriche: PointCloud, TriangleMesh e Image. La struttura dati PointCloud ha tre campi dati: Point- Cloud.points, PointCloud.normals, PointCloud.colors. Sono usati per memorizzare coordinate, normali e colori. Il campo di dati principale `e PointCloud.points, gli altri due campi sono considerati validi solo quando hanno lo stesso numero di record di PointCloud.points. Open3D fornisce accesso alla memoria diretto a questi campi dati tramite un array numpy. Allo stesso modo, TriangleMesh ha due campi di dati principali TriangleMesh.vertices e TriangleMesh.triangles oltre a tre campi di dati ausiliari: TriangleMesh.vertex normals, TriangleMesh.vertex colors e Triangle- Mesh.triangle normals. La struttura dei dati dell’immagine `e implementata come un array 2D o 3D e pu`o essere convertita direttamente in un array numpy. Una coppia di immagini di profondit`a e colore della stessa risoluzione pu`o essere combinata in una struttura dati denominata RGBDImage.
Nel nostro caso per la Point Cloud ho utilizzato la struttura dati specifica as- segnando a PointCloud.points i punti ottenuti tramite la funzione reprojectIma- geTo3D() citata precedentemente per poi stimare le normali di ognuno dei punti, tramite la funzione estimate normals(), e assegnarle a PointCloud.normals.
7.4.3
Visualizzazione
Open3D fornisce una funzione draw geometries() per la visualizzazione. Prende un elenco di geometrie come input, crea una finestra e le renderizza simultaneamen- te utilizzando OpenGL. Sono implementate molte funzioni nel visualizzatore, come rotazione, traslazione e ridimensionamento tramite operazioni del mouse, modifica dello stile di rendering e cattura dello schermo.
Oltre a draw geometries(), Open3D ha una serie di funzioni simili con funzionalit`a pi`u avanzate: draw geometry with custom animation(), consente al programmatore
di definire una traiettoria di visualizzazione personalizzata e riprodurre un’anima- zione nella GUI;
draw geometry with animation callbacks() e draw geometry with key callbacks(), accettano le funzioni di callback Python come input. La funzione di callback viene chiamata in un ciclo di animazione automatico o in seguito a un evento di pressione di un tasto.