WaveMe ist eine Metrologie-Toolbox, die für die parallele Bildverarbeitung entwickelt wurde und Anwendungen für die Shack-Hartmann-Wellenfrontabtastung, schnelle phasenverschiebende Interferometrie und Unterstützung für optische Ausrichtungsaufgaben bietet. WaveMe enthält eine Bildpipeline, die Nachrichten von einer Quelle (in der Regel eine Kamera) und einer Senke (ein Compositor, der Grafikbefehle abfängt und anordnet, um eine effiziente und flimmerfreie Darstellung zu ermöglichen) weiterleitet.

WaveMe Modul-Programmierung

Eine der Stärken von WaveMe liegt in seiner offenen Programmierschnittstelle, die es dem Benutzer ermöglicht, auf diesen Bildstrom zuzugreifen, einschließlich der Kamerabilder und Daten von anderen Modulen in der Pipeline, um Ergebnisse zu erstellen oder an neue Messaufgaben anzupassen.

Um die Modulschnittstelle leichter zugänglich zu machen, enthält WaveMe im Standard-Installationspfad einen Vorlagenordner, der wesentliche Elemente für das Schreiben neuer Module enthält, die sich nahtlos in die bestehende Pipeline integrieren. Um ein benutzerdefiniertes Modul zu erstellen, empfehlen wir, dass der Benutzer den Vorlagenordner an einen neuen Ort kopiert und "template_" in einen Namen umbenennt, der den Zweck des Moduls besser beschreibt. Bei Verwendung von Microsofts Vscode beispielsweise ermöglicht [STRG]+[SHIFT]+H eine schnelle Umbenennung aller Dateien, einschließlich des Makefiles, aber es handelt sich dabei nur um Textdateien, so dass die Wahl des Tools frei ist.

WaveMe verwendet GTK4/GLIB-2.0 für seine Benutzeroberfläche und wurde unter Windows mit der Umgebung MSYS2/mingw64 erstellt. Es gibt noch einige weitere Details, z. B. welche Entwicklungsbibliotheken zu installieren sind, um Ihr eigenes Modul zu kompilieren, und die Standardinstallation enthält ein Skript, das alle erforderlichen Entwicklungsbibliotheken installiert.

WaveMe bietet einen eigenen Satz von Grafik-Primites, die auf OpenGL basieren und innerhalb des von WaveMe bereitgestellten Rahmens, der eine Schnittstelle bietet, um sicherzustellen, dass die OpenGL-Befehle im richtigen Kontext ausgeführt werden, neu hinzugefügt werden können.

Offene API

Jede von WaveMe angebotene Anwendung befindet sich in einer dynamisch verknüpften Bibliothek (.dll unter Windows oder .so unter Linux), die ihre eigene Benutzeroberfläche definieren und sogar Elemente zum Einstellungsmenü von WaveMe hinzufügen kann. Beim Start wird WaveMe versuchen, alle geeigneten Bibliotheken zu finden, aber dafür gibt es fünf obligatorische Funktionen, die von WaveMe erwartet werden, um ein neues Modul in seine eigene Benutzeroberfläche zu integrieren und verfügbar zu machen. Diese fünf Funktionen befinden sich am Ende der Datei template.c. Sie heißen get_module_prefix(), _remove_ui(), _build_ui() und _verify_module(). Sie dienen verschiedenen Zwecken, vom Exportieren des Modulnamens, damit WaveMe eine beliebige Bibliothek von einem richtigen WaveMe-Modul unterscheiden kann, bis hin zum Erstellen und Entfernen der im Modul definierten Benutzeroberfläche.

Die WaveMe Pipeline und die Ideen dahinter

Interface-Vorlage

In template.c finden sich auch Beispiele für bewährte Verfahren zum Abfangen und Identifizieren von Pipeline-Nachrichten. Wie man die Pipeline betritt und verlässt und wie man mit ihr zusammenarbeitet. Die frühen Versionen der Pipeline erforderten weniger Kooperation, aber dann gab es so viele Dinge, die die Module einfach nicht tun konnten, und die Pipeline entwickelte sich weiter, um mehr Kooperation als Kompromiss zu erfordern, damit die Module Dinge wie den Tausch einer Nachricht gegen eine andere tun können. Dies wird z. B. im Shack-Hartmann-Modul verwendet, das zwei Threads in der Pipeline startet: einen, der das Spotbild analysiert und das Gradientenfeld erstellt (das als Köcherdiagramm angezeigt wird), und einen, der dieses Gradientenfeld abfängt, um die Wellenfront zu berechnen. Dieser Teil des Moduls hat die Möglichkeit, den Gradienten weiterzuleiten und ihn vom Compositor verarbeiten zu lassen oder ihn zu verbrauchen (oder ihn fallen zu lassen und seine Ressourcen freizugeben).

Das Video zeigt, was die Beispielvorlage tut, in diesem Fall die Implementierung einiger Widgets, um einige Beispiele dafür zu liefern, wie man Daten durch die Pipeline schickt und wie man mit ihnen interagiert. Es dient auch als Dokumentation der Zernike-Polynome, die von WaveMe und seinen anderen Modulen verwendet werden. Die Vorlage enthält auch Code, der zeigt, wie man mit dem Mauszeiger interagiert und wie man richtig mit den anderen Modulen für Tasten- und Ziehereignisse interagiert. Es gibt auch Vorlagen für die Erstellung des Symbols, obwohl dies nicht unbedingt erforderlich ist, das mit dem Compositor-Symbol am unteren Rand des Toolbox-Widgets (Box) dokumentiert wird.

Anwendungsbeispiele

Interessanter ist vielleicht, abgesehen von esoterischen OpenGL-Grafikbeispielen, wofür kann man das verwenden? Ich bin froh, dass du fragst 🙂 .

Angenommen, man möchte eine Rückkopplungsschleife für einen verformbaren Spiegel erstellen und dabei die Rückkopplung des Shack-Hartmann-Moduls verwenden. Die Antwort lautet: Schreiben Sie ein Modul, das mit Ihrem verformbaren Spiegel interagiert und das Zernike-Polynom oder das Gradientenfeld erfasst, je nachdem, was Sie bevorzugen. Starten Sie einen Stream und steuern Sie Ihren Spiegel. Da WaveMe auch ein sehr leistungsfähiges Phasenverschiebungsmodul bereitstellt, verbinden Sie Ihren Spiegel mit dem Triggermodul und verwenden Sie eine Variante des Logger-Moduls (das auch als Quellcode bereitgestellt wird), um eine Kalibrierungstabelle für Ihren Spiegel zu erstellen. Mit einer USB3-Kamera stößt WaveMe an die Grenzen Ihres Aktors und kann mehr als 10 4-Phasen-Messungen pro Sekunde erreichen. Selbst verformbare Spiegel mit einer großen Anzahl von Aktuatoren können in weniger als 30 Sekunden kalibriert werden, vorausgesetzt, der Spiegel und der Aktuator sind schnell genug.