GRobot.gr Το χόμπι της Ρομποτικής στην Ελλάδα

Φιλτράρισμα Δεδομένων Αισθητήρων με ένα φίλτρο Kalman PDF Εκτύπωση E-mail

Στην προσπάθεια να διαβάσω μετρήσεις από διάφορους αισθητήρες όπως επιταχυνσιόμετρα, μετρητές απόστασης και GPS βρέθηκα στη θέση όπου τα δεδομένα μου περιείχαν πολύ θόρυβο για να τα χρησιμοποιήσω όπως είναι.

Για παράδειγμα ένα gps έχει ακρίβεια 10m, άρα σε κάθε μέτρηση μπορεί να έχει πολύ μεγάλη απόκλιση από την πραγματική θέση. Μπορεί δηλαδή να είμαστε εντελώς ακίνητοι αλλά λόγο της διαφορετικής μέτρησης να φαίνεται σα να κινούμαστε.

Πρέπει λοιπόν να βρούμε έναν τρόπο να απορρίπτουμε τις απότομες αλλαγές (θόρυβο) αλλά ταυτόχρονα να αντιλαμβανόμαστε έγκαιρα τις πραγματικές αλλαγές.


Μετά από κάποια ανεπιτυχή αποτελέσματα με χαμηλοπερατά φιλτρα επέλεξα να χρησιμοποιήσω ένα φίλτρο kalman. Το φίλτρο Kalman περιλαμβάνει πολλά περίπλοκα μαθηματικά αλλά, ευτυχώς, χρειαζόμουν ένα απλό μονοδιάστατο Kalman Filter χωρίς καμία πληροφορία οδήγησης, γεγονός που καθιστά την κατασκευή πολύ ευκολότερη.

Εφαρμογή του φίλτρου Kalman
Εάν κοιτάξετε τους μαθηματικούς τύπους των φίλτρων kalman θα δείτε ότι απαιτούν πολλούς υπολογισμούς με πίνακες και διανυσματικά μαθηματικά. Αλλά μετά από λίγο ψάξιμο κατέληξα ότι ένα απλό μονοδιάστατο φίλτρο θα έκανε την δουλεία. Για να χρησιμοποιηθεί σε ένα acceloremeter 3 αξόνων μπορούν να συνδυαστούν 3 μονοδιάστατα φίλτρα.

Έτσι καταλήγουμε σε αυτό το μικρο τύπο:

x = x;
p = p + q;
k = p / (+ p r);
x = x + k * (μέτρηση - x);
p = (1 - k) * p;

Οι δύο πρώτοι τύποι αντιπροσωπεύουν την πρόβλεψη του Kalman Filter. Και δεδομένου ότι δεν υπάρχει καμία πληροφορία σχετικά με τις κινητήριες δυνάμεις είναι πολύ απλό. Ο δεύτεροι, τρεις τύποι, υπολογίζουν την ανανεωση των μετρήσεων. Οι μεταβλητές είναι x για το φιλτραρισμένο αποτέλεσμα, q για το θόρυβο της διεργασίας, r για το θόρυβο από τον αισθητήρα, p για το εκτιμώμενο σφάλμα και k για το κέρδος Kalman. Η κατάσταση του φίλτρου καθορίζεται από τις τιμές αυτών των μεταβλητών.

Το φίλτρο εφαρμόζεται σε κάθε μέτρηση και αρχικοποιείται με τον θόρυβο της διεργασίας q, r θόρυβος του αισθητήρα, αρχική εκτίμηση λάθους p και η αρχική τιμή x. Η αρχική τιμή για το p δεν είναι πολύ σημαντική, δεδομένου ότι προσαρμόζεται κατά τη διάρκεια της διαδικασίας. Πρέπει να είναι όμως αρκετά υψηλή για να περιοριστεί αργότερα Η αρχική τιμή για την μέτρηση δεν είναι επίσης πολύ σημαντική, δεδομένου ότι ανανεώνετε κατά τη διάρκεια της διαδικασίας.

Αλλά η ρύθμιση των τιμών για το θόρυβο της διεργασίας και του θορύβου του αισθητήρα είναι απαραίτητη για να πάρετε σαφείς και "καθαρές" μετρήσεις.

Ρύθμιση τιμών στο φίλτρο Kalman
Τα πρώτα αποτελέσματα ήταν αρκετά μακρυά από τα ιδανικά Γι 'αυτό και αποφάσισα να χρησιμοποιήσω για επεξεργασία την παλιά καλή μου πλακέτα ανάπτυξης LIS302DL ώστε να πάρω κάποια εικόνα για το βέλτιστο τιμών των διαφόρων παραμέτρων:

Πρώτα κοίταξα την σημασία του q θορύβου διεργασίας, ξεκινώντας από μια πολύ υψηλή τιμή των 128 (που είναι η μέγιστη απόδοση του επιταχυνσιομέτρου):


Βλέπετε σχεδόν δεν υπάρχει διαφορά μεταξύ των φιλτραρισμένων δεδομένων (λευκό) και τα αρχικά δεδομένα (γκρι) - δεδομένου ότι βλέπετε μόνο τη λευκή γραμμή.
Αν χαμηλώσουμε το θόρυβο διεργασίας, π.χ. σε μια τιμή του 4 τα πράγματα αρχίζουν να αλλάξουν:


Αν κοιτάξετε προσεκτικά θα δείτε ότι τα δεδομένα του αισθητήρα συχνά υπερβαίνουν την τιμή του φίλτρου. Η φιλτραρισμένη τιμή είναι πολύ κοντά στην πραγματική τιμή, αλλά έχει πολύ θόρυβο ακόμη.
Για την εφαρμογή μου χρειάζεται μια πιο σταθερή έξοδος, εξομαλύνοντας σχεδόν όλο το θόρυβο, με αποτέλεσμα ένα καθαρό και σταθερό σήμα. Έτσι ας χαμηλώσουμε την τιμή του θορύβου διεργασίας λίγο περισσότερο, π.χ. κάτι σε 0,125:


Τώρα έχουμε ένα πολύ καθαρό σήμα από μια αρκετά θορυβώδη πηγή. Υπάρχει μια μικρή καθυστέρηση από τα πραγματικά δεδομένα, αλλά δεν είναι κρίσιμη για την εφαρμογή μου. Σε σύγκριση πάντα με το ποσό της μείωσης του θορύβου, είναι ακόμη αρκετά γρήγορη απόκριση.

Μετά από αυτό ας παίξουμε λίγο με το θόρυβο του αισθητήρα r:
Ξεκινάμε στο r = 1:


Όπως ήταν αναμενόμενο αν χαμηλώσουμε τον εκτιμώμενο θόρυβο του αισθητήρα, το φίλτρο Kalman, «στηρίζεται» περισσότερο στα δεδομένα του αισθητήρα και δίνει πιο θορυβώδη αποτελέσματα. Αν αυξηθεί ο συντελεστής θορύβου του αισθητήρα σε 4 έχουμε ένα πιο σταθερό αποτέλεσμα και πάλι:


Αν πάμε σε μια ακραία τιμή με ένα επίπεδο θορύβου των 32 θα έχουμε το αναμενόμενο σταθερό αποτέλεσμα:


Όπως ήταν αναμενόμενο η φιλτραρισμένη τιμή υστερεί σημαντικά έναντι των πραγματικών μετρήσεων. Αλλά είναι ένα πολύ καθαρότερο σήμα. Είναι όμως αμφίβολο αν αυτό εξακολουθεί να είναι χρήσιμο.

Εφαρμογή Kalman σε C

Εφαρμογή αυτού του φίλτρο σε κωδικά C (π.χ. για ένα Arduino) είναι αρκετά απλή. Πρώτα απ' όλα ορίζουμε μια δομή για το φίλτρο Kalman:

typedef struct {
double q; //process noise covariance
double r; //measurement noise covariance
double x; //value
double p; //estimation error covariance
double k; //kalman gain
} kalman_state;

Στη συνέχεια, χρειαζόμαστε μια ρουτίνα για να αρχικοποιηθεί το φίλτρο Kalman:

kalman_state kalman_init(double q, double r, 
double
p, double intial_value)
{
kalman_state result;
result.q = q;
result.r = r;
result.p = p;
result.x = intial_value;
 
return result;
}

Και μια ρουτίνα για να ανανεώνεται η κατάσταση του φίλτρου, υπολογίζοντας μια πρόβλεψη και κάνοντας μια επαλήθευση με την πραγματική μέτρηση:

void kalman_update(kalman_state* state, double measurement)
{
//prediction update
//omit x = x
state->p = state->p + state->q;
 
//measurement update
state->k = state->p / (state->p + state->r);
state->x = state->x + state->k * (measurement - state->x);
state->p = (1 - state->k) * state->p;
}

Τι μαθαίνουμε από αυτό;
Πρώτα απ 'όλα το φίλτρο Kalman μπορεί να είναι ευκολότερο να εφαρμοστεί, εάν το υποκείμενο μοντέλο είναι απλό. Δεν είχαμε πολλές διαστάσεις, ούτε διαφορετικά δεδομένα από αισθητήρες για να συνδυάσετε. Τα αποτελέσματα είναι αρκετά καλά, αλλά είναι μια πρόκληση να βρούμε τις σωστές τιμές για τη διεργασία και το θόρυβο του αισθητήρα. Αντί απλώς να καταλήξουμε σε κάποιες εικασίες για τις τιμές, μπορεί φυσικά να υπολογιστούν, αλλά θα πρέπει να αρκεστούμε με το αποτέλεσμα της εκτίμησης.

Συνοψίζοντας αυτό είναι ένα καλό, εύρωστο και απλό φίλτρο (μίας διάστασης).

Νομίζω ότι στην περίπτωση που θέλατε να εξομαλύνεται τα αποτελέσματα μετρήσεων αισθητήρων ένα τέτοιο φίλτρο είναι ιδανικό.
Ή μήπως υπάρχει ένα πολύ πιο εύκολο στη χρήση φίλτρο για το πρόβλημά μου, που οδηγεί σε καλύτερα αποτελέσματα;
Ενδεικτικά αναφέρω το Moving average filter.

Επίσης να θυμάστε οτι ο καλύτερος τρόπος για να αφαιρέσουμε το θόρυβο από τις μετρήσεις μας είναι να αποφύγουμε το θόρυβο εξαρχής!

Προσέξτε τις γειωσεις και τις ενώσεις των καλωδίων, ενώ πολλές φορές τα αποτελέσματα μπορούν να βελτιωθούν σημαντικά κάνοντας χρήση απλών πυκνωτών εξομάλυνσης που είναι εξαιρετικά φθηνοί και δε θα σπαταλήσουν άδικα την πολύτιμη επεξεργαστική ισχύ του ελεγκτή σας.

Συντάκτης: -=karpa=-
http://www.mechatronics.gr


Tο άρθρο είναι βασισμένο απο το Αγγλικό κείμενο εδώ: http://interactive-matter.org/2009/12/filtering-sensor-data-with-a-kalman-filter/

Σχόλια (6)add comment

Tricky Nekro said:

Θεός... δε λέω τπτ άλλο...
Ιούνιος 04, 2010

planmix said:

Μπράβο, πολύ απλό και χρήσιμο.
Να συμπληρώσω, ότι αν κάποιον τον ενδιαφέρει μια πιο πολύπλοκη λύση στο πρόβλημα, μπορεί να χρησιμοποιήσει πολυώνυμα (βλέπε φίλτρο Savitzky-Golay)
Μια εξίσωση 7 σημείων στην απλή της μορφή θα μοιάζει έτσι:
yt = (-2xt-3 + 3xt-2 + 6xt-1 + 7xt + 6xt+1 + 3xt+2 - 2xt+3)/21
Ιούνιος 04, 2010

arximidis said:

Μάλλον θα εννοείς
y(t) = [-2x(t-3) + 3x(t-2) + 6x(t-1) + 7x(t) + 6x(t+1) + 3x(t+2) - 2x(t+3)]/21
όπου χρησιμοποιείς προηγούμενες και επόμενες τιμές της εισόδου. Κλασικό φιλτράρισμα στο πεδίο του χρόνου (και δε θα έλεγα ότι είναι τόσο προχωρημένο ή πολύπλοκο). Το έχω κάνει άπειρες φορές σε εικόνες κυρίως (χρησιμοποιώντας δυσδιάστατους πίνακες). Ανάλογο με τις τιμές των συντελεστών (αλλά και το εύρος του παραθύρου) μπορείς να πετύχεις διάφορα φίλτρα - effects (εξομάλυνση, όξυνση, edge detection και πολλά άλλα).

Υ.Γ. Πολύ ωραίο το άρθρο σου karpa, μπράβο !!! (αν και μένεις σε πολύ θεωρητικό επίπεδο)
Ιούνιος 05, 2010

arximidis said:

Ωστόσο πιστεύω ότι με ένα φίλτρο σαν αυτό που προτείνει ο planmix θα έκανες ευκολότερα τη δουλειά σου.
Πάντως και μόνο που μπήκες στον κόπο να υλοποιήσεις φίλτρο Kalman λέει πολλά. Μπράβο και πάλι
Ιούνιος 05, 2010

Paulos said:

αν εχεις να κανεις με εικονες ή πινακες(και offline επεξεργασια) το καταλαβαινω να χρησημοποιησεις το φιλτρο που λετε(αν και δε το εχω δοκιμασει). Αλλα αν εχεις μετρησεις realtime δεν εχεις μελοντικες τιμες και με παραγωγο 6 βαθμου (να παραγωγισεις εννοω 3 φορες ωστε να φυγουν οι μελλοντικες τιμες) δε μου γεμιζει οτι θα ειναι φιλτρο με γρηγορη αποκριση..
Σε μετρησεις μου παντως το παραπανω φιλτρο καλμαν το βρηκα πανευκολο στη χρηση και πολυ αποτελεσματικο. Το χρησημοποιησα μαλιστα σε μια εφαρμογη με image tracking και ειχε πολυ καλο αποτελεσμα.. γι'αυτο θα πω περισσοτερα αργοτερα..
Ιούνιος 10, 2010

john said:

ξερει κανεις πως θα μπορουσα να κανω ενα ξεκινημα σε επεξεργασια εικονας? εχει κανενα βιβλιο η σιτε σχετικα με την εισαγωγη στα φιλτρα? απο σχετικα χαμηλο επιπεδο αντικειμενοστραφους προγραμματισμου?
Αύγουστος 15, 2010

Γράψτε σχόλιο
Πρέπει να συνδεθείτε για να στείλετε ένα σχόλιο. Παρακαλώ καταχωρήστε λογαριασμό εάν δεν έχετε έναν.

busy
 

Online...

Έχουμε 28 επισκέπτες και 8 μέλη συνδεδεμένους
  • nick-themachine
  • Tricky Nekro
  • steliosm
  • efrag
  • dikos
  • aleksoulis
  • toborg

Πρόσφατα σχόλια…

Athens Digital Week 2010
Μανώλη σε ευχαριστούμ...
Athens Digital Week 2010
ΕΠΕΙΓΟΝ Θα ήθε...
Athens Digital Week 2010
...κάτι μου λέει ότι θα ...
Athens Digital Week 2010
+1, και line-follower και sumo
Athens Digital Week 2010
Μέσα! +1
Athens Digital Week 2010
Παιδες τους διαγωνισμ...
GRoboduino - Ολοκληρωμένη Μ...
Το δοκίμασα και ενθουͮ..
Athens Digital Week 2010
Ο νικητής του ADW'08 (line-fo...
Athens Digital Week 2010
aheha ετσι! +1 άντε να μαζ̮..
Athens Digital Week 2010
Για έναν σοβαρό διαγω̮..
Athens Digital Week 2010
Μεταφέρω την ερώτηση ͮ..
Athens Digital Week 2010
... περιμένω... (ρε Δήμο ̮..
Athens Digital Week 2010
α! και ο τρόπος αξιολό̮..
Athens Digital Week 2010
Καλημέρα παίδες. Για ν...
Athens Digital Week 2010
Μετριοπάθεια.. οκ ίσως...

Επισκεφτείτε…


Δείτε στο Forum...

  • 03/09/2010 10:19 R2-D2 (planmix)
  • 02/09/2010 13:33 R2-D2 (dikos)
  • 02/09/2010 12:45 R2-D2 (lucky13)
  • 02/09/2010 11:37 R2-D2 (manos)




Βρίσκεστε εδώ  : Κεντρική Σελίδα Άρθρα Φιλτράρισμα Δεδομένων Αισθητήρων με ένα φίλτρο Kalman

Επικοινωνία

info@grobot.gr

fax: 2105200006