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.
Programmation du module WaveMe
L'une des forces de WaveMe réside dans son interface de programmation ouverte, qui permet aux utilisateurs d'accéder à ce flux d'images, y compris les images des caméras et les données provenant d'autres modules opérant dans le pipeline, afin de créer ou d'adapter les résultats à de nouvelles tâches de mesure.
Pour rendre l'interface des modules plus accessible, WaveMe inclut un dossier de modèles dans le chemin d'installation standard contenant les éléments essentiels pour écrire de nouveaux modules qui s'intègrent de manière transparente dans le pipeline existant. Pour créer un module personnalisé, nous recommandons à l'utilisateur de copier le dossier template dans un nouvel emplacement et de renommer 'template_' en quelque chose qui décrit mieux son objectif. Par exemple, en utilisant le Vscode de Microsoft, [CTRL]+[SHIFT]+H permet de renommer rapidement tous les fichiers, y compris le Makefile, mais il ne s'agit que de fichiers texte, le choix de l'outil est donc libre.
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é.
API ouverte
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.
Modèle d'interface
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).
Exemples d'application
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.