Ein Sensor tastet eine Oberflaeche ab und gibt mir ein zweidimensionales Array mit x/y-Koordinaten aus. Diese Daten sollen zyklisch aufbereitet und ausgewertet werden (Abstaende zwischen bestimmten Punkten, Mittelpunkte etc). Das Hauptproblem sind nicht immer vermeidbare Reflexionen, die sich als Ausreisser im Array aeussern. Wenn ich zB den tiefsten Punkt der Oberflaeche suche und einzelne Pixel 1cm unter der Oberflaeche auftreten, ist das Ergebnis einer einfachen Suche nach dem tiefsten Punkt wertlos. Mein aktueller erster Ansatz ist, eine Kurve durch die Punkte zu legen, einzelne Stoerpixel beeinflussen das Ergebnis nicht, ich kann das Minimum in der Kurve bestimmen und habe meine gewuenschte Position. Bei groesster Sensoraufloesung (640 Wertepaare) schaffe ich so etwa 3,5 Berechnungen pro Sekunde auf einem Core2Duo, ohne die Glaettung ein paar zehntausend. Mehr als 85 Berechnungen/Sekunde muss ich nicht schaffen, weil ich andere Daten nicht schneller bekommen kann, natuerlich waer eine moeglichst sparsame Berechnung erstrebenswert. Ich weiss immer, wie die Oberflaeche aussieht (zB konkav, konvex, V-foermiger Spalt...). Wie geht man so ein Problem grundsaetzlich an, wie idealisiere ich meine Messdaten effizient so, dass wichtige Details erhalten bleiben und ausgewertet werden koennen?
Such mal nach Median Filter. 640 Wertpaare prüfen in ca. 0.3s? WOW! Das ist doch schon mal ein Anfang. :)
Naja, 640 Wertepaare pruefen... Im Groben habe ich eine For-Schleife, die 640x durchlaufen wird. Darin werden ein paar kleinere Dinge und die lineare Regression berechnet, ausserdem eine weitere For-Schleife, die auch 640x durchlaufen wird und ein paar Koeffizienten berechnet. Ich schau mir den Median-Filter mal an, testen kann ich erst morgen wieder.
Wenn für die Kurve ein vermuteter Zusammenhang y*=f(x) existiert, kann die "Methode der kleinsten Quadrate", also die Minimierung des Erwartungswerts der Energie des Schätzfehlers y-y* nach den variablen Parametern des funktionalen Zusammenhangs f(x) angewandt werden. Hier ist das für einen linearen Zusammenhang gut beschrieben http://de.wikipedia.org/wiki/Methode_der_kleinsten_Quadrate#Spezialfall_einer_einfachen_linearen_Ausgleichsgeraden Ansonsten willkommen in der wunderbaren Welt der (statistischen) Datenaufbereitung, wir haben da ein ganz reichhaltiges Sortiment. Ebenfalls anwendbar sind Maximum-Likelihood-Ansätze: http://de.wikipedia.org/wiki/Maximum-Likelihood-Methode Kalman-Filter: http://de.wikipedia.org/wiki/Kalman-Filter Und wenn man aufgrund der Zeitvorgaben nicht mit allen Werten rechnen kann, gibt es noch die Monte-Carlo-Ansätze: http://de.wikipedia.org/wiki/Monte-Carlo-Simulation Ich würde die Verfahren erstmal mit den rohen Meßdaten in einem MatLab(Clone) untersuchen.
Radial Basis Functions? http://graphics.stanford.edu/courses/cs468-03-fall/Papers/carr-beatson-etal-siggraph01.pdf http://en.wikipedia.org/wiki/Hierarchical_RBF
Ich habe ein wenig mit einem Medianfilter gespielt. Bei kleinen Fehlern arbeitet er wunderbar und vorallem sehr schnell (<1ms pro Array), bei ernsten Reflektionen versagt er oder frisst (bei grosser Samplebreite) zuviel Details weg. Als Vorfilter ist er brauchbar, aber danach muss noch mehr kommen. Ich werde kommende Woche weiter probieren.
Die c't hatte vor vielen Jahren einen Artikel über den von der NASA verwendeten Ausreißererkennungsfilter für die aus verschiedenen Gründen mit einigen Ausreißerpixeln versehenen Bilder der Marssonden. Das Grundprinzip war, wenn ich mich richtig erinnere: 1. Man ordnet die Pixel in einem fünfdimensionalen Raum an (also x, y, R, G, B als gleichberechtigte Koordinaten; bei dir gibt es eben nur zwei) 2. Man fängt bei jedem Pixel an, größerwerdende konzentrische Hyperkugeln um den Pixel zu ziehen und nimmt die Kurve "in der Kugel enthaltene Pixel" gegen "Kugelradius" auf. 3. Je nachdem, ob es sich um einen Ausreißer handelt, ergibt sich ein charakteristischer Kurvenverlauf. Ist natürlich, wenn Echtzeit gefordert wird, je nach verfügbarer Rechenleistung etwas heftig, aber in einer vereinfachten Variante (z.B. bei jedem Punkt nur Radius n betrachten und prüfen, ob m Punkte im Kreis enthalten sind, wobei m und n einmal irgendwie eingestellt werden müssen) vielleicht gerade noch umsetzbar.
Ich habe einige Zeit am System weitergearbeitet. Unabhaengig von der Vorfilterung brauche ich eine geometrische Auswertung, die Suche nach einem tiefsten Punkt etc ist nicht mehr ausreichend. Ich moechte die Sensordaten nach Vorgabe automatisch geometrisch beschreiben. Ich sage also, dass ich beispielsweise einen V-foermigen Spalt in einer Ebene abtaste, ich erhalte Oeffnungswinkel und Tiefe. Ich gebe eine halbrunde Erhebung auf einem Bogen vor, ich erhalte Durchmesser und Hoehe der Erhebung, usw. Die Berechnung muss dabei wie gesagt robust gegen Reflektionen sein. Die sehen wirklich so aus wie sie klingen: Im Punktarray fehlen an der richtigen Position Punkte, sie liegen in der gespiegelten Kopie der Daten, quasi heruntergeklappt. Welcher Buecher soll ich kaufen, wo finde ich einen Anfang?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.