WaveMe es una caja de herramientas de metrología diseñada para el procesamiento paralelo de imágenes y proporciona aplicaciones para la detección de frente de onda Shack-Hartmann, interferometría rápida de cambio de fase y soporte para tareas de alineación óptica. Dentro de WaveMe, uno encontrará una canalización de imágenes que reenvía mensajes desde una fuente, que normalmente sería una cámara, y un sumidero, que es un compositor que captura y ordena comandos gráficos para ofrecer una presentación eficiente y sin parpadeos.
Uno de los puntos fuertes de WaveMe es su interfaz de programación abierta, que permite a los usuarios acceder a este flujo de imágenes, incluidas las imágenes de la cámara y los datos de otros módulos que operan en la tubería, para crear o adaptar los resultados a nuevas tareas de medición.
Para hacer la interfaz de módulos más accesible, WaveMe incluye una carpeta de plantillas en la ruta de instalación estándar que contiene elementos esenciales para escribir nuevos módulos que se integren perfectamente en el pipeline existente. Para crear un módulo personalizado, recomendamos que el usuario copie la carpeta de plantillas en una nueva ubicación y cambie el nombre de 'template_' por otro que describa mejor su propósito. Por ejemplo, usando Vscode de Microsoft, [CTRL]+[SHIFT]+H permite renombrar rápidamente todos los archivos, incluyendo el Makefile, pero todo son sólo archivos de texto por lo que la elección de la herramienta es libre.
WaveMe utiliza GTK4/GLIB-2.0 para su interfaz de usuario y, en Windows, se construyó utilizando el entorno MSYS2/mingw64. Hay algunos detalles más, como qué bibliotecas de desarrollo instalar para compilar tu propio módulo, y la instalación estándar incluye un script que instala todas las bibliotecas de desarrollo necesarias.
WaveMe proporciona su propio conjunto de primites gráficas que se basan en OpenGL y se pueden añadir nuevas dentro del marco proporcionado por WaveMe, que ofrece una interfaz para asegurarse de que los comandos OpenGL se ejecutan en el contexto adecuado.
Cada aplicación ofrecida por WaveMe reside dentro de una librería enlazada dinámicamente (.dll en Windows o .so en Linux) que puede definir su propia interfaz de usuario e incluso añadir elementos al menú de preferencias de WaveMe. Al arrancar, Waveme intentará localizar todas las librerías apropiadas, pero para ello, hay cinco funciones obligatorias que son esperadas por WaveMe para integrar un nuevo módulo en su propia UI y hacerlo disponible. Estas son las cinco funciones que se encuentran al final de template.c. Son get_module_prefix(), _remove_ui(), _build_ui() y _verify_module(). Sirven para varios propósitos, que van desde exportar el nombre del módulo, para que WaveMe pueda identificar y distinguir entre cualquier librería que pueda encontrar y un módulo propio de WaveMe, hasta crear y eventualmente eliminar la interfaz de usuario definida dentro del módulo.
Dentro de template.c, también se encuentran ejemplos de buenas prácticas para interceptar e identificar los mensajes de la tubería. Cómo entrar y salir de la tubería y cómo cooperar con ella. Las primeras versiones de la tubería requerían menos cooperación, pero entonces había muchas cosas que los módulos simplemente no podían hacer, y la tubería evolucionó para requerir más cooperación como compensación para permitir a los módulos hacer cosas como cambiar un mensaje por otro. Esto se utiliza, por ejemplo, en el módulo Shack-Hartmann que inicia dos hilos en la tubería, uno que analiza la imagen puntual y crea el campo de gradiente (que se muestra como un gráfico de carcaj), y otro que intercepta este campo de gradiente para calcular el frente de onda. Esta parte del módulo tiene la opción de reenviar el gradiente y dejar que el compositor lo maneje o lo consuma (o lo suelte y libere sus recursos).
El vídeo muestra lo que hace el ejemplo de plantilla, que en este caso, es implementar unos cuantos widgets para ofrecer algunos ejemplos de cómo enviar algunos datos por la tubería y cómo interactuar con ellos. También sirve como documentación de los polinomios de Zernike utilizados por WaveMe y sus otros módulos. La plantilla también contiene código que muestra cómo interactuar con el puntero del ratón y también cómo interactuar adecuadamente con los otros módulos para eventos de tecla y arrastre. También hay plantillas sobre cómo crear el icono, aunque no es estrictamente necesario, que docs con el icono del compositor en la parte inferior del widget Toolbox (caja).
Quizás más interesante sea, además de ejemplos esotéricos de gráficos OpenGL, ¿para qué se puede usar esto? Me alegro de que lo preguntes 🙂 .
Supongamos que uno quisiera crear un bucle de retroalimentación para un espejo deformable usando la retroalimentación del módulo Shack-Hartmann. La respuesta es, escribe un módulo que interactúe con tu espejo deformable que capture el polinomio de Zernike o el campo de gradiente, lo que prefieras. Inicia un flujo y controla tu espejo. Dado que WaveMe también proporciona un módulo de cambio de fase muy capaz, conecte su espejo con el módulo de disparo y utilice una variante del módulo de registro (que también se proporciona en forma de código fuente) para crear una tabla de calibración para su espejo. Con una cámara USB3, WaveMe llevará su actuador al límite y tiene capacidad para alcanzar más de 10 mediciones de 4 fases por segundo. Incluso los espejos deformables con un gran número de actuadores pueden calibrarse en menos de 30 segundos, suponiendo que el espejo y el actuador sean lo suficientemente rápidos.