mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Wie Sensordaten effektiver glätten?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: charles200 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bin gerade an einem regelungstechnischen Projekt, in dem ich einen 
Lego-Roboter auf 2 Rädern stabilisiere. Dazu wird ein Raspberry Pi mit 
Lego-Sensor/Aktuator-Interface verwendet.
Für die Messung des Winkels wird ein Lego Gyro-Sensor verwendet, der 
eine Sampling-Rate von 1 kHz und eine WInkelauflösung von 1° hat.

Der Sensor gibt neben dem absoluten Winkel auch die 
Winkelgeschwindigkeit aus, welche beide auch als Zustände definiert 
sind.

Ich habe nun das Problem, dass die Geschwindigkeitswerte sehr stark 
verrauscht sind. Bisher habe ich es so gehandhabt, dass ich den 
Differenzenquotienten der aboluten Winkeländerungen durch die 
Programmlaufzeit berechnet habe und darüber noch mal einen gleitenden 
Mittelwert gebildet habe (da die Auflösung sehr schlecht und die Werte 
daher groß sind). Also im Prinzip so (mit Python):
import time
from collections import deque

winkelwert_alt=0
liste=deque(maxlen=21)
while True:
  start=time.time
  
  s=(winkelwert_aktuell - winkelwert_alt)/abtastzeit   #Differenzenquotient
  winkelwert_alt=winkelrwert_aktuell
  liste.append(s)                                      #Erweitere Liste
  
  winkel_ableitung= sum(liste)/len(liste)           #gleitender Mittelwert
  
  ende=time.time
  
  if (ende-start)<0.01:
       time.sleep(0.01-(ende-start))   # feste Schleifenlaufzeit von 10 ms
     

Also ich bilde pro Schleifenschritt, der mit einer festen Abtastzeit von 
10 ms erfolgt den gleitenden Mittelwert über 21 Änderungswerte.
Das läuft so eigentlich auch ganz gut, ich habe aber das Problem, dass 
sich der Roboter nach einer längeren Zeit der Stabilisierung wieder 
selbst hochschaukelt und die Ableitungswerte schleichend wieder größer 
werden.
Ich möchte daher nun innerhalb der Schleife eine weitere Schleife 
realisieren, in der der Sensor mehrmals ausgelesen wird und somit mehr 
Werte pro Schritt zur Verfügung stehen.
Habt ihr noch bessere Vorschläge?

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn das Ding 1000 Ergebnisse pro Sekunde liefert warum sollte man dann 
nur 100 mal pro Sekunde abtasten? Man sollte das Potential hier schon 
ausnutzen.

Wenn er sich aufschaukelt liegt das vermutlich an zu großen 
Korrekturwerten oder der zu geringen Abtastrate, so das der Fehler zu 
spät bemerkt wird.

Autor: charles200 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich die Abtastrate erhöhe, kann man dann durch Bildung des 
gleitenden Mittelwerts eigentlich von einem Oversampling sprechen? Bin 
mir sowieso noch nicht im Klaren darüber, wie ich die Verzögerung für 
die Ausarbeitung formal modellieren soll, d.h. mit Zeitkonstanten etc.

Autor: wurster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mir erstmal ein paar Sekunden mit dem Gyrosensor aufzeichnen 
(Stillstand, periodische/chaotische Bewegung, etc.) und dann das Signal 
erstmal einer FFT unterziehen.

Da siehst du dann ganz schnell, was Nutzdaten und Störsignale sind.

Entsprechend würde ich mir ein digitales Filter auslegen.

Aber auch hier gilt: Shit in Shit out.

Das Signal sollte schon möglichst rein vom Sensor erfasst werden.

Autor: Roland P. (pram)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal einen Medianfilter. Du brauchst dazu ein sliding window mit 
den letzten 5 oder 7 Messwerten. Die Werte sortierst du und nimmst den 
mittleren.
Gruß Roland

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also mit der Abtrastrate würde ich an die Grenze dessen gehen was der 
Sensor hergibt, ansonsten verschenkst Du an der Stelle schon wertvolle 
Informationen.

Du sagst daß der "Gyro"-Sensor auch absolute Winkel ausgibt? Dann sind 
es eigentlich 2 Sensoren: Ein Accelerometer und ein Gyroskop. Die kannst 
Du mit einem Kalman-Filter fusionieren. Hat diese Sensorbaugruppe 
vielleicht schon irgendeine Art von Auswertung eingebaut die versucht 
eben dies bereits intern zu tun? Kommst Du auch irgendwie an die rohen 
Werte von Gyro und Accelerometer dran?

Autor: Hamburger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Roland P. schrieb:
> Probier mal einen Medianfilter. Du brauchst dazu ein sliding window mit
> den letzten 5 oder 7 Messwerten. Die Werte sortierst du und nimmst den
> mittleren.

Das gibt aber gewaltiges digitales Rauschen sagt mir mein Wissen aus der 
NT-Vorlesung!

Autor: Weg mit dem Troll ! Aber subito (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll gleitender Mittelwert ueber 20 Punkte, und solcher Scheiss ? 
Rechenzeit verbraten ?
Nimm ein exponential Average, resp ein tiefpass. Beides benoetigt eine 
Speicherstelle und vielleicht 5 Operationen pro Sample. Und dann lass 
das ganze so schnell laufen wie's geht.

Autor: Bernd K. (prof7bit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weg mit dem Troll ! Aber subito schrieb:
> Was soll gleitender Mittelwert ueber 20 Punkte, und solcher Scheiss ?
> Rechenzeit verbraten ?

Verbrät kein bisschen mehr Rechenzeit als ein EMA, nur ein bisschen mehr 
Speicher.

> Nimm ein exponential Average

Hat aber völlig andere Eigenschaften, vielleicht braucht er zwingend ne 
fixe endliche Step Response?

: Bearbeitet durch User
Autor: Manfred M. (bittbeisser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was soll gleitender Mittelwert ueber 20 Punkte, und solcher Scheiss ? Rechenzeit 
verbraten ?

Wenn er richtig programmiert wird, ist ein gleitender Mittelwert sehr 
effektiv. Kein anderer Tiefpass benötigt weniger Ressourcen! Allerdings 
ist die Umsetzung mit eine double ended Queue kontraproduktiv. Es genügt 
ein Ringpuffer fester Größe (Array) den man hier wohl selber verwalten 
muss.

Wenn man es richtig macht, benötigt jeder Arbeitszyklus nur eine 
Subtraktion, eine Addition und eine Division, und das unabhängig von der 
Anzahl der Werte. Den Ringpuffer benötigt man nur für die Subtraktion 
der alten Werte.

Aber da ich kein Java spreche, könnte ich das nur in C oder C++ zeigen.

Autor: ABC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manfred M. schrieb:
> Wenn er richtig programmiert wird, ist ein gleitender Mittelwert sehr
> effektiv. Kein anderer Tiefpass benötigt weniger Ressourcen!

Nee. Wenn egal ist ob IIR oder FIR: Ein EMA Filter ist wesentlich 
simpler.
y(t) = alpha * x(t) + (1 - alpha) * y(t-1)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.