Developers Perspective: la nuova funzione LiDAR per iOS

Photogram è costantemente alla ricerca di innovazioni e novità nel campo del rilievo digitale. Il nostro obiettivo è quello di rendere queste tecnologie facili da usare e più accessibili. Da tempo la nostra piattaforma trasforma qualsiasi smartphone capace di fare video e foto di buona qualità in uno strumento di rilievo affidabile. I sensori LiDAR dei nuovi iPhone e iPad PRO aprono nuove possibilità per rendere il rilievo con lo smartphone ancora più efficiente e preciso. Il modo in cui utilizziamo questo nuovo hardware per creare nuvole di punti è descritto qui.

Attualmente, nel nostro software utilizziamo principalmente la fotogrammetria. Con questa tecnologia, è possibile creare nuvole di punti di un oggetto o di una posizione target da foto e/o video con una notevole precisione. Sebbene questa tecnologia sia molto flessibile e fornisca buoni risultati, la trasformazione dei dati video e fotografici in nuvole di punti richiede molto tempo. Inoltre, è possibile valutare solo a posteriori se i dati grezzi sono sufficienti per ottenere un risultato soddisfacente.

Oltre alla fotogrammetria, è possibile utilizzare anche scanner laser per la creazione di nuvole di punti. I laser scanner funzionano secondo il principio del “time of flight” (tof). Il dispositivo emette un fascio di luce e misura il tempo impiegato dal fascio per essere riflesso dall'oggetto di destinazione. La metà di questo tempo, moltiplicata per la distanza percorsa dalla luce in questo lasso di tempo, fornisce la distanza dell'oggetto target. I laser scanner, noti anche come LiDAR (light detection and ranging o light imaging, detection and ranging), emettono migliaia di questi raggi laser al secondo e ottengono diverse migliaia di punti di misura in un tempo molto breve. Da tutti questi punti di misura si possono generare nuvole di punti.

Uno dei maggiori vantaggi di questa tecnologia è che le distanze dagli oggetti vengono immediatamente scalate correttamente. Non è quindi necessaria una successiva conversione alle dimensioni corrette, con conseguente risparmio di potenza di calcolo e quindi di tempo. Anche l'orientamento della nuvola di punti è chiaro grazie all'IMU integrata nel dispositivo. Ciò significa che la nuvola di punti è sempre posizionata correttamente nella stanza.

Gli scanner laser classici sono costituiti da un laser e da un'unità ricevente che vengono indirizzati verso uno specchio rotante. L'intera unità ruota attorno all'asse Z in modo che il laser possa scansionare l'intero ambiente. Questi dispositivi forniscono risultati molto precisi, ma sono poco maneggevoli per gli utenti occasionali. Un nuovo sviluppo nella tecnologia LiDAR riguarda i sistemi che rinunciano a grandi componenti meccanici e sono quindi estremamente compatti. Questi scanner laser utilizzano la tecnologia MEMS (Micro-Electro-Mechanical Systems) per integrare specchi mobili di dimensioni microscopiche su schede di circuito. Questa tecnologia consente di dirigere il raggio laser con precisione in tutte le direzioni senza dover ricorrere a un grande specchio meccanico rotante. Questi LiDAR avanzati sono noti come LiDAR allo stato solido, poiché non contengono più componenti meccanici convenzionali. Dal 2020, Apple ha integrato un LiDAR a stato solido in tutti i modelli PRO dei suoi iPhone e iPad. Questo LiDAR viene utilizzato principalmente per migliorare le funzioni AR. Con iOS14, l'API ARKit è stata resa disponibile anche agli sviluppatori. Questo ci ha dato l'opportunità di integrare questo nuovo hardware nel nostro software e di utilizzarlo per le misurazioni. La nostra "funzione LiDAR" utilizza le informazioni di profondità degli scanner LiDAR dell'iPhone o dell'iPad per generare nuvole di punti. La posizione esatta e la rotazione nello spazio sono fornite da ARKit con l'IMU integrata, che consente di calcolare le coordinate 3D nello spazio relativo.

ARKit fornisce anche un "valore di confidenza" per ogni punto, che indica l'affidabilità dei punti rilevati. Indica la certezza di ARKit di aver determinato correttamente la posizione e l'orientamento dei punti rilevati. I dati grezzi del sensore LiDAR non hanno ancora valori di colore. Pertanto, quando si utilizza la nostra "funzione LiDAR", vengono scattate fino a 30 foto al secondo con la fotocamera integrata per aggiungere informazioni sul colore a ciascun punto della nuvola di punti. Sulla base di tutte queste informazioni, il nostro algoritmo cerca di calcolare i migliori punti disponibili, che vengono poi salvati come nuvola di punti. Questo processo viene ripetuto fino a 30 volte al secondo.

La nostra applicazione è basata sulla tecnologia web, che offre molti vantaggi, ad esempio la possibilità di sviluppare l'applicazione una sola volta e di utilizzarla su piattaforme diverse come web, iOS e Android. Tuttavia, ci sono anche alcuni svantaggi, come la mancanza di accesso alle API native come ARKit, che rende difficile l'accesso al LiDAR. La potenza di calcolo di un'applicazione web è limitata e funzioni come la visualizzazione 3D dal vivo con mappatura in tempo reale sono difficili da implementare con le API per GPU web come WebGL.

Per risolvere questo problema, abbiamo sviluppato l'intera funzionalità LiDAR in Swift per iOS. Per evitare di dover ricreare l'intera applicazione, abbiamo sviluppato un plugin nativo per la nostra web app. Abbiamo collocato un controller di visualizzazione nativo sopra il controller di visualizzazione web per creare una transizione senza soluzione di continuità per l'utente tra l'applicazione web e il plugin nativo. La comunicazione tra il plugin e l'applicazione web avviene tramite un ponte basato sul testo. Negli esempi di codice allegati, è evidente che il codice web è scritto in TypeScript, mentre il codice nativo è stato scritto in Swift. Il codice è suddiviso in tre cartelle: "PluginWebBridge", "PluginCoreNative" e "WebIntegration". "PluginWebBridge" e "PluginCoreNative" formano il plugin. Il codice in "PluginWebBridge" informa l'applicazione web su come comunicare con il plugin, mentre "PluginCoreNative" contiene il codice per il plugin nativo. La cartella "WebIntegration" contiene il codice per l'applicazione web, utilizzata per controllare il plugin LiDAR e trasferire la nuvola di punti. Per semplificare la comprensione del codice, diamo un'occhiata al processo di chiamata. Tutto inizia con la chiamata alla funzione "isLidarAvailable" per determinare se il dispositivo ha un LiDAR integrato. Nel file useLidar.ts, questa funzione richiama la corrispondente funzione isLidarAvailable in LidarPlugin.swift tramite il bridge definitions.ts. Il codice nativo Swift verifica se un LiDAR è disponibile e la risposta viene restituita al codice web tramite il bridge. Se è disponibile un LiDAR, la funzione openLidarCapture in useLidar.ts può essere usata per avviare il plugin LiDAR vero e proprio con l'interfaccia utente nativa. A questo scopo viene richiamata la funzione startLidar in LidarIos.swift. Qui si può vedere come un nuovo controller di visualizzazione nativo venga sovrapposto al controller di visualizzazione web esistente per visualizzare la nuvola di punti con l'interfaccia grafica nativa in metallo. A differenza di altre funzioni, la funzione openLidarCapture non viene completata dopo una sola chiamata. Al contrario, viene mantenuto un canale di comunicazione bidirezionale tra web e nativo. Questo viene utilizzato per dire all'applicazione cosa fare successivamente. Ad esempio, viene informata quando la nuvola di punti è pronta e in quale percorso verrà salvata. L'applicazione web ha bisogno di queste informazioni per avviare il caricamento sul server con la funzione useLidarUpload in useLidarUplaod.ts. Tuttavia, l'upload vero e proprio viene eseguito dal plugin nativo stesso, poiché il ponte non ha una larghezza di banda sufficiente per trasferire la nuvola di punti dal plugin nativo all'applicazione web. Il codice di caricamento si trova nel file NFSClient.swift.

I sensori LiDAR sono attualmente utilizzati solo da Apple. Pertanto, questa funzione è disponibile solo nella versione PRO dell'iPhone 12 (o più recente) e dell'iPad 11 (o più recente).

Autore:

Head of Development
Matthias Keim, dott.