LabVIEWForum.de
2D-Interpolation - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: 2D-Interpolation (/Thread-2D-Interpolation)

Seiten: 1 2 3


2D-Interpolation - Achim - 06.02.2014 12:58

Hallo,
ich steh' auf dem Schlauch...

Ein PSD (Position Sensing Detector) liefert jeweils ein X- und Y-Signal, abhängig von der Position, wo ein Laserstrahl die Sensoroberfläche trifft.

Es handelt sich um folgenden Sensor:
http://www.lasercomponents.com/fileadmin/user_upload/home/Datasheets/sitek/2l45_su24.pdf

Die Position soll in der Einheit mm ermittelt werden, d.h. es muss eine Skalierung bezogen auf die physikalischen Sensorabmessungen (hier: 45x45 mm, d.h. +- 22,5 mm) erfolgen.

Über einen Vorverstärker liefert der Sensor jeweils für die X- und Y-Richtung ein Signal zwischen -10V und + 10V, welche mit einer DAQ-Karte erfasst werden. Soweit so gut...leider ist der Sensor nicht linear, insbesondere zum Rand hin wir das Signal "schlechter". Theoretisch sollte bei linearem Verlauf folgendes gelten:

Sensormitte: X= 0 V, Y= 0 V, d.h. Pos. X = Pos. Y = 0 mm
linker Rand, Mitte: X = -10 V, Y= 0 V, d.h. Pos X = -22,5 mm, Pos. Y = 0 mm
rechter Rand, Mitte: X = 10 V, Y = 0V
obere Kante, Mitte: X = 0 V, Y = 10 V
untere Kante, Mitte: X = 0 V, Y = -10 V
linkes oberes Eck: X = -10V, Y = 10 V
rechtes unteres Eck: X = 10V, Y = -10 V
usw. usw.

Weil das aber nicht linear verläuft, soll über eine Interpolation der konkreten X-Y-Spannungs-Messwerte anhand von zuvor erstellten "Look-Up-Tables" der Positionswert ermittelt werden. Dazu würde der bestrahlende Laser z.B. über eine genaue Positionierung um bekannte Werte entlang der X- bzw. Y-Richtung verschoben. Zu jedem Positionswert wäre dann ein Spannungswert verfügbar, wie folgende Tabellen beispielhaft zeigen:
[attachment=48399]

Ich weiß, es gibt das Interpolate 2D.vi, aber ich steige da mit den vielen Ein-/Ausgängen nicht durch...Kann mir da jemand weiterhelfen? Wie bekomme ich für ein konkretes XY-Spannungswerte-Paar die entsprechenden mm-Werte...siehe das angehängte (fast leere) VI mit den oben gezeigten Werten?
[attachment=48400]

Gruß
Achim


RE: 2D-Interpolation - GerdW - 06.02.2014 14:30

Hallo Achim,

- Warum hast du für X- und Y-Positionen jeweils 2D-Arrays? Reicht da nicht ein 1D-Array aus?
Bsp.:
Du hast da ein 2D-Array mit X-Positionen, die aber zeilenweise gleich sind. Das zugehörige Array mit den X-Spannungswerten ist aber zeilenweise verschieden. Wie ist da die Abbildungsfunktion zu? Warum habe ich bei identischen X-Positionen unterschiedliche X-Spannungen? Welche Bedeutung hat der Zeilenindex bei beiden Arrays?
Bei den Y-Arrays das gleiche, nur spaltenweise…
- Was sind die erwarteten Ausgangswerte? Momentan steht im VI bei "Messwert in mm" nur der selbe Wert wie in "Messwert in V"…

Das Interpolate2D erwartet ein einzelnes Z-2D-Array und zwei zugehörige X-/Y-1D-Arrays. Kannst du aus den beiden X- und Y-Messwerten einen eineindeutigen Z-Wert generieren?


RE: 2D-Interpolation - Lucki - 06.02.2014 19:43

Habe das schon mal gemacht, heute ist es aber zu spät und morgen habe ich keine Zeit. Also wenn Du etwas Geduld hast..


RE: 2D-Interpolation - Achim - 07.02.2014 08:41

(06.02.2014 14:30 )GerdW schrieb:  - Warum hast du für X- und Y-Positionen jeweils 2D-Arrays? Reicht da nicht ein 1D-Array aus?

Also...für jede beliebige Stelle auf dem PSD kann man zwei Werte messen, einen für die X-Position und einen für die Y-Position.
Wenn man jetzt der Breite nach (also entlang der X-Achse) wandert, kann man man "viele" X-Spannungen messen. Wenn man das vertikal erweitert, misst man z.B. an der Oberkante eine X-Spannung, in der Mitte eine X-Spannung und an der Unterkante eine X-Spannung. Beliebig feine Zwischenschritte sind möglich. Und für jeden Schritt gibt es halt nicht nur die X-Spannung, sondern auch die Y-Spannung...

Ich hab hier nochmal ne kleine Tabelle gebastelt, die die Positionen auf der Sensoroberfläche angibt. Die roten Zahlen kennzeichnen jeweils die Mitte von X- und Y-Achse, d.h. auf der X-Achse werden in Richtung des rechten Rands positive Spannungen gemessen, in Richtung des linken Rands werden negative Spannungen gemessen. Genauso verhält es sich auf der Y-Achse, hier eben oben negativ, unten positiv. Das ist aber prinzipiell egal, es könnte auch zwischen null und Endwert gehen. Die zur Veranschaulichung farbig hinterlegten Felder gehören zusammen, d.h. das ist physikalisch die gleiche Stelle auf der Sensorfläche. Konnte ich das jetzt rüber bringen?

[attachment=48427]

Für jeden Punkt gibt es eben jeweils einen X-Spannung und eine Y-Spannung. Es ist aber leider so, dass die X-Spannungen nicht spaltenweise gleich sind, d.h. für jeden X-Position wird nicht über die gesamte Sensorhöhe (von Oberkante zu Unterkante) die gleiche Spannung gemessen. Und auch für jede Y-Position wird nicht über die gesamte Sensorbreite (von linkem zu rechtem Rand) die gleiche Spannung gemessen. Die Spannungen sind zwar pro Spalte bzw. pro Zeile recht nah beieinander, aber eben nicht gleich. Und wenn ich es richtig verstanden habe, erwartet das Interpolate2D.vi genau das...

Wobei ich in der Beschreibung schon nicht kapiere, was die "dependent variable" und die "independent variables" sind, und auch was im Z-Array stehen muss...


@Lucki: Es ist (noch) nicht so akut, ich würde mich aber freuen wenn du da noch Informationen für mich hättest..

Gruß
Achim


RE: 2D-Interpolation - GerdW - 07.02.2014 08:53

Hallo Achim,

was ist denn das für ein schei** Sensor? Smile

Nun, dann halt von Hand:
- Anhand deiner X-/Y-Spannungsmesswerte kannst du auf alle Fälle schon mal die in Frage kommenden Zeilen und Spalten für die Interpolation eingrenzen.
- Du solltest jetzt 4 Werte haben, je zweimal einen Index für X- und Y-Richtung (die um den Messwert herum liegenden Stützpunkte).
- Damit dann eine einfache bilineare Interpolation "von Hand" durchführen, um jeweils X- und Y-Richtung zu verfeinern
- jetzt hast du jeweils eine Indexangabe (inkl. Nachkommastellen), mit denen du dank Interpolate1DArray auf die X-/Y-Position schließen kannst.

Hab gerade kein LV2013 zur Hand - und keine Lust, das jetzt ohne deine VI-Vorlage zu programmieren…


RE: 2D-Interpolation - Lucki - 08.02.2014 11:48

Habe jetzt mal, ohne groß nachzudenken, Dein vorbildlich aufbereitetes VI verdrahtet. Schau mal nach wie es läuft, vielleicht habe ich schon im ersten Durchlauf einen Glückstreffer gelandet. Big Grin
Gruß Ludwig
[attachment=48437]


RE: 2D-Interpolation - Achim - 10.02.2014 12:35

Hi Lucki,
ich komme leider erst frühestens morgen dazu, das anzuschauen...Danke aber schon mal für deine Hilfe!

Ich melde mich wieder...

Achim


RE: 2D-Interpolation - Lucki - 10.02.2014 15:18

Habe mir die Daten noch mal angeschaut. Die OPs zur Positionsmessung haben einen Offsetfehler: Die Endspannungen betragen nicht -5V/+5V, sondern eher -4.99V/5.01V. Berücksichtigt man das, dann ist der maximale Fehler der Positionsspannung nicht mehr als 0.01V. (Entspr. Linearitätsfehler 0.1%, bezogen auf die Spanne). Um einen Fehler in dieser Preislage zu korrigieren, hätten die Spannungen in den Tabellen auf drei Stellen nach dem Komma gemessen werden müssen. So wie jetzt können die gelegentlichen 0.01V Abweichung ebenso Messfehler sein, über die Linearität sagt das nichts mehr aus. So wie die Datenlage jetzt ist macht es überhaupt keinen Sinn, mit einem großen Instrumentarium den Linearitätsfehler korrigieren zu wollen. Die Positionen ließen sich auf 0.02mm genau einfach mit dieser Formel berechnen:
[attachment=48450]
Wenn Dir das aber nicht reicht, dann müßtest Du die Tabellen noch mal mit höherer Genauigkeit erstellen.

PS: Seit mehr als 8 Jahren beim LVF dabei und Auto immer noch kaputt wie am ersten Tag - was soll nur mal aus Dir werden? Big Grin


RE: 2D-Interpolation - Achim - 11.02.2014 11:57

(10.02.2014 15:18 )Lucki schrieb:  Die Positionen ließen sich auf 0.02mm genau einfach mit dieser Formel berechnen:
...
Wenn Dir das aber nicht reicht, dann müßtest Du die Tabellen noch mal mit höherer Genauigkeit erstellen.

Ouhouhou...immer langsam!

Wie ich schon im ersten Post erwähnt habe, sind das "Beispieldaten"...die haben mit den realen Messwerten "nichts" zu tun! Ich habe die programmatisch mit nem addierten Zufallsgenerator erzeugt! Ich habe keine realen Daten, weil wir die noch nicht mit ner steuerbaren Positionierung des Lasers erzeugen können! Das ist momentan ein Gedankenspiel, es muss noch einiges geklärt werden...insbesondere wer die Kosten für den ganzen "Aufriss" trägtConfused

Es ging mir nur darum, eine "allgemein gültige" Methode zu haben, wie die Daten für eine Koordinate (X bzw. Y) zu behandeln sind. Wir haben uns jetzt auch nochmal selber was überlegt...irgendwie habe ich da auch ein bisschen was durcheinander geworfen. Ich habe ja X- und Y-Daten...die sind aber quasi unabhängig voneinander zu behandeln. Das X-2D-Array bildet sozusagen eine "Fläche" ab, ebenso das Y-Array. Aber diese beiden Flächen liegen irgendwo "im Raum", und haben nichts miteinander zu tun. D.h. jede Fläche kann getrennt betrachtet werden, die Interpolation eines X-Zwischenpunkts, der irgendwo zwischen den X-Stützpunkten der Fläche liegt, ist völlig unabhängig von den Y-Stützpunkten.

Leider ist es so, dass das "Interpolate 2D.vi" davon ausgeht, dass die X-Stützpunkte pro Spalte (Y-Stützpunkte pro Zeile) immer gleich sind, d.h. die "Fläche" jeweils durch eine Schar paralleler Kurven gebildet wird, die allle identisch aussehen, d.h. für jede X-Position bzw. jede Y-Position über die gesamte Breite (X) bzw. Höhe (Y) des Sensors den gleichen Verlauf haben.

Beispiel:
Kurve X=1...Y1 = 1,00 / Y2 = 1,10 / Y3 = 1,11 / Y4 = 0,99 / etc.
Kurve X=2...Y1 = 1,00 / Y2 = 1,10 / Y3 = 1,11 / Y4 = 0,99 / etc.
Kurve X=3...Y1 = 1,00 / Y2 = 1,10 / Y3 = 1,11 / Y4 = 0,99 / etc.

Bei uns ist es aber so, dass die Kurven natürlich auch parallel laufen, aber unterschiedliche Verläufe (Beträge pro Position) haben.

Beispiel (keine realen Daten!):
Kurve X=1...Y1 = 1,00 / Y2 = 1,10 / Y3 = 1,11 / Y4 = 0,99 / etc.
Kurve X=2...Y1 = 1,10 / Y2 = 1,00 / Y3 = 0,99 / Y4 = 1,10 / etc.
Kurve X=3...Y1 = 0,99 / Y2 = 0,99 / Y3 = 0,97 / Y4 = 1,15 / etc.


Wie verhackstückt man jetzt also diese Fläche mit nem fertigen Interpolations-VI? Ich hab keine Ahnung...

Was wir uns überlegt haben ist folgendes...erläutert am Beispiel der X-Daten: Wir interpolieren die Daten jeder X-Position-Spalte (also jeweils ein 1D-Array) mit dem "Polynomial Interpolation.vi". Damit kriegen wir dann jeweils pro Spalte einen Interpolierten Positionswert entsprechend der gemessenen Spannung. Über die gleichzeitige Kenntnis des Y-Spannungswerts kann man dann herausfiltern, zwischen welchen beiden Spalten bzw. zwischen welchen der interpolierten X-Werte der gesuchte Zwischenwert liegt. Jetzt kann man noch schauen, an welcher Y-Stützstelle der gemessene Y-Wert näher im Verhältnis liegt, und kann so die beiden gefundenen X-Werte entsprechend prozentual gewichten und die Summe der gewichteten Werte dann durch zwei teilen. Soweit die Theorie...ob das "klug", "vernünftig" oder "sinnvoll" ist? Hm...ich könnte mir aber vorstellen, dass da was "hübsches" rauskommt, und das es dann auch mal genug ist mit der "Näherung". Es werden in diesem Versuch für die praktische Anwendung sowieso schon einige Annahmen beim Versuchsaufbau gemacht, die selbst eine recht große Ungenauigkeit verursachen, die keiner irgendwie mathematisch berücksichtigt.


(10.02.2014 15:18 )Lucki schrieb:  PS: Seit mehr als 8 Jahren beim LVF dabei und Auto immer noch kaputt wie am ersten Tag - was soll nur mal aus Dir werden? Big Grin
BlinkBeerBlink

Gruß
Achim

PS: Ich schau mir jetzt mal dein VI vom letzten Post an...


RE: 2D-Interpolation - Achim - 11.02.2014 12:32

(08.02.2014 11:48 )Lucki schrieb:  Habe jetzt mal, ohne groß nachzudenken, Dein vorbildlich aufbereitetes VI verdrahtet. Schau mal nach wie es läuft, vielleicht habe ich schon im ersten Durchlauf einen Glückstreffer gelandet. Big Grin

Hm...ich weiß nicht...wie ich schon geschrieben habe, setzt das VI voraus, dass jeweils alle Spalten bzw. Zeilen für die Interpolation gleich aussehen. Das ist aber nicht der Fall! Bei ungleichen Zeilen bzw. Spalten benutzt das VI jeweils nur die erste Spalte und Zeile, d.h. die folgenden werden gleichgesetzt.

Wenn man nämlich anstelle von "Interpolate 2D.vi (2D X, Y)" (dein Beispiel) die "Interpolate 2D.vi (1D X, Y)"-Variante wählt und nur die erste Zeile der X-Spannungen und die erste Spalte der Y-Spannungen anschließt, kommt das gleiche Ergebnis raus...

Es bleibt also die Frage, wie mit ungleichen Spannungszeilen bzw. Spannungsspalten umzugehen ist.

Gruß
Achim