
Pourquoi WaveMe
Vous recherchez une solution impliquant une caméra de vision ? Vous voulez une application performante qui vous permet de prendre les commandes ? Alors vous devriez jeter un coup d'œil à WaveMe. WaveMe est une plate-forme qui résout les problèmes courants que vous rencontrez lors de la création d'applications de vision nécessitant l'accès à des graphiques haut de gamme. WaveMe est destiné à ceux qui trouvent que Labview est trop lourd et qu'écrire une application à partir de zéro est trop exigeant.
Avec ce discours technique, j'aimerais plonger un peu plus profondément dans ce que WaveMe offre comme environnement de programmation générique et pourquoi vous, ou Senslogic, pourriez construire un outil de haute performance avec très peu d'effort.
Architecture de base
Comment WaveMe y parvient-il ? Dès le départ, WaveMe a été conçu pour gérer un ensemble d'applications fondamentalement diverses avec la caméra de vision comme composant commun. Le cœur de la plateforme est un pipeline géré par un gestionnaire de pipeline qui ajoute et supprime des modules (c'est votre code) avec des types d'entrée et de sortie définis.
Le pipeline, ainsi que le reste de l'application, est basé sur un paradigme producteur-consommateur. Cela vaut pour tout, des images à l'allocation de mémoire. Le producteur est généralement un appareil photo, mais il peut s'agir de tout ce qui génère des données. Tout le monde peut être producteur dans le pipeline. Le consommateur (ultime) est un compositeur qui gère toutes les tâches liées à l'affichage des images, à la réponse aux commandes graphiques, à la gestion des événements et, enfin, au retrait des données allouées par le producteur lorsqu'elles ne sont plus nécessaires. La seule particularité du compositeur est qu'il fonctionne dans un contexte OpenGL, ce qui signifie que nous avons accès à l'ensemble des commandes OpenGL.
La plateforme est livrée avec un grand nombre de primitives graphiques prédéfinies, comme le dessin de lignes, de polygones, de cercles, de réticules, le rendu de texte et même l'affichage de polynômes de Zernike. Si vous ne trouvez pas ce que vous aimez, vous pouvez facilement ajouter les vôtres. Cela demande quelques efforts supplémentaires, mais nous ne sommes jamais limités par la plateforme qui. Si nous en avons besoin, elle nous expose toute la gloire d'OpenGL.
Modules de coopération
Un module WaveMe est une bibliothèque qui apporte sa propre interface utilisateur, définit ses types d'entrée et de sortie et sera ajouté à un pipeline en direct lorsque les données appropriées sont disponibles. Les modules fonctionnent comme des filtres et sont coopératifs. Ils voient toutes les données du pipeline. En règle générale, un module effectue les opérations suivantes
- Examinez le type de données
- Si les données sont une demande de sortie, le système renvoie un code de sortie. Ce module disparaît. Le nettoyage sera effectué avec les fonctions de nettoyage enregistrées que vous avez fournies lors du démarrage du module
- Pousser le message dans le pipeline s'il n'est pas du bon type et renvoyer un code de continuation.
- Si les données correspondent à ce que nous recherchons,
- Faire le travail et, lorsque nous n'avons plus besoin des données, les rendre au pipeline. Peut-être qu'un autre module en a également besoin. C'est à vous de décider. Vous pouvez "laisser tomber" les données, invoquant ainsi leurs fonctions de nettoyage.
- Nous pouvons également générer des messages supplémentaires qui seront poussés dans le pipeline pour être finalement traités par le compositeur.
- Lorsque tout est terminé, retournez avec un code de continuation. Le module sera à nouveau réveillé à l'arrivée du prochain message.
Événements liés à la souris et au clavier
Lors de l'écriture d'une application GUI complète, il y a beaucoup d'événements standards à gérer. WaveMe est livré avec un modèle où les événements souris et clavier sont prédéfinis afin qu'ils coopèrent avec le reste de la plateforme. Par défaut, votre application vit à l'intérieur d'un onglet avec d'autres modules. L'un d'entre eux est le module qui gère la caméra. Lorsque vous sélectionnez l'onglet de la caméra, WaveMe s'attend à ce que les modules qui gèrent actuellement les événements du clavier et de la souris les lâchent et, inversement, à ce qu'ils les récupèrent lorsque l'onglet du module est sélectionné. Tout cela est géré par le modèle standard. Tout ce que nous avons à faire est de changer le nom des fonctions de rappel du modèle et d'ajouter votre propre code, du moins si nous voulons interagir avec ces événements.
Boîte à outils graphique et interface utilisateur
WaveMe est basé sur GTK4 et glib-2.0 pour son interface utilisateur, et une grande partie de la façon dont les modules interagissent avec le pipeline suit les modèles utilisés par ces bibliothèques.
Elle suppose que la caméra fournit un flux constant d'images et que les modules réagissent en générant des messages basés sur ce qu'ils voient. Cette sémantique s'adapte bien aux éléments graphiques qui suivent certaines propriétés de chaque image.
Ce comportement peut ne pas convenir à tout le monde et il se peut donc que nous devions le modifier. Le compositeur, sauf indication contraire, suppose que tous les objets qu'il reçoit sont persistants et qu'un autre message avec le même identifiant ne se trouve qu'à quelques millisecondes de distance. Il y a des choses que nous pouvons vouloir faire qui ne correspondent pas à cette description. Par exemple, si nous voulons changer une carte de couleurs, c'est un message qui n'a pas besoin d'être suivi. Pour ces types de messages, nous devons marquer le message comme étant unique. Tirez et oubliez. La partie action du message sera appelée une fois et jamais plus.
Une dernière chose qui mérite d'être mentionnée au moins une fois, tous les messages peuvent avoir une fonction de nettoyage, et la fonction de nettoyage s'exécute dans le contexte OpenGL. Si nous avons besoin de jeter un coup d'œil dans l'état d'OpenGL et de le renvoyer à l'application, c'est ici qu'il faut le faire.
Résumé
J'espère avoir donné un aperçu de ce que WaveMe peut faire et comment. Certaines choses n'ont pas été abordées, comme la façon dont nous construisons l'interface utilisateur, ou du moins les parties de l'interface utilisateur qui sont spécifiques à WaveMe. La plupart de ces aspects sont couverts par le modèle à partir duquel tous les modules actuellement disponibles pour WaveMe sont dérivés. La philosophie générale est de garder un modèle qui couvre toutes les bases et de l'étendre en fonction des spécificités de chaque application. Ayant déjà écrit quelques modules, je pense que WaveMe a évolué vers une plateforme réutilisable à partir de laquelle de nombreuses applications peuvent être construites rapidement. Pensez-y. Peut-être même l'essayer. N'hésitez pas à me contacter à l'adresse suivante [email protected] si vous souhaitez voir si WaveMe peut vous convenir.
Laisser un commentaire