| Φιλτράρισμα Δεδομένων Αισθητήρων με ένα φίλτρο Kalman |
|
|
|
|
Στην προσπάθεια να διαβάσω μετρήσεις από διάφορους αισθητήρες όπως επιταχυνσιόμετρα, μετρητές απόστασης και GPS βρέθηκα στη θέση όπου τα δεδομένα μου περιείχαν πολύ θόρυβο για να τα χρησιμοποιήσω όπως είναι. Εφαρμογή του φίλτρου 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 { Στη συνέχεια, χρειαζόμαστε μια ρουτίνα για να αρχικοποιηθεί το φίλτρο Kalman: kalman_state kalman_init(double q, double r, Και μια ρουτίνα για να ανανεώνεται η κατάσταση του φίλτρου, υπολογίζοντας μια πρόβλεψη και κάνοντας μια επαλήθευση με την πραγματική μέτρηση: void kalman_update(kalman_state* state, double measurement) Τι μαθαίνουμε από αυτό;
Set as favorite
Bookmark
Email This
Hits: 693 Σχόλια (6)
![]()
planmix
said:
|
|
Μπράβο, πολύ απλό και χρήσιμο. Να συμπληρώσω, ότι αν κάποιον τον ενδιαφέρει μια πιο πολύπλοκη λύση στο πρόβλημα, μπορεί να χρησιμοποιήσει πολυώνυμα (βλέπε φίλτρο Savitzky-Golay) Μια εξίσωση 7 σημείων στην απλή της μορφή θα μοιάζει έτσι: yt = (-2xt-3 + 3xt-2 + 6xt-1 + 7xt + 6xt+1 + 3xt+2 - 2xt+3)/21 |
|
Μάλλον θα εννοείς 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, μπράβο !!! (αν και μένεις σε πολύ θεωρητικό επίπεδο) |
|
Ωστόσο πιστεύω ότι με ένα φίλτρο σαν αυτό που προτείνει ο planmix θα έκανες ευκολότερα τη δουλειά σου. Πάντως και μόνο που μπήκες στον κόπο να υλοποιήσεις φίλτρο Kalman λέει πολλά. Μπράβο και πάλι |
|
αν εχεις να κανεις με εικονες ή πινακες(και offline επεξεργασια) το καταλαβαινω να χρησημοποιησεις το φιλτρο που λετε(αν και δε το εχω δοκιμασει). Αλλα αν εχεις μετρησεις realtime δεν εχεις μελοντικες τιμες και με παραγωγο 6 βαθμου (να παραγωγισεις εννοω 3 φορες ωστε να φυγουν οι μελλοντικες τιμες) δε μου γεμιζει οτι θα ειναι φιλτρο με γρηγορη αποκριση.. Σε μετρησεις μου παντως το παραπανω φιλτρο καλμαν το βρηκα πανευκολο στη χρηση και πολυ αποτελεσματικο. Το χρησημοποιησα μαλιστα σε μια εφαρμογη με image tracking και ειχε πολυ καλο αποτελεσμα.. γι'αυτο θα πω περισσοτερα αργοτερα.. |
| ξερει κανεις πως θα μπορουσα να κανω ενα ξεκινημα σε επεξεργασια εικονας? εχει κανενα βιβλιο η σιτε σχετικα με την εισαγωγη στα φιλτρα? απο σχετικα χαμηλο επιπεδο αντικειμενοστραφους προγραμματισμου? |

