WaveMe è una toolbox di metrologia progettata per il processamento parallelo delle immagini e fornisce applicazioni per la rilevazione del fronte d’onda Shack-Hartmann, l’interferometria a fase rapida e supporto per le attività di allineamento ottico già integrate. All’interno di WaveMe si trova un pipeline di immagini che trasmette i messaggi provenienti da una sorgente, tipicamente una fotocamera, e un sink che è un compositore che riceve e ordina i comandi grafici per offrire una presentazione efficiente e priva di flicker.

Programmazione del modulo WaveMe
Una delle principali caratteristiche di WaveMe risiede nella sua interfaccia di programmazione aperta, che consente agli utenti di accedere a questo flusso di immagini, comprese le immagini della fotocamera e i dati provenienti da altri moduli in fase di sviluppo, per creare o adattare i risultati in base a nuove attività di misura.
Per rendere l’interfaccia del modulo più accessibile, WaveMe include una cartella di modelli nel percorso di installazione standard che contiene elementi essenziali per scrivere nuovi moduli che si integrano perfettamente nel flusso di lavoro esistente. Per creare un modulo personalizzato, consigliamo all’utente di copiare la cartella di modelli in un nuovo percorso e rinominare ‘template_’ in qualcosa che ne descriva meglio lo scopo. Ad esempio, utilizzando Vscode di Microsoft, [CTRL]+[SHIFT]+H consente di rinominare rapidamente tutti i file, incluso il Makefile, ma si tratta di semplici file di testo, quindi la scelta dell’applicazione è libera.
WaveMe utilizza GTK4/GLIB-2.0 per la sua interfaccia utente e, su Windows, è stato costruito utilizzando l'ambiente MSYS2/mingw64. Ci sono alcuni dettagli aggiuntivi, come le librerie di sviluppo da installare per compilare il proprio modulo, e l'installazione standard include uno script che installa tutte le librerie di sviluppo necessarie.
WaveMe fornisce il proprio set di grafiche primitive basate su OpenGL e nuove possono essere aggiunte all'interno del framework fornito da WaveMe, che offre un'interfaccia per garantire che i comandi OpenGL vengano eseguiti nel contesto appropriato.
API aperta
Ogni applicazione offerta da WaveMe è contenuta all’interno di una libreria collegata dinamicamente (dll su Windows o .so su Linux), che può definire la propria interfaccia utente e persino aggiungere elementi al menu delle preferenze di WaveMe. Durante l’avvio, WaveMe tenta di trovare tutte le librerie appropriate, ma per farlo sono necessarie cinque funzioni obbligatorie che WaveMe richiede per integrare un nuovo modulo nel proprio UI e renderlo disponibile. Queste sono le cinque funzioni presenti nella parte inferiore di template.c. Si tratta di get_module_prefix(), _remove_ui(), _build_ui() e _verify_module(). Tutte svolgono diverse funzioni, che vanno dalla esportazione del nome del modulo, per consentire a WaveMe di identificare e distinguere tra qualsiasi libreria possa trovarsi e un modulo WaveMe vero e proprio, alla creazione e alla successiva rimozione dell’interfaccia utente definita all’interno del modulo.
Modello di interfaccia
All'interno di template.c sono presenti anche esempi di buone pratiche per l'intercettazione e l'identificazione dei messaggi del pipeline. Come entrare e uscire dal pipeline e come collaborare con esso. Le versioni precedenti del pipeline richiedevano una minore collaborazione, ma poi c'erano così tante cose che i moduli semplicemente non potevano fare e il pipeline si è evoluto per richiedere una maggiore collaborazione in cambio per consentire ai moduli di eseguire operazioni come lo scambio di un messaggio con un altro. Questo è utilizzato, ad esempio, nel modulo Shack-Hartmann che avvia due thread nel pipeline, uno che analizza l'immagine spot e crea il campo di gradiente (visualizzato come grafico a riga), e uno che intercetta questo campo di gradiente per calcolare il fronte d'onda. Questa parte del modulo offre la possibilità di inoltrare il gradiente e lasciare che il compositor lo gestisca o di consumarlo (o di eliminarlo e rilasciare le sue risorse).
Il video mostra cosa fa l’esempio del template, che in questo caso consiste nell’implementare alcuni widget per offrire alcuni esempi su come inviare alcuni dati lungo la pipeline e come interagire con essi. Serve anche come documentazione dei polinomi Zernike extra usati da WaveMe e dai suoi altri moduli. L’esempio contiene anche codice che mostra come interagire con il puntatore del mouse e come interagire correttamente con gli altri moduli per gli eventi di pressione e trascinamento. Ci sono anche template per la creazione dell’icona, sebbene non strettamente necessari, che vengono documentati con l’icona del compositore in fondo al widget Toolbox (box).
Esempli di applicazioni
Forse più interessante sono, oltre agli esempi esoterici di grafica OpenGL, a cosa può essere utilizzato questo? Sono contento che l’avete chiesto 🙂
Supponiamo che si desideri creare un circuito di feedback per uno specchio deformabile utilizzando i dati provenienti dal modulo Shack-Hartmann. La soluzione è scrivere un modulo che interagisca con lo specchio deformabile e catturi il polinomio Zernike o il campo di gradiente, a seconda delle preferenze. Iniziare una trasmissione e controllare lo specchio. Poiché WaveMe fornisce anche un modulo di fase-shift altamente efficiente, collegare lo specchio al modulo trigger e utilizzare una variante del modulo logger (che è anche fornito in formato sorgente) per creare una tabella di calibrazione per lo specchio. Con una fotocamera USB3, WaveMe porterà i suoi attuatori alle loro capacità massime e ha la capacità di effettuare oltre 10 4 misure a fase al secondo. Anche gli specchi deformabili con un numero elevato di attuatori possono essere calibrati in meno di 30 secondi, a condizione che lo specchio e l’attuatore siano abbastanza veloci.