Neue App: AirfoilEditor

Jojo26

User
… ganz vergessen habe ich nach der Vorstellung des ‚Planform Creator 2‘ etwas mehr über den ‚Airfoil Editor‘ zu berichten. Das soll nun flugs nachgeholt werden.
Der kleine 'AirfoilEditor' ist für mich inzwischen zum Schweizer Taschenmesser der alltäglichen Profilarbeit geworden. Verknüpft mit der Dateiendung .dat kann man sich schnell einen Überblick zu einem Profil verschaffen und anschließend durch die Nachbar-Profile in diesem Verzeichnis blättern – und noch ein wenig mehr.


Airfoil Editor

Der AirfoilEditor ist Teil des Planform Creator 2 Projekts und dient dazu, detaillierte Informationen über ein Tragflächen-Profil anzuzeigen und grundlegende Profilmodifikationen vorzunehmen.

AirfoilEditor_App.png


Features:
  • Ansicht eines Profils und Durchblättern der Profile seines Unterverzeichnisses
  • Anzeige der Oberflächen-Krümmung
  • Re-Paneln und Normalisieren
  • Ändern der Geometrieparameter Dicke, Wölbung und deren Hochpunkte
  • Einstellen des Hinterkanten Spalts
  • Erstellen einer Bezier-basierten Kopie
Einer der Treiber für diese App war, einige Artefakte zu überwinden, die bei der Verwendung von xfoils-Geometrieroutinen (z. B. in Xflr5) manchmal auftreten. Der Schwerpunkt der Anwendung liegt auf der reinen Geometriearbeit mit Profilen – also keine aerodynamischen Berechnungen.


Grundlegende Konzepte

Wie in Xfoil wird zunächst ein (kubischer) Spline aus den Koordinaten der .dat-Datei des Profils erzeugt. Basierend auf diesem Spline werden dann die Geometrie-Informationen wie Dicke und Wölbung möglichst exakt durch Iteration bestimmt.

Auch die Position der 'echten' Vorderkante eines Profils, die von der „Nullkoordinaten-Vorderkante“ abweichen kann, wird auf Basis dieses Splines ermittelt. Bei der "Normalisierung" des Profils wird diese echte Vorderkante in einer Iteration verwendet, um das Profil zu drehen, zu strecken und zu verschieben, damit es schließlich 0,0 - 1,0 normalisiert ist..

Für die Veränderung der Dicken- und Wölbungs-Geometrie wird der Profil-Spline in zwei neue Splines aufgeteilt, die die Dicken- und Wölbungsverteilung darstellen. Für die Verschiebung des Hochpunkts von Dicke oder Wölbung wird ein Hilfs-Mapping-Spline für die Profilkoordinaten erzeugt, der dem in Xfoil implementierten Ansatz sehr ähnlich ist. Nach diesen Operationen wird das Profil aus Dicke und Wölbung wieder neu aufgebaut.

Das „Re-Paneln“ der Koordinatenpunkte basiert auf einer modifizierten Kosinusverteilung der Punkte entlang der Spline-Bogenlänge. Dieser Verteilungsansatz unterscheidet sich von der in Xfoil implementierten Methode, zeigt aber in der aerodynamischen Berechnung ein schönes Verhalten mit ausgesprochen "runden" Polaren.

Als Beispiel für die Funktionalität der App der Dialog für das Re-Paneln:

AirfoilEditor_Repanel.png

Dialog für das Re-Paneln. Es werden Hinweise für „gesunde“ minimale Winkel zweier Panels gemacht..


Krümmungsverlauf

Eine der beiden Hauptansichten eines Profils im AirfoilEditor ist die Krümmung der Oberfläche. Sie ermöglicht eine schnelle Bewertung der Oberflächenqualität und die Erkennung von Artefakten, wie z. B. einem "Spoiler" an der Hinterkante, der recht häufig vorkommt.

Da die Krümmung von sehr hohen Werten an der Vorderkante zu sehr niedrigen Werten an der Hinterkante übergeht, kann zur besseren Übersicht auf eine logarithmische Skala gewechselt werden.


Bezier-basierte Profile

Etwas versteckt ist die Funktion, ein (neues) Profil auf Basis zweier Bezier-Kurven für Ober- und Unterseite zu definieren. Die Kontrollpunkte der Bezier-Kurve können mit der Maus innerhalb ihrer individuellen Grenzen verschoben werden.

Die Funktion 'Auto adjust' führt eine bestmögliche automatische Anpassung der Bezierkurve an ein bestehendes Profil durch. Dazu wird eine Simplex-Optimierung (Nelder Mead) durchgeführt, um die Abweichung zwischen der Bezierkurve und dem Zielprofil zu minimieren.

Siehe hierzu auch den sehr schönen BezierAirfoilDesigner von Marc, der einen etwas anderen Ansatz für die Optimierung verfolgt. Die Bezier-Daten sind zwischen beiden Programmen übertragbar.


Installation

Der AirfoilEditor ist Teil des 'Planform Creator 2' Projekts und kann zusammen mit diesem von Github geladen werden.

Da der AirfoilEditor in Python geschrieben ist, benötigt man normalerweise eine aktuelle Python-Installation auf dem PC.

Für Windows kann allerdings auch eine fertige Exe-Version inklusive aller benötigten Python-Dateien von https://github.com/jxjo/PlanformCreator2/releases als zip-Datei geladen werden. Diese zip-Datei wird dann einfach in ein Unterverzeichnis „entzippt“. Anschließend kann „AirfoilEditor.exe“ (oder auch „PlanformCreator2.exe“) angeklickt werden.

Möchte man die vorhandene Python-Installation nutzen, lädt man sich nur den Source code von https://github.com/jxjo/PlanformCreator2/releases in ein Verzeichnis. Wenn noch nicht bereits installiert, sind noch folgende Python-Module zu installieren:

pip3 install numpy pip3 install matplotlib pip3 install customtkinter pip3 install termcolor pip3 install colorama pip3 install ezdxf

Und schon kann es losgehen.
So weit dieser erste kurze Überblick zum AirfoilEditor.

Have Fun! 😉

Jochen
 

Anhänge

  • AirfoilEditor_bezier.png
    AirfoilEditor_bezier.png
    109,9 KB · Aufrufe: 71

Jojo26

User
Airfoil Editor 1.1 & Bezier-Special


Airfoil Editor 1.1.png

In der neuen Version wurden die internen Profil-Geometrie-Routinen einer umfangreichen Umstrukturierung unterzogen. Ziel war es die verschiedenen „Strategien“, mit denen ein Profil analysiert und modifiziert wird, besser zu gliedern:
  • Lineare Interpolation: Die Berechnung von zusätzlichen Punkten auf der Profilkontur wird linear zwischen zwei Koordinaten-Punkten interpoliert. Für die Ermittlung der Maximalwerte von Dicke und Wölbung und deren Position kommt allerdings ein kleiner Hilfs-Spline zum Zug, um trotzdem möglichst exakte Werte zu erhalten.

  • Spline Interpolation: Aus allen Profil-Koordinaten wird ein kubischer Spline erzeugt. Mit dessen Hilfe lassen sich dann Zwischenpunkte mit hoher Präzision bestimmen. Der Spline liefert vor allem aber auch die genaue Position der „wahren“ Vorderkante des Profils, die dann für die Normalisierung (Vorderkante bei 0,0 – Hinterkante bei 1) eines Profils verwendet wird. Da die Erzeugung des Splines ziemlich rechenintensiv ist, wird sie nur bei Bedarf (im Hintergrund) durchgeführt.

  • Bezier Approximation: Ein Profil wird durch zwei Bezierkurven für Ober- und Unterseite approximiert. Per Definition ist das Profil dann normalisiert und eignet sich für eine Weiterverarbeitung in hoher Qualität.
In der Version 1.1 wurde die Funktion „Match Airfoil“ mit der ein bestehendes Profil durch zwei Bezierkurven approximiert wird, de facto neu implementiert, um den neu gewonnenen Erkenntnissen Rechnung zu tragen – siehe nachfolgendes Kapitel „Profile und Bezierkurven“.

An die Benutzeroberfläche hat es nun auch die Funktion „Blend Airfoil“ geschafft, mit der zwei Profile prozentual gemischt werden können, um daraus ein neues Profil zu erzeugen. Bei dieser Funktion kommen beispielsweise beide Interpolationsverfahren zum Einsatz: Für die schnelle Bildschirmanzeige des augenblicklichen „Misch-Profils“ wird linear interpoliert, für das Endergebnis wird nochmals mit kubischen Splines interpoliert, um möglichst genaue Ergebnisse zu erzielen.

Blend_airfoils.png
Neue Funktion: Prozentuales Mischen zweier Profile

Neben den grundlegenden inneren Umbauten wurde zahlreiche kleine Bugs und Unschönheiten beseitigt, um den ‚Airfoil Editor‘ in frischem Glanz erscheinen zu lassen… 😉

Das neueste Release gibt es wie immer unter:

https://github.com/jxjo/PlanformCreator2/releases




Das nachfolgende „Special“ zu den Besonderheiten bei der Bezier-Approximation von Profilen ist vor allem für Profil-Junkies oder wie man hier im Schwäbischen sagen würde: „Dipfelesscheißer“ (als einer derselben möchte ich an dieser Stelle auf eine Übersetzung gerne verzichten). Die Betrachtungen sind eher nur relevant, wenn Profilberechnungen mit Bezier erzeugten Profilen – oder, wie in meinem Fall, Profil-Optimierungen auf Basis von Bezierkurven durchgeführt werden sollen…


Special: Profile und Bezierkurven

Bezierkurven, ursprünglich von Pierre Bézier bei Renault und Paul de Casteljau bei Citroën entwickelt, um besonders elegante Karosserieformen zu entwerfen, sind heute aus der „Computerei“ nicht mehr wegzudenken. Immer wenn es darum geht, besonders weiche Kurven zu zeichnen, kommen Bezierkurven wegen ihrer schnellen Berechenbarkeit zum Einsatz. Während beispielsweise der geneigte Leser gerade auf diesen Bildschirm schaut, haben tausende kleine Bezierkurven für schön anzuschauende, fließende Schriften gesorgt.

Für mich üben Bezierkurven mit ihrer einfachen Eleganz eine große Faszination aus. Sie eignen sich wunderbar, um spielerisch die Welt der Kurven zu erschließen. Eine Bezierkurve wird durch sogenannte Kontrollpunkte definiert: Der erste und der letzte Punk legen Start- und Endpunkt der Kurve fest. Mit dem zweiten und dem vorletzten Punkt wird die Start- bzw. Endtangente definiert. Mit allen weiteren Punkten dazwischen wird dann weiter Einfluss auf den Kurvenverlauf genommen.

Wer sich mit Bezierkurven ein wenig intensiver beschäftigen will, sollte sich die tolle Web-Seite A Primer on Bézier Curves anschauen, wo man sich Bezierkurven sowohl theoretisch als auch interaktiv erschließen kann. (Auch im Airfoil Editor lässt sich wunderbar mit Bezierkurven spielen. Einmal mit der Maus an einem Kontrollpunkt gezogen, versteht man sofort deren Prinzip …)

Was liegt näher Bezierkurven auch zu verwenden, um Profile zu zeichnen?

Bezier_upper_lower.png
Ein neues Profil entsteht durch das Zusammenfügen zweier Bezierkurven von Ober- und Unterseite

Man definiert einfach je eine Bezierkurve für die Ober- und Unterseite und fügt dann beide an der Vorderkante zusammen. Ist die Starttangente beider Bezierkurven senkrecht, bekommt man automatisch eine weiche Profilnase ohne Knick in der Kontur. An der Hinterkante kann man beim Zusammenklappen der beiden Bezierkurven gleich einen Hinterkantenspalt einstellen. Und fertig ist unser neues Profil in perfekter Oberflächenqualität.


Auf dem Holzweg #1

Fertig ist das Profil. Dachte ich.

… bis ich mir einmal den Krümmungsverlauf des neuen Profils an der Vorderkante genauer anschaute. Oh – nein. Die Krümmung machte einen regelrechten Sprung...

Zwischeneinschub „Die Krümmung“

Die Krümmung der Profilkontur – englisch curvature – ist die vielleicht wichtigste geometrische Eigenschaft eines Profils. Der Geschwindigkeitsverlauf (und damit die Druckverteilung und damit der Auftrieb) wird maßgeblich durch den Verlauf Krümmung von Vorder- bis Hinterkante bestimmt. Überspitzt könnte man auch formulieren: Eigentlich ist bei einem Profil nur der Krümmungsverlauf wichtig.

Mathematisch ist die Krümmung einer Kurve so etwas wie das normierter Kreuzprodukt aus 1. und 2. Ableitung einer Kurve. Dadurch kann die Kurve beliebig gedreht werden, die Krümmung bleibt an dieser Stelle der Kurve immer gleich.

Eine Gerade hat die Krümmung 0 – drum ist sie auch gerade. Unsere Profile haben typischerweise an der Nasenspitze eine Krümmung zwischen 50 und 1000. In Richtung Hinterkante nimmt sie dann steil ab, um dann meist gegen 0 im letzten Drittel zu laufen. Nimmt man den Kehrwert der Krümmung erhält man den Kurvenradius. Das ist der Kreis, der sich an diesen Kurvenpunkt am besten „anschmiegt“.

Radius? Da war doch etwas. Genau - der bekannte „Nasenradius“ eines Profils. Haben wir die Krümmung an der Nasenspitze errechnet, könnten wir direkt den Nasenkreis einzeichnen.

Aus dem Krümmungsverlauf lässt sich bereits viel über die Eigenschaften eines Profils herauslesen. Hier am Beispiel des wunderbaren MH30:

Curvature.png
Der Krümmungsverlauf auf Ober- und Unterseite (gestrichelt) des MH30. Auf Grund der großen Werte-Spreizung zwischen Nasenkante mit einer Krümmung von über 400 und dem hinteren Bereich zwischen 1 und 0 wird die y-Achse logarithmisch dargestellt. Die Zacken an der Profilnase kommen häufig von Rundungsfehlern der sehr kleinen Koordinatenwerte dort. Gut zu erkennen im Krümmungsverlauf, ist dass die Krümmung nahe der Hinterkante von positiv nach negativ verläuft. Wir haben hier eine Richtungsumkehr der Krümmung – englisch ‚reversal‘ - oder umgangssprachlich einen kleinen S-Schlag auf der Oberseite. Ein Grund für den geringen Momenten-Beiwert des MH30.

Nach diesem kleinen Ausflug in „die Krümmung“ nun ein Blick auf den Krümmungsverlauf unseres zusammengesetzten Bezier-Profils:

Bezier_different_curvature_LE.png
Krümmungsverlauf an der Nasenspitze bei einem Profil aus zwei zusammengesetzten Bezierkurven. Die Oberseite startet bei einer Krümmung von 60 nach hinten – während die Unterseite bei über 400 beginnt…

Für ein kurzen Augenblick war ich gewillt zu sagen „Was soll’s! Den Luftmolekülen dürfte es egal sein, ob es an der Vorderkante angekommen unterschiedlich schnell um die Ecke geht“.

Aber dann besann ich mich doch da insbesondere die Nasenspitze eines Profils großen Einfluss auf die Rechenergebnisse im hohen ca-Bereich hat (<-> Saugspitze) und dadurch die Vergleichbarkeit eines solchen „Bezier-Profilen“ mit in diesem Fall „anständigen Profilen“ erschweren würde.

Es sollte kein zu großes Problem sein, die Krümmung an der Vorderkante beider Bezier-Kurven anzugleichen, weil man ja mit der Länge der Starttangente einer Bezier-Kurve die Krümmung wunderbar einstellen kann.


Auf dem Holzweg #2

Länge der Starttangente einer Bezierkurve bestimmt die Krümmung. Dachte ich.

Und implementierte kurzerhand, dass sich die Starttangente beider Bezierkurven nur noch gemeinsam, gegenläufig bewegen lassen und damit immer gleich lang sind. Nicht mehr „kurzerhand“ war die „Matchfoil-Funktionalität“, um ein bestehendes Profil mit Bezierkurven zu approximieren. Bisher wurde dies in zwei getrennten Berechnungsläufen für Ober- und Unterseite gemacht. Nun musste es durch die Kopplung der Starttangenten in nur einem Durchlauf erfolgen.

Irgendwann funktionierte diese neue Funktionalität dann auch und ich konnte mir nun gespannt den perfekten Krümmungsverlauf an der Nasenspitze betrachten:

Bezier_still_different_curvature_LE.png
Trotz gleicher Länge der Starttangenten sind die Krümmungswerte an der Nasenspitze nachwievor ungleich

Oh nein! Nicht schon wieder.
Das gibt’s doch nicht. Die Krümmungswerte an der Nasenspitze sind immer noch unterschiedlich…

Klaro, weil bei Bezier-Kurven die Krümmung von allen Kontrollpunkten abhängt, wenn sie relativ zueinander verschoben werden.

(Das sind die Momente, wo man doch einmal herzhaft in die Tischkante beißen könnte. Mit vermeintlicher Sicherheit Annahmen getroffen hat, die einfach falsch waren ... )

Nach einer gewissen Motivationspause wurde nun der 3. Anlauf gemacht, die zunächst so einfachen, eleganten Bezierkurven zu bändigen


Auf dem nun (hoffentlich) richtigen Weg

Die aktuelle Aufgabenstellung lässt sich folgendermaßen zusammenfassen: Erzeuge eine Bezier-Kurve mit n Kontrollpunkten, die möglichst eng an einer Ziel-Kontur anliegt und die an der Nasenspitze die gleiche Krümmung hat, wie das Ziel-Profil.

Da die Aufgabenstellung mathematisch, analytisch nicht zu lösen ist, musste wieder einmal der Optimierungsalgorithmus, der bisher schon das „Matchen“ übernommen hat, das Problem lösen. Die Zielfunktion der Optimierung – englisch ‚objective function‘ – wurde dazu erweitert um die Differenz der Krümmung an der Nasenspitze zwischen Zielprofil und Bezier-Kurve.

Und weil das so einfach ging, wurde gleich noch die Krümmung an der Hinterkante in die Optimierung miteinbezogen. Bei der bisherigen Implementierung des "Bezier-Matches" hatte sich gezeigt, dass bei S-Schlag-Profilen oder Profilen mit Rearloading (eben Profile mit Krümmungsumkehr) die Bezier-Optimierung gerne eine unschöne Krümmungsspitze an der Hinterkante erzeugt (Tobias, speziell auch für Dich 😉).

Jetzt aber: Optimierungsanlauf zum Dritten.

Nach einigen Sekunden und über 1000 Iterationen hat der ‚Nelder Mead Algorithmus‘ die hoffentlich perfekte Bezierkurven-Annäherung an unser MH30 gefunden. Die dann so aussieht:

Bezier_same_curvature_LE.png
Match-Foil-Funktion zweier Bezierkurven an das Profil MH30. Die Krümmung an der Nasenspitze beider Bezierkurven ist nun gleich der des Originalprofils. Durch den unstetigen Verlauf der Krümmung um die Nasenspitze und in der Nähe der Hinterkante beim Original MH30 kann (und soll) die Bezierkurve nicht hundertprozentig „matchen“.


Geschafft? Ich hoffe!

Mit dem Ergebnis bin ich nun recht zufrieden. Die mit Bezier-Kurven „nachgebauten“ Profile zeigen in xfoil durchweg hohe, bis sehr hohe Ähnlichkeit mit den Originalprofilen. Meist sind die Bezier-Polare runder, flüssiger, schöner anzuschauen als die der häufig numerisch unsauberen Ausgangsprofile.

Typisch dabei ist aber auch, dass das Bezier-Profil nicht ganz das ca-max des Ausgangsprofils erreicht, wo häufig „Krümmungsartefakte“ an der Nasenspitze noch einen extra xfoil-Punch geben - wie hier beim gezeigten MH30 oder auch bei einigen JX-Profilen (Asche auf mein gekrümmtes Haupt…)

Ich hoffe, mit diesem kleinen Ausflug in die Bezierkurven-Welt den ein oder anderen Zusammenhang rund um Profil-Approximation besser verständlich gemacht zu haben.

In diesem Sinn: Herzliche weihnachtliche Grüße 🎄

Jochen
 
Hallo Jochen,

vielen Dank für dieses tolle Werkzeug! Deinen Artikel hier hatte ich erst ziemlich spät hier gesehen und mit Freude gelesen, weil ich mich im PlanformCreator2 "verstrickt" hatte und dann darin, wie man die schöne elliptische Fläche, die man damit erzeugen kann, in Holz umsetzt. Ich werde berichten ....

Tolle Erklärung, vor allen der Grundlagen! Bisher habe ich Deinen Airfoil Editor "nur" aus dem PlanformCreator2 heraus benutzt und mich schon mal gefreut, dass man damit korrekt aufgedickte Endleisten für den Bau von Holz-Endleisten erzeugen kann und die Ergebisse als normales dat-file gespeichert.

Das hier jetzt, also die Bezier-Kurven und Deine Umsetzung, sind für mich so etwas wie "Kurvenlineal 2.0". Das lädt zum Expermentieren und Spielen mit vorhandenen Profilen ein. Vielleicht erwacht darin ein altes CJ5, das wahrscheinlich (?) mit Bleistift und Kurvenlineal 1.0 konstruiert wurde, zu neuem Leben in alten Modellen, die ja gerne nachgebaut werden. Oder es entstehen auf diesem Weg neue Profile? Nicht dass das CJ-5-Ergebnis ein modernes Nurflügelprofil schlagen würde und die modernen Methoden ersetzt, die die Experten hier sehr erfolgreich anwenden, aber vielleicht würde damit ein alter Holzflieger wie z.B. der Sif mit renoviertem CJ5-bezier.dat ein wenig leistungsfähiger und trotzdem "historisch korrekt"- ich spinne nur mal ;) ....

Egal, jedenfalls sehen die mit Bezier gezeichneten Profile sehr glatt und harmonisch aus. Wenn ich ein Luft-Molekül wäre, ich würde begeistert sein und bei Erreichen der Endleiste fröhlich ein wenig von hinten nachschubsen, um durch diesen "Vortrieb" den Widerstand noch etwas zu senken, höhö.

Danke für's Teilen und dafür, dass dieses Programm auch auf Linux läuft! Ich freue mich schon aufs Tüfteln damit.

Viele Grüße
Thomas
 

Jojo26

User
Hallo Thomas,

... das freut mich sehr, dass die Programme für Dich hilfreich sind 👍
So war's gedacht ...😉

Beim "Moleküle schubsen" musste ich grad dran denken: Für Profilberechnungen mit Xfoil (Xflr5) immer schön eine TE gap (trailing edge gap) von mindestens 0,03% setzen (siehe dazu den kleinen Xflr5-Ausflug ) damit die Moleküle auch etwas zum Schieben haben.

Und noch ein Tipp für den AirfoilEditor: Unter Windows kann man den die Dateiendung ".dat" mit 'AirfoilEditor.exe' verknüpfen. Dann genügt ein Doppelklick auf eine Profildatei, der Editor wird geöffnet und man kann schnell zu den weiteren Profilen in dem Verzeichnis blättern und vergleichen. Verwendet man die Python-Version des AifoilEditors packt man den Aufruf in einen einzeiligen Batch-Job und verknüpft den Batch-Job mit der Dateiendung.
(unter Linux müsste es etwas Ähnliches gebe - denke ich 😉)

Viele Grüße
 
Ansicht hell / dunkel umschalten
Oben Unten