Forum: Digitale Signalverarbeitung / DSP / Machine Learning Filter - aber welcher?


von Andreas S. (igel1)


Lesenswert?

Hi Leute,

ich steuere derzeit mit einem Beschleunigungssensor den Servo eines 
kleinen Roboterarms an (ist eher eine Art 2-achsen ´Gimbal - reines 
Spaßprojekt). Der schwenkt dann ein Kameramodul auf und ab.

Die Lage des Servos (und somit der Kamera) soll dabei derjenigen des 
Sensors folgen.

Richte ich den Sensor also in Richtung des Erdbeschleunigungsvektors 
aus,
so meldet mir der Sensor 9,81m/s^2 und ich steuere den Servo per PWM 
voll aus. Drehe ich den Sensor um 180 Grad, so erhalte ich -9,81m/s^2 
und ich steuere den Servo in die andere Richtung voll aus.

Ergebnis: die Drehbewegung des Servos folgt der Drehbewegung des 
Sensors.
So weit so gut.

Mein Problem:
Schon kleinste Zitterbewegungen des Sensors (den ich mit der Hand 
bewege) führen so großen Zitterbewegungen des Servos. Ich war erstaunt, 
wie stark die Auswirkungen sind.

Diese Zitterbewegungen möchte ich mit einem Filter unterdrücken.
Gleichzeitig soll der Servo aber immer noch gut und fix der Position
des Sensors folgen (max 1 Umdrehung pro Sekunde).

Welcher Filter eignet sich für solche Zwecke?
Kennt Ihr Freeware/Websites, um solche Filter einfach zu berechnen? 
(möglicherweise gar C-Code auszuwerfen?)

Letztlich möchte ich den Filter in C-Code auf meinem STM32F4-Discovery 
Board laufen lassen.

Habe vor 20 Jahren meinen letzten FIR-Filter designed - seitdem alles 
vergessen. Könnt Ihr mir einen guten Link zum Wieder-Einlesen in 
digitale Filter empfehlen Es gibt ja tausende Skripte im Netz - aber 
welches davon ist wirklich gut? Darf ruhig bei Adam und Eva beginnen und 
sehr ausführlich sein. Insbesondere saubere Herleitungen interessieren 
mich.

Würde mich über ein paar Tipps sehr freuen.

Viele Grüße

Igel1

: Bearbeitet durch User
von Andreas S. (igel1)


Lesenswert?

Hat keine eine Idee?

Oder habe ich mein Problem zu ungenau beschrieben?

Über ein paar gute Literaturtipps zu den Grundlagen und zum Design 
digitaler Filter würde ich mich auch schon freuen ...

Viele Grüße

Igel1

von Mirko W. (Gast)


Lesenswert?

Tut mir leid für die plumpe Antwort, aber würde dir nicht schon ein 
simples Tiefpassfilter reichen?

von N. G. (newgeneration) Benutzerseite


Lesenswert?

Hier mal eine kleine Auswahl (habe ich vor kurzem gelesen, war also das 
erste was mir einfiel)
Beitrag "Re: Kalman Filter in Bascom" (Muss natürlich 
kein Bascom sein)

Dort sieht man auch schön die unterschiedlichen Auswirkungen der 
verschieden Filter.
Aber ich denke auch, dass ein simpler Tiefpass reicht

von IMU (Gast)


Lesenswert?

Das Problem ist, dass du die Beschleunigung misst, aber eigentlich eine 
Drehung ausregeln willst. Das Zittern mag zwar nur kleine Auslenkungen 
hervorrufen, aber auch dabei können Beschleunigungen im Bereich 1g 
auftreten. Dazu kommt noch das Rauschen des Sensors. Sprich, jede 
translatorische Beschleunigung versaut das Ergebnis.
Da kann man sicher anfangen zu tiefpasszufiltern, aber um auf gute 
Ergebnisse zu kommen, wäre eine Kombination aus Beschleunigungssensoren 
und Drehratensensoren (IMU) plus Sensorfusion unabdingbar.
Hier wird das Problem noch einmal erläutert: 
https://www.youtube.com/watch?v=C7JQ7Rpwn2k

von Andreas S. (igel1)


Lesenswert?

@N.G.:  oh weh - Kalman war schwierig - den hatte ich schon vor 20 
Jahren kaum verstanden - würde ich gerne erst einmal umgehen.

@Mirko:  Jawohl - ein simpler Tiefpass war natürlich meine Intention 
(stelle gerade fest, dass ich das gar nicht erwähnt hatte). Aber welcher 
genau?  Butterworth, Chebyshev, Bessel, ... oder einfach nur FIR?

Außerdem hatte ich insgeheim auf eine 
Super-Easy-Filter-Strickmuster-Website oder gar einen simplen 
Code-Generator gehofft ...
Denn: wie gesagt - ich bin filtermäßig etwas "eingerostet".

@IMU:  Sehr interessant Deine Hinweise - genau wie das von Dir verlinkte 
Video. 1000 Dank für diesen Tipp. Da ich per Zufall einen Fusion-Mode 
Sensor einsetze, bislang aber nur einen Teil davon nutze und die 
Fusion-Technik gar nicht verwende, werde ich demnächst einmal den 
Fusion-Mode auch wirklich nutzen. Jetzt weiß ich ja, wofür der gut ist 
:-)

Vorab möchte ich (aus reinem Experimentierdrang) es trotzdem erst einmal 
mit einem Tiefpass versuchen.

Viele Grüße

Igel1

von Joe F. (easylife)


Lesenswert?

einfach zu implementieren ist der "state variable filter" (svf).

von Andreas S. (igel1)


Lesenswert?

Habt Ihr netterweise vielleicht noch einen Tipp auf eine Website,
mit der ich schnell zum Erfolg kommen kann?

Viele Grüße

Igel1

von Joe F. (easylife)


Lesenswert?


von Andreas S. (igel1)


Lesenswert?

Dankeschön für die Links - sieht gut aus ...
Müßte ich hinbekommen können.

Habt Ihr auch noch einen Tipp, mit welchem Tool man selbstgestrickte 
Filter gut und schnell außerhalb des Microcontrollers mal eben "trocken" 
testen kann?

Viele Grüße

Igel1

von Joe F. (easylife)


Lesenswert?

Andreas S. schrieb:
> Habt Ihr auch noch einen Tipp, mit welchem Tool man selbstgestrickte
> Filter gut und schnell außerhalb des Microcontrollers mal eben "trocken"
> testen kann?

Mit einem C-Compiler ;-)

Baue dir einen Sinus-Generator, den du in einer for-Schleife 
verschiedene Frequenzen erzeugen lässt.
Dieses Signal jagst du für einige Perioden lang durch deinen Filter, und 
bestimmst nach dem Filter die Amplitude.
Wenn du dann deinen Frequenzbereich durchgesteppt hast, weisst du, wie 
die Charakteristik deines Filters aussieht.

Man kann die Ausgabe des Testprogrammes z.B. als Tabelle in eine Datei 
schreiben, und sich dann in einer Tabellenkalkulation einen Plot 
basteln.

: Bearbeitet durch User
von Andreas S. (igel1)


Lesenswert?

Joe F. schrieb:
> Andreas S. schrieb:
>> Habt Ihr auch noch einen Tipp, mit welchem Tool man selbstgestrickte
>> Filter gut und schnell außerhalb des Microcontrollers mal eben "trocken"
>> testen kann?
>
> Mit einem C-Compiler ;-)
>
> Baue dir einen Sinus-Generator, den du in einer for-Schleife
> verschiedene Frequenzen erzeugen lässt.
> Dieses Signal jagst du für einige Perioden lang durch deinen Filter, und
> bestimmst nach dem Filter die Amplitude.
> Wenn du dann deinen Frequenzbereich durchgesteppt hast, weisst du, wie
> die Charakteristik deines Filters aussieht.
>
> Man kann die Ausgabe des Testprogrammes z.B. als Tabelle in eine Datei
> schreiben, und sich dann in einer Tabellenkalkulation einen Plot
> basteln.

Eeehrlich? Normalerweise beschwere ich mich ja nicht, wenn ich Hilfe 
suche und dann Ratschläge bekomme, aber dieser Tipp erscheint mir doch 
sehr aufwändig. Gibt's da wirklich nichts besseres?

Da waren wir vor 20 Jahren irgendwie schon weiter. Ich habe damals meine 
Filter mit Matlab simuliert - funktionierte wunderbar. Nur habe ich 
heute leider kein Matlab mehr (... und auch keine Ahnung mehr ... was 
vermutlich das Hauptproblem ist ...)

Viele Grüße

Igel1


PS:  das hier geht schon eher in die Richtung, die ich Suche:
http://www.micromodeler.com/dsp/

: Bearbeitet durch User
von Joe F. (easylife)


Lesenswert?

Andreas S. schrieb:
> aber dieser Tipp erscheint mir doch
> sehr aufwändig. Gibt's da wirklich nichts besseres?

Naja, also der Aufwand ist überschaubar.
Es sind 2 ineinander verschachtelte for-Schleifen,
die äussere für dein Frequenz-Stepping, die innere, um dein Signal für 
eine Weile laufen zu lassen.
Für den Sinus includest du math.h
Amplitude nach dem Filter einfach über Spitzenwert-Bestimmung 
herausfinden.

Das ganze garantiert dir halt, dass du exakt den Code testen kannst, der 
dann auf dem Mikrocontroller laufen soll.
Ansonsten bastelst du dir einen Filter in einem Tool, übersetzt den in 
C, da ist ein Fehler drin, und du wunderst dich, dass dein uC-Filter 
etwas ganz anderes macht als gewünscht...

: Bearbeitet durch User
von Stephan W. (swal)


Lesenswert?

Andreas S. schrieb:
> Habt Ihr auch noch einen Tipp, mit welchem Tool man selbstgestrickte
> Filter gut und schnell außerhalb des Microcontrollers mal eben "trocken"
> testen kann?

Ich benutze für sowas gerne Scilab.

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Matlab fuer Bargeldlose = GNU Octave

Gruss
WK

von Andreas S. (igel1)


Lesenswert?

Ahhhh - die letzten zwei Tipps von Stephan W. und DerGuteWeka (lustiger 
Name ...) passen vermutlich etwas besser für mich, denn ich möchte nicht 
nur das echte Signal, sondern auch den Amplituden- und Phasengang sehen 
können.

Danke dafür!

Wer noch eine speziell auf Filterdesign ausgelegte Freeware empfehlen 
kann: bitte ebenfalls hier melden.

Viele Grüße

Igel1

von Martin (Gast)


Lesenswert?

Matlab + Signal processing toolbox ist für Filterentwurf hervorragend. 
Für Privatleute gibt es m.E. bezahlbare Varianten. Aber etwas auf 
Kanonen mit Spatzen.

Kostenlos:

http://iowahills.com/
http://dspguru.com/dsp/links/digital-filter-design-software div. 
Testversionen

Wenn Du keine genauere Spezifikation hast, ist das aber alles für die 
Katz.

Wenns ein Buch sein darf:
http://www.dspguide.com/pdfbook.htm (sehr gut, auch in Papierform 
erhältlich)
Understanding DSP von Richard G Lyons (ebenfalls sehr gut)

Am besten wäre es, Du könntest noch einen Gyro dazuschalten 
(Drehratensensor) und den Winkel per Kalman-Filter ("Sensor fusion") 
kombinieren, s. auch Link in 4. Beitrag.... und ich seh grade, den 
Hinweis gab es oben schon...

Ich würde auch ganz einfach einen TP 1. Ordnung probieren. Einfach 
rekursiv (IIR) implementieren und mit der Zeitkonstante spielen. Oder 
einen gleitenden Mittelwert über n taps (FIR - was dann höherer Ordnung 
wäre, aber sei's drum)

- Martin

von Andreas S. (igel1)


Lesenswert?

Hi Leute,

wunderbar - ich sehe: Ihr steht noch voll im (Filter)saft.

Solche Beiträge zu lesen - das macht wirklich Spaß:
Martin hat ebenfalls noch wunderbare Tipps und Links spendiert - dickes 
Dankeschön dafür!

Mit allem zusammen sollte ich nun wirklich in der Lage sein,
das Ziel zu erreichen.

Jetzt muß ich nur noch Zeit freischaufeln und viel lesen.

1000 Dank nochmals an Euch alle!

Igel1

PS: Ihr hört dann von mir, wenn mein Filter funktioniert (kann aber ein 
paar Wochen dauern, da ich aktuell noch an anderen Baustellen aktiv bin)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.