7 Parametertransformation - aber wie??



  • Vielleicht sind ja auch einige Vermesser unter Euch.... Ich suche einen Ansatz wie ich eine 7 Parametertransformation (also eigentlich ein nicht lineares Gleichungssystem mit 7 Unbekannten) programmieren kann. Also wenn ich die Parameter habe, ist es kein Problem. Aber die 7 Parameter ermitteln, das macht mir ganz schön Kopfschmerzen. In Matlab, MathCad alles kein Problem aber nen Code produzieren - hmmm. Weiss jemand wo ich darüber etwas lesen kann, oder hat jemand schon fertige dlls?



  • \[Parameter\ - \ X0,Y0,Z0, \omega, \phi, \kappa, m\] \[R=R(\omega)\*R(\phi)\*R(\kappa)\] \[ \left( \begin {array} {c} X_{Z}\\Y_{Z}\\Z_{Z} \end {array} \right)=m* \left( \begin {array} {ccc} R_{00},R_{01},R_{02}\\ R_{10},R_{11},R_{12}\\ R_{20},R_{21},R_{22}\\ \end {array} \right)\ * \left( \begin {array} {c} X_{S}\\Y_{S}\\Z_{S} \end {array} \right) + \left( \begin {array} {c} X_{0}\\Y_{0}\\Z_{0} \end {array} \right)\] \[ X_{z}=m*(R_{00}\*X_{s}+ R_{01}\*Y_{s}+ R_{02}*Z_{s})+ Z_{0} \]\[ Y_{z}=m*(R_{10}\*X_{s}+ R_{11}\*Y_{s}+ R_{12}*Z_{s})+ Y_{0} \]\[ Z_{z}=m*(R_{20}\*X_{s}+ R_{21}\*Y_{s}+ R_{22}*Z_{s})+ Z_{0} \]


  • also danke für den scan - das ist klar... 3 translationen, 3 Rotationen und ein Maßstab. in der Rotationsmatrix stecken trigonometrische Funktionen drin (nichtlinear) - also die 3 Rotationen ΦΩκ, 3 Verschiebungen X0 Y0 Z0 und der Masstab m sind gesucht. Hier noch mal meine Frage, hat irgend jemand eine Idee wie man dieses Gleichungssystem löst. Einen Vorschlag wie man bei der Programmierung rangehen muss. Die Schwierigkeit finde ich liegt in der Rotationsmatrix. Des weiteren - sind die Berechnungen der Residuen bei Überbestimmung gefragt... Alle Programme können dies nur wie ist es implementiert???



  • linear wird das eine 12 Prm transformation (alle elemente von R werden als gesuchte variablen angesehn)
    nicht linear geht das alles über linearisierung mittels Taylor-entwicklung und dann Levenberg Marquardt algo.



  • wenn ich das jetzt richtig sehe, sind Taylorentwicklungen allgemein Linearisierungen eigentlich streng genommen Annäherungen. Also sind implementierte 7 Parametertransformationen Annäherungen zumindestens theoretisch gesehen... was denn die einzelnen Programme im Hinblick unterschiedlicher Ergebnisse unterscheidet.
    Ich bin kein Mathematiker und nicht in der Lage die Therme zu linearisieren, ich denke die Frage nach geschlossenen Formeln hat sich dann wohl auch erübrigt??
    Aber wiso gibt es bei einer Affintransformation mit 6 Parameter (2 Translationen, 2 Maßstäbe und 2 Rotationen) geschlossene Formeln? Dort ist die Rotationsmatrix auch nicht linear.
    Hat denn nicht jemand ein Tutorial oder so etwas, wo man fündig wird...



  • pinorrix schrieb:

    wenn ich das jetzt richtig sehe, sind Taylorentwicklungen allgemein Linearisierungen eigentlich streng genommen Annäherungen. Also sind implementierte 7 Parametertransformationen Annäherungen zumindestens theoretisch gesehen... was denn die einzelnen Programme im Hinblick unterschiedlicher Ergebnisse unterscheidet.

    Es wird davon ausgegangen, dass die Funktion in der Nähe der Entwicklungsstelle linear ist und somit ein Taylorpolynom die Funktion nahe x0 gut approximiert.
    Da die nichlinearen Optimierungen alle iterativ verlauffen, nähert sich die Entwicklungsstelle immer mehr dem zu schätzenden Wert und die approximation wird "linearer"
    Problematisch sind dann nur noch die Funktion die auch in der nähe der Entwicklungsstelle nichtlinear bleiben.

    wenn man z.B.

    \[m_{1}*\sin(\alpha_{1}) = s_{a1} \] \[m_{1}*\cos(\alpha_{1}) = c_{a1} \] \[m_{2}*\sin(\alpha_{2}) = s_{a2} \] \[m_{2}*\cos(\alpha_{2}) = c_{a2} \]

    kann man auch schreiben

    \[x_{z}= c_{a1}\*x_{s}+s_{a1}\*y_{s}+x_{0}\] \[y_{z}= -s_{a1}\*x_{s}+c_{a1}\*y_{s}+y_{0}\]

    dies führt zu zwei auseinanderfallenden Gls welche in den hilfsvariablen linear sind.(ähnlich Helmert)
    in etwa so läuft auch die 12 Parameter Transformation auch ab.
    (
    google DLT Direct linear transformation , http://mathworld.wolfram.com/RodriguesRotationFormula.html
    alle möglichen Photogrammetriebücher
    )

    die ableitungen kannst du dir auch mit diff() in maple rechnen lassen.



  • ok danke erst mal - ich sehe, ich muss mich erst mal mit der Mathematik auseinander setzen und nachholen. Schade ich hatte gedacht, das gibts schon irgendwo niedergeschrieben und ich brauche dann nur noch programmieren ohne das ich den ganzen Rechenweg unbedingt verstehen muss.
    Das mit den Photogrammetriebüchern ist wohl richtig, doch habe ich nie und nirgends einen Rechenweg zur Bestimmung der Parameter gefunden. Alle Rechenwege basierten bisher auf Matrizenschreibweise - und diese Berechnungen kann man ohne groß nachzudenken in jeden Matheprogramm durchführen.



  • google mal nach 7 Parametertransformation nach Bleich und Illner. Da gibt es eine recht brauchbare Publikation von der TU Berlin, wo 4 Lösungsansätze beschrieben sind. Vielleicht hilft das ja!



  • Wenn ich das richtig verstehe, sollen anhand von gegebenen Punktzuordnungen die 7 Parameter berechnet werden.

    Gegeben: a_i und b_i für i=1,2,...,N (N Punktkorresponzenten)

    Gesucht: 3x3 Matrix M (Rotation+Skalierung) und Translation t, welche
    _iMa_i+tb_i_22\sum\_i ||M * a\_i + t - b\_i||\_2^2
    minimiert.

    Das würde ich so machen:

    (1) 3 Zuordnungen rauspicken, die jeweils ein "schönes, großes" Dreieck bilden und damit eine erste Näherung bestimmen

    (2) Die Näherung per Levenberg-Marquardt verfeinern

    zu (1):
    Als erstes könnte man sich den "Schwerpunkt" der Dreiecke (c1, c2) schnappen, um damit das Problem auf eine 4-Parameter-Transformation (Rotation und Skalierung) reduzieren: M*(punkt-c1)+c2, wobei M zu berechnen bleibt. Dann kann man sich einen 4. Punkt (in beiden Koordinatensystemen) konstruieren, der "über" oder "unter" dem inzwischen zentrierten Dreieck schwebt. Drei der vier Punkte (zwei alte und der neue) spannen den ganzen Raum auf, so dass die Rotations- und Skalierungsmatrix "M" durch die Lösung von

    Y = M * X  <=>  M = Y * X^-1  % Matlab: M=Y/X;
    

    gegeben ist, wobei X und Y zwei 3x3 Matrizen sind, die jeweils die 3 Raum-aufspannenden Vektoren für das eine (X) und das andere (Y) Koordinatensystem enthalten. M muss ggf danach "normalisiert" werden, so dass die Spalten alle dieselbe Länge haben und senkrecht aufeinander stehen. Dann noch eine kleine Umformung:

    _______
    M*(punkt-c1)+c2 = M*punkt + c2-M*c1
    
                                 =: t
    

    wobei wir den Verschiebungsanteil durch einen einzigen Vektor t := c2-M*c1 ausdrücken könnnen.

    zu (2):
    Mit der ersten Näherung M und t kann noch eine nichtlineare Verfeinerung stattfinden. Erwähnenswert ist hier, dass man eine geschickte Parametrisierung der Rotation wählen sollte. Ich habe das bisher immer so gemacht, dass ich eine "Korrektur-Rotation" bestimme, die ich dann an M einfach dranmultipliziere. Die "Korrektur-Rotation" kann man so linearisieren:

    |  1 -z  y |
    R_k(x,y,z)  \approx  |  z  1 -x |    (für betragsmäßig kleine x,y,z)
                         | -y  x  1 |
    

    wobei x/y/z hier die Drehwinkel im Bogenmaß um X-/Y- und Z-Achse sind. Hat man in einer Levenberg-Marquardt Iteration die "Korrekturwinkel" bestimmt, sollte man natürlich statt der Näherung oben die richtige Rotationsmatrix nehmen. Ich empfehle folgendes:
    R_neu = R_korrektur * R_alt
    t_neu = t_korrektur + t_alt
    So sind die partiellen Ableitungen aller 7 Freiheitsgrade (mit der Linearisierung von oben für die Korrekturrotation) relativ einfach berechenbar.



  • pinorrix schrieb:

    ok danke erst mal - ich sehe, ich muss mich erst mal mit der Mathematik auseinander setzen und nachholen. Schade ich hatte gedacht, das gibts schon irgendwo niedergeschrieben und ich brauche dann nur noch programmieren ohne das ich den ganzen Rechenweg unbedingt verstehen muss.

    Das würde doch spätestens dann schief gehen, wenn du in deinem Code einen Fehler hast und herausfinden musst wo es schief geht. Oder noch fieser ein falsches Ergebnis heraus kommt und du es interpretieren möchtest um auf den Fehler zu kommen.


Anmelden zum Antworten