WaveMe est une boîte à outils de métrologie conçue pour le traitement parallèle d'images et fournit des applications pour la détection de front d'onde Shack-Hartmann, l'interférométrie à déphasage rapide et la prise en charge des tâches d'alignement optique. Dans WaveMe, on trouve un pipeline d'images qui transmet les messages d'une source, qui serait typiquement une caméra, et d'un puits, qui est un compositeur qui attrape et ordonne les commandes graphiques pour offrir une présentation efficace et sans scintillement.
One of WaveMe’s strengths lies in its open programming interface, enabling users to access this image stream, including camera images and data from other modules operating in the pipeline, to create or adapt results to fit new measurement tasks.
To make the module interface more accessible, WaveMe includes a template folder in the standard installation path containing essential elements for writing new modules that integrate seamlessly into the existing pipeline. To create a custom module, we recommend that the user copies the template folder to a new location and rename ‘template_’ to something that better describes its purpose. For example, using Microsoft’s Vscode, [CTRL]+[SHIFT]+H allows for quick renaming across all files, including the Makefile, but it’s all just text files so the tool choice is free.
WaveMe utilise GTK4/GLIB-2.0 pour son interface utilisateur et, sous Windows, il a été construit en utilisant l'environnement MSYS2/mingw64. Il existe quelques détails supplémentaires, tels que les bibliothèques de développement à installer pour compiler votre propre module, et l'installation standard inclut un script qui installe toutes les bibliothèques de développement nécessaires.
WaveMe fournit son propre ensemble de primitives graphiques qui sont basées sur OpenGL et de nouvelles primitives peuvent être ajoutées dans le cadre fourni par WaveMe, qui offre une interface pour s'assurer que les commandes OpenGL sont exécutées dans le contexte approprié.
Chaque application proposée par WaveMe réside dans une bibliothèque liée dynamiquement (.dll sous Windows ou .so sous Linux) qui peut définir sa propre interface utilisateur et même ajouter des éléments au menu des préférences de WaveMe. Au démarrage, WaveMe essaiera de localiser toutes les bibliothèques appropriées, mais pour ce faire, il y a cinq fonctions obligatoires qui sont attendues par WaveMe afin d'intégrer un nouveau module dans sa propre interface utilisateur et de le rendre disponible. Ces cinq fonctions se trouvent au bas du fichier template.c. Il s'agit de get_module_prefix(), _remove_ui(), _build_ui() et _verify_module(). Elles ont plusieurs fonctions, allant de l'exportation du nom du module, afin que WaveMe puisse identifier et distinguer n'importe quelle bibliothèque qu'il peut trouver d'un véritable module WaveMe, à la création et éventuellement à la suppression de l'interface utilisateur définie à l'intérieur du module.
Dans template.c, vous trouverez également des exemples de bonnes pratiques pour l'interception et l'identification des messages du pipeline. Comment entrer et sortir du pipeline et comment coopérer avec lui. Les premières versions du pipeline exigeaient moins de coopération, mais il y avait tellement de choses que les modules ne pouvaient tout simplement pas faire, et le pipeline a évolué pour exiger plus de coopération comme un compromis pour permettre aux modules de faire des choses telles que l'échange d'un message pour un autre. Ceci est, par exemple, utilisé dans le module Shack-Hartmann qui démarre deux threads sur le pipeline, l'un qui analyse l'image du spot et crée le champ de gradient (affiché sous la forme d'un tracé de carquois), et l'autre qui intercepte ce champ de gradient afin de calculer le front d'onde. Cette partie du module a la possibilité de transmettre le gradient et de laisser le compositeur le gérer ou de le consommer (ou de le laisser tomber et de libérer ses ressources).
La vidéo montre ce que fait le modèle d'exemple qui, dans ce cas, consiste à implémenter quelques widgets pour offrir des exemples de la façon d'envoyer des données dans le pipeline et de la façon d'interagir avec elles. Elle sert également de documentation sur les polynômes de Zernike à frange utilisés par WaveMe et ses autres modules. Le modèle contient également du code montrant comment interagir avec le pointeur de la souris et comment interagir correctement avec les autres modules pour les événements de touche et de déplacement. Il existe également des modèles pour la création de l'icône, bien qu'elle ne soit pas strictement nécessaire, qui correspond à l'icône du compositeur au bas du widget Toolbox (boîte).
Ce qui est peut-être plus intéressant, outre les exemples ésotériques de graphiques OpenGL, c'est de savoir à quoi cela peut servir. Je suis heureux que vous ayez posé la question 🙂 .
Supposons que l'on veuille créer une boucle de rétroaction pour un miroir déformable en utilisant la rétroaction du module Shack-Hartmann. La réponse est la suivante : écrivez un module qui interagit avec votre miroir déformable et qui capture le polynôme de Zernike ou le champ de gradient, selon ce que vous préférez. Lancez un flux et contrôlez votre miroir. Comme WaveMe fournit également un module de déphasage très performant, connectez votre miroir au module de déclenchement et utilisez une variante du module d'enregistrement (qui est également fourni sous forme de source) pour créer une table d'étalonnage pour votre miroir. Avec une caméra USB3, WaveMe poussera votre actionneur aux limites et a la capacité d'atteindre plus de 10 mesures de 4 phases par seconde. Même les miroirs déformables avec un grand nombre d'actionneurs peuvent être calibrés en moins de 30 secondes, en supposant que le miroir et l'actionneur soient suffisamment rapides.