Modellflug-Vario: Neues Rauschfilter für Entwickler

Hallo Modellflug-Vario-Entwickler,
zur Zeit habe ich ein neues Flugmodell-Variometer in der Erprobung; das Bild zeigt einen Prototyp, das ist ganz bestimmt noch nicht die endgültige Hardware (man sieht die Patches:-); vielen Dank an Ingo Stahl, ohne den das alles kaum zustande gekommen wäre. Als Drucksensor kommt der aktuelle MS5611 zum Einsatz. Das Gerät ist noch eine ziemliche Baustelle aber es fliegt bereits und macht richtig Freude.

Nun aber zum Grund, warum ich hier schreibe:
Besonders interessant an dem Ding ist die Art, in der die arg verrauschten Daten des MS5611 aufbereitet werden: Ich setze als Rauschfilter eine lineare Ausgleichsrechnung ein und lade andere Vario-Entwickler ein, sich das mal anzusehen.
Das Diagramm skizziert grob das Verfahren: Zu jedem Auswerte-Zeitpunkt wird in die "Wolke" der originalen, verrauschten Druckwerte eine Kurve gerechnet und an deren rechten Ende ausgewertet: Der Wert der Kurve ist der Druck und die Steigung der Kurve (rot) ist der Druckgradient.
Dieses ziemlich aufwändige Filter ist, in aller Bescheidenheit, anderen Methoden durchaus überlegen:
- Die Höhenberechnung ist hoch auflösend und hat Potenzial für richtig gute Geräte.
- die Vario-Berechnung weist eine erfreulich geringe "Ansprechzeit" auf,
- die Glättungsleistung ist durchaus befriedigend (100% geht nicht).
Die Mathematik hinter den Routinen ist etwas komplex und erfordert einen leistungsfähigen 32-Bit-uController, so wie er auch z.B. auf den neuen ARM-Arduinos zu finden ist.
Der uController LPC812 von NXP, den ich verwende, kommt mit dem Rechenaufwand bestens zurecht. Es werden weniger als 3 Millisekunden für eine Rechnung benötigt - ich war sehr erstaunt als ich die entsprechenden Messungen am LSA gesehen hatte.
Die Filter-Routinen belegen in meiner Implementierung nur etwa 3¼k Bytes Flash, darin enthalten sind die Altimeter- und Variometer-Routinen und der benötigte Teil der double-Arithmetik-Library. Die Anforderungen an den Datenspeicher sind kaum höher als als bei anderen Geräten dieser Art.

Ich habe die Absicht, diese Routinen frei zu geben (GPL oder sowas), sobald sie einen ausreichenden Qualitätslevel erreicht haben und rechtliche Fragen geklärt sind.

Derzeit sind die Routinen noch nicht öffentlich zugänglich, wer sich aber ernsthaft dafür interessiert und sich an der Erprobung beteiligen möchte, den lade ich ein, hier zu schreiben oder mich anzumailen (keine PN, die lese ich zu selten).
Für diese Interessenten gibt es 2 Arten von Dokumentation: Eine Beschreibung der eingesetzten Mathematik und eine doxygen-Doku der API ...und natürlich die C-Quellen.
Man kann die Routinen einfach benützen und (bessere) Varios damit bauen: Man muss ein Modul importieren (als C-Quelle), ein #define anpassen und ein paar Aufrufe programmieren. Ingo hat das heute innerhalb kürzester Zeit hingekriegt...
Oder man kann sich auch an der Weiterentwicklung der Routinen versuchen, das erfordert dann ein tieferes Einsteigen.
Es gibt durchaus noch was zu tun: Andere Vario-Hardware (eine Arduino-Referenz-Implementierung?) und viele Varios, auch für andere RC-Systeme als M-Link erstellen. Und Fehler rausmachen.
Mein Wunsch wäre, dass es Verbesserungen aus der Community gibt und nach einer gewissen Zeit sich niemand mehr Gedanken um die Aufbereitung der Druckdaten aus einem aktuellen Drucksensor machen muss, wenn er ein Modellflug-Vario bauen will...

Recht schöne Grüße aus Olching,
Helmut
 

Anhänge

  • kDevice812t.jpg
    kDevice812t.jpg
    50,8 KB · Aufrufe: 57
  • kÜberblick.png
    kÜberblick.png
    2,5 KB · Aufrufe: 45
Altimeter + Telemetrie

Altimeter + Telemetrie

Hallo Helmut,

Ich finde dein Beitrag sehr interessant. ich selber baue für mich auch gerade ein System mit Altimeter.
Es sind bei mir noch ein paar andere Sachen dabei, wie Strommessung der Antriebsakkus, Kompass, Beschleunigunssensor, Gyroskope, etc....

Aber gerade für das Altimeter habe ich ebenfalls bis dato unzufriedenstellende Ergebnisse gehabt. Ich verwende den BOSCH BMP085 Sensor.

Würde mich freuen, wenn du weiter berichtest...

Gruß
Oliver
 

Anhänge

  • image.jpg
    image.jpg
    104,2 KB · Aufrufe: 35
Hallo Oliver,
die Sachen sehen interessant und komplex aus, da hast Du Dir einiges vorgenommen... Ist das Ding neben/unter dem Hallsensor (mann, bin ich mutig heute :-) der BMP085?
Auch mein Gerät ist noch nicht fertig, Ziel ist ein Gesamtkunstwerk mit den wichtigsten Funktionen, ohne die ich mir kein einfaches Segelflugmodell mehr vorstellen mag: Höhe, Vario, ausführliche Energieüberwachung & Kleinzeug. Die nächste Bastelsaison kommt bestimmt.
Aber das ist ja nicht das Thema hier.

Was für einen Prozessor verwendest Du um den BMP085 auszulesen? Im Prinzip sind der BMP085 und der MS5611 ja sehr ähnlich, nur der BMP085 rauscht stärker. Wenn der Prozessor genug Luft hat wäre es interessant, mal das Filter mit dem anderen Sensor auszuprobieren.

Was für Echtzeit-Rahmenbedingungen hast Du?
Bei meinem Gerät ist der MSB tonangebend: Alle 100 ms einen neuen Steigwert ausrechnen, schneller zu sein hat keinen Sinn wenn man die Werte nicht anderswo auch noch braucht. Der Sensor kann etwa alle 20 bis 25 ms einen neuen Rohwert liefern. Daraus ergibt sich das Schema: 4 Rohwerte zu einem vorgefilterten Wert verdichten, eine Ausgleichsrechnung für 24 vorgefilterte Werte, nachfiltern.
Ingo verfolgt ein zum MSB asynchrones Zeitschema: So schnell wie möglich Rohwerte auslesen und wie gerade beschrieben filtern; damit erreicht er die höchste Datenrate: alle 80 ms ein neuer Steigwert. Der "Abnehmer" (auch bei ihm der MSB) kriegt dann den zuletzt berechneten Wert. Hier diktiert der Sensor MS5611 das Zeitchema.

Die 24 vorgefilterten Werte im Ausgleichsintervall bedeuten also, dass über 2 bis 2½ Sekunden "ausgeglichen" (in anderen Variometern "integriert", meist wohl gemittelt) wird. Dieses relativ große, aber optimale Intervall wirkt sich aber fast nicht negativ (verzögernd) aus, da die Auswertung strikt am rechten Rand, das ist "jetzt", erfolgt.

Ich schreib' einfach ins blaue... Ich will hier auch gerne konkrete Fragen beantworten.

Schöne Grüße,
Helmut
 
Hallo Helmut,

Yep, der kleine mit dem Loch ist der BMP085. Prozessor ist ein ATXMega128 der mit 32MHz läuft (RISC / eine Instruktion pro Takt)

Genau, 100ms Ausgabeinterval habe ich auch. Diese ist direkt an die Übertragung gekoppelt, da ich theoretisch bis 10x pro Sec. Daten übertragen kann. (Daten werden von der Ground-Unit angrefragt, die Flug-Unit anwortet mit passenden Daten).
Intern verarbeite ich mit 5ms, 20ms, 50ms bzw. 100ms. Mein Echtzeit-Scheduler kann (uns soll) nur diese 4 unterstützen.
Das bedeutet auch gleichzeitig, das alles was in diesen Timingfenstern läuft, auch in dieser Zeit fertig (5,20, 50, 100ms) berechnet sein muss.

Nebenbei gesagt: Ich verwende keine Interrupts (mehr), nur (noch) Timer !

Da ich beim BMP085, die werte derzeit auch integriere, kann ich ca. 5 Werte pro 100ms bekommen.
Zusätzlich habe ich einen kleinen round-robin-Buffer für 9 Werte. Alle 9 Werte (egal ob alt oder neu) werden nach Wertigkeit "sortiert".
Der Wert "5" ist mein Ausgabewert (Abtastfenster), der mit bis zu 10x pro Sekunde übertragen werden kann.
Dieses Vorgehen, sichert mir zu, das die Werte agil sind, das quasi sofort Werte zur Verfügung stehen. Der erste komplett gefilterter Wert braucht 200ms, jeder weitere nur noch 20ms

Oh ! ...so ich muss nu zur Arbeit ! bis später....

Gruß
Oliver
 
Ansicht hell / dunkel umschalten
Oben Unten