Perché WaveMe

Stai cercando una soluzione che includa una videocamera? Vuoi un'applicazione ad alte prestazioni che ti permetta di agire rapidamente? Allora dovresti dare un'occhiata a WaveMe. WaveMe è una piattaforma che risolve i problemi comuni che si incontrano quando si sviluppano applicazioni di visione che richiedono l'accesso a grafiche di alto livello. WaveMe è la soluzione ideale per chi ritiene che Labview sia troppo pesante e scrivere un'applicazione da zero sia troppo complicato.

Con questo intervento tecnico vorrei approfondire un po’ di più cosa offre WaveMe come ambiente di programmazione generico e perché voi, o Senslogic, poteste costruire uno strumento dalle elevate prestazioni con un minimo di sforzo.

Architettura di base

Come fa WaveMe a farlo? Dall’inizio, WaveMe è stato progettato per gestire un insieme fondamentalmente diversificato di applicazioni, con la telecamera frontale come componente comune. Il cuore della piattaforma è un flusso di lavoro gestito da un pipeline manager che aggiunge e rimuove moduli (il vostro codice) con tipi di input e di output definiti.

Il pipeline, così come il resto dell’applicazione, si basa su un paradigma di produttore-consumatore. Questo vale per tutto, dalle immagini all’allocazione della memoria. Il produttore è solitamente una fotocamera, ma può essere qualsiasi cosa che generi dati. Tutti possono essere produttori nel pipeline. Il consumatore (ultimo) è un compositore che gestisce tutte le attività relative alla visualizzazione delle immagini, alla risposta ai comandi grafici, all’invio di eventi e, infine, alla cancellazione dei dati allocati dal produttore quando non sono più necessari. L’unica cosa speciale del compositore è che funziona in un contesto OpenGL, il che significa che abbiamo accesso a tutto il set di comandi OpenGL.

La piattaforma è dotata di un sacco di primitivi grafici predefiniti, come disegnare linee, poligoni, cerchi, mirini, rendere visibile il testo e persino visualizzare i polinomi di Zernike. Se non trovi quello che ti piace, puoi facilmente aggiungerne di tuoi. Questo richiede un certo impegno in più, ma non siamo mai limitati dalla piattaforma stessa. Se ne abbiamo bisogno, ci mostra tutta la potenza di OpenGL.

Moduli cooperativi

Un modulo WaveMe è una libreria che fornisce la propria interfaccia utente, definisce i tipi di input e output e viene aggiunto a un pipeline live quando sono disponibili i dati appropriati. I moduli funzionano come filtri e sono collaborativi. Vedono tutti i dati presenti nel pipeline. In genere un modulo svolge le seguenti attività:,

  • Osservate il tipo dei dati
    • Se i dati rappresentano una richiesta di uscita, restituisci un codice di uscita. Questo modulo verrà eliminato. La pulizia verrà eseguita tramite le funzioni di pulizia registrate che hai fornito all'avvio del modulo.
  • Spingi il messaggio nel flusso di lavoro se non è del tipo corretto e ritorna con un codice continue.
  • Se i dati sono ciò che stiamo cercando,
    • Fate il lavoro e quando non avremo più bisogno dei dati, restituiteli al flusso di lavoro. Forse anche un altro modulo lo desidererà. È una vostra decisione. È possibile “eliminare” i dati, inviando così le loro funzioni di pulizia.
    • Possiamo anche generare ulteriori messaggi da inviare lungo la pipeline per poi essere gestiti dal compositore.
    • Quando tutto sarà completato, ritorna con un codice di continuazione. Il modulo verrà nuovamente svegliato quando arriverà il messaggio successivo.

Eventi per mouse e tastiera

Scrivendo un'applicazione GUI completa, esistono molti eventi standard da gestire. WaveMe viene fornito con una struttura predefinita per gestire gli eventi del mouse e del tastierino, in modo che questi collaborino con il resto della piattaforma. Per impostazione predefinita, la vostra applicazione viene ospitata all'interno di una scheda insieme ad altri moduli. Uno di questi è il modulo che gestisce la fotocamera. Quando selezionate la scheda della fotocamera, WaveMe prevede che i moduli che attualmente gestiscono gli eventi del tastierino e del mouse rilasciino questi eventi e, al contrario, li prelevino quando la scheda del modulo è selezionata. Tutto ciò è gestito dalla struttura predefinita. Tutto ciò che dobbiamo fare è modificare il nome delle funzioni callback della struttura e aggiungere il vostro codice, almeno se vogliamo interagire con questi eventi.

Toolkit grafico e interfaccia utente

WaveMe è basato su GTK4 e glib-2.0 per la sua interfaccia utente, e gran parte del modo in cui i moduli interagiscono con il pipeline segue i modelli utilizzati da queste librerie.

Suppone che la fotocamera fornisca un flusso costante di immagini, con i moduli che rispondono generando messaggi in base a ciò che vedono. Questa semantica si adatta bene agli elementi grafici che monitorano alcune proprietà di ogni immagine.

Questo comportamento potrebbe non essere adatto a tutto ciò che facciamo, quindi potrebbe essere necessario modificarlo. Il compositore, a meno che non venga detto diversamente, assume che tutti gli oggetti che riceve siano persistenti e che un altro messaggio con lo stesso ID sia appena qualche millisecondo lontano. Ci sono cose che vorremmo fare che non rientrano in questa descrizione. Ad esempio, se vogliamo cambiare una mappa di colore, questo è sicuramente un messaggio che non richiede un follow-up. Per questi tipi di messaggi, dobbiamo marcarne uno come singolare. Sparare e dimenticare. L’azione del messaggio verrà eseguita una sola volta e non più.

Un'ultima cosa che vale la pena menzionare almeno una volta: tutti i messaggi possono avere una funzione di pulizia, e questa funzione viene eseguita all'interno del contesto OpenGL. Se è necessario accedere allo stato OpenGL e rispedirlo all'applicazione, questo è il posto giusto per farlo.

Riassunto

Spero di aver dato un'idea di ciò che WaveMe può fare e come. Alcune cose non sono state trattate, come ad esempio come costruire l'interfaccia utente o almeno le parti dell'interfaccia utente specifiche per WaveMe. Molte di queste cose sono trattate nel template da cui derivano tutti i moduli attualmente disponibili per WaveMe. La filosofia generale è quella di mantenere un template che copra tutte le funzionalità e di ampliarlo con le specifiche di ogni applicazione. Dopo aver scritto un paio di template già, credo che WaveMe sia diventata una piattaforma riutilizzabile da cui molte applicazioni possono essere create rapidamente. Fateci un'idea. Forse anche provatelo. Non esitate a contattarmi [email protected] se volete vedere se WaveMe può essere adatto anche a voi.