Dreidimensionale Ausgleichsgerade

Neue Frage »

mathenull123 Auf diesen Beitrag antworten »
Dreidimensionale Ausgleichsgerade
Hallo alle miteinander!

Ich bearbeite gerade ein Projekt und bin dabei auf folgende Problematik gestoßen:
Ich habe verrauschte Messdaten, das sind dreidimensionale Positionen im Raum. Das zu lokalisierende Flugzeug bewegt sich relativ kontinuierlich vorwärts (macht aber auch Kurven). Für eine Abschätzung, wo sich das Flugzeug gerade befindet, möchte ich eine Ausgleichsgerade durch die letzten x (sagen wir mal 4 bis 8) gemessenen Positionen legen und für die Positionsschätzung auf dieser den zwischen zwei Messungen zurückgelegten Weg auftragen. Bisher erzeuge ich dafür eine Gerade aus dem letzten Punkt und sagen wir einmal dem fünftletzten Punkt, was aber eine extrem schlechte Methode ist.

Ich habe mal in einem anderen Projekt ein bisschen mit Pseudoinversen herumgespielt. Da hat man ja eigentlich fast das gleiche Problem, bloß dass man da eine Ebene und keine Gerade durchlegt.

Hat vielleicht jemand von Euch (mein Guru Gott smile ) eine entsprechende Methode für mich, die der Berechnung einer Pseudoinversen ähnelt, bei der aber die dreidimensionale Ausgleichsgerade (die Abstände aller Punkte zur Gerade sollen minimiert werden) herauskommt?

Ich wäre sehr dankbar, wenn mir jemand weiterhelfen könnte!

Besten Dank
frank09 Auf diesen Beitrag antworten »

1. Errechne einen dreidimensionalen Mittelwert, durch den die Gerade laufen soll.
Wenn du von jedem der 4-8 Punkte den Mittelwert subtrahierst, liegt der Mittelwert im Ursprung, also M(0|0|0).
2. Statt die Abstände zu minimieren, minimiert man die Quadrate der Abstände.
So spart man sich übrigens auch die Wurzeln.
3. Stell dir vor, die X-Achse soll deine Ausgleichgerade werden, d.h. die Summe
aus quadrierter Y- und quadr. Z-Koord. soll minimal werden
4. Um die Y-Koordinaten zu minmieren drehst du mit geeigneter Matrix so lange
um die Z-Achse bis die Summe der Quadrate der Y-Koord. minimal wird (Z-Koord. bleibt dabei unverändert)
5. Um nun die Z-Koordinaten zu minimieren drehst du mit geeigneter Matrix so lange um die Y-Achse bis die Summe der Quadrate der Z-Koord. minimal wird (Y-Koord. bleibt dabei unverändert)
6. Nun musst du deine Ausgleichgerade X-Achse mir den Inversen der Drehmatrizen multipizieren und dann noch durch Addition des Mittelwertes deinen ursprüglichen Punkten anpassen.

Die Minimierungen errechnest durch durch Ableiten nach dem Drehwinkel.
mathenull123 Auf diesen Beitrag antworten »
Danke schonmal!
Hallo Frank,

Vielen Dank für den Vorschlag! Ich werde das gleich mal ausprobieren.

Zitat:
Original von frank09
Die Minimierungen errechnest durch durch Ableiten nach dem Drehwinkel.


Das Ableiten klingt mir nach einer analytischen Lösung, richtig?
Ich muss den Berechnungsaufwand so gering wie möglich halten, wäre also schön, wenn es so ist. Hast Du diese Methode denn schonmal ausprobiert? Wenn ja wäre ein kleiner Codefetzen der absolute Hammer smile .

Ich versuche mal, das zu implementieren und melde mich bei Bedarf dann nochmal.

Schönen Gruß und herzlichen Dank!
frank09 Auf diesen Beitrag antworten »

Die Drehmatrix einer Drehung um die Z-Achse (Drehwinkel ) sieht ja so aus:

Angewandt auf einen Punkt P(x|y|z) bzw. deren Ortsvektor ergibt sich:

die "neue" Y-Koordinate y' soll im Quadrat minimiert werden:


der Einfachheit wegen werden die Koeffizienten wie folgt benannt:
bzw. ,wenn man mehrere Punkte hat.
bzw.
bzw.


nun ableiten und gleich null setzen:


quadrieren, um cos aus dem Produkt herauszubekommen:


bi-quadratische Gleichung mit 2 Lösungen:

Eine der Lösungen ist das Maximum, die andere das Minimum. Am besten jeweils ausrechnen. Die Drehmatrix um die y-Achse ist diese:

Zu minimieren nun():

geht genauso.Die Matrix für beide Drehungen sieht dann so aus:

Für das Inverse nimmst du einfach (statt und ) und
Somit ist der Richtungsvektor deiner Ausgleichsgeraden:

Und vergiss, nicht zuerst die Punkte um ihren Mittelwert zu verschieben.
Sieht im Programmcode sicher sehr viel einfacher aus.
frank09 Auf diesen Beitrag antworten »
Geht noch einfacher.
Da das oben beschriebene Verfahren sehr rechenintensiv scheint, habe ich nach einer einfacheren Möglichkeit gesucht und bin auf diesen Link gestoßen:
http://www.stud.uni-karlsruhe.de/~uabzr/info4/tutorium3.pdf
Danach kannst du so verfahren:
Nachdem du von deinen Punkten den Mittelwert abgezogen hast, schreibst du diese spaltenweise in die Matrix P
z.B. P_1(1|2|3),P_2(3|5|4),P_3(2|4|6),P_4(2|5|7) Mittelwert m=(2|4|5)

Nun mit sich selbst in transponierter Form multiplizieren ergibt Kovarianzmatrix:

Und nun ist der Richtungsvektor deiner Ausgleichsgeraden "einfach nur" der Eigenvektor der Kovarianzmatrix mit dem größten Eigenwert. Der lässt sich numerisch leicht mit der Von-Mises-Iteration (http://goblor.de/wp/wp-content/uploads/2...ion-handout.pdf) bestimmen. Sie konvergiert sehr schnell und man kommt schon nach 5 Durchläufen auf zwei Nachkommastellen Genauigkeit:


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
double M [3][3]={{2,3,1},{3,6,5},{1,5,10}};//Kovarianzmatrix 
double vec1[3]={1,0,0};//Startwert
double vec2[3];
double betrag;
   for(int n = 0; n <10;n++)// Anzahl Iterationen
{vec2[0]=M[0][0]*vec1[0]+M[0][1]*vec1[1]+M[0][2]*vec1[2];
vec2[1]=M[1][0]*vec1[0]+M[1][1]*vec1[1]+M[1][2]*vec1[2];
vec2[2]=M[2][0]*vec1[0]+M[2][1]*vec1[1]+M[2][2]*vec1[2];
betrag=sqrt(vec2[0]*vec2[0]+vec2[1]*vec2[1]+vec2[2]*vec2[2]);
vec1[0]=vec2[0]/betrag;
vec1[1]=vec2[1]/betrag;
vec1[2]=vec2[2]/betrag;
}
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »