ich habe folgendes Problem mit meiner Masterarbeit. Ich habe zwei Quaternion gegeben, die ein Koordinatensystem rotieren. Nun muss ich den minimalen Winkel herausfinden um das eine rotierte KS auf das andere rotierte KS abzubilden. Einen Teil der Aufgabe hab ich gelöst, aber der Rest will nicht klappen...
Ich habe schon teilweise heraus gefunden wie man aus dem Quaternion den Drehwinkel extrahiert...
%einen Vector, der senkrecht auf v steht erstellen
if(v(3) == 0) && (v(2) == 0)
w = cross(v, [v(2) v(1) v(3)])';
else
w = cross(v, [v(1) v(3) v(2)])';
end
Wenn ich das Ergebnis dessen überprüfe muss ich allerdings feststellen, dass ich manchmal die negative Rotationsachse v nutzen muss um auf die richtige Rotation zu kommen. Kann mir einer erklären warum?
Und was viel schlimmer ist... Wenn ich aufgrund der Det von (R-eye(3)) über die Eigenvectoren gehen muss, dann bekomme ich fast immer negative Eigenvektoren und damit komplett nutzlose Ergebnisse. Außerdem hat auch ab und zu keiner der Eigenvektoren die Länge 1. Dann bricht der Algorithmus natürlich ab
Und zum ersten Schritt wie ich den Winkel zwischen den beiden gedrehten KS herausbekomme ist mir noch gar nichts eingefallen...
Danke schön im Voraus
Beste Grüße,
Sandro
Edit by Bijick: Code-Umgebung ergänzt. Bitte beim nächsten Mal selbst dran denken. (Kästchen mittig über dem Eingabefenster)
leider verstehe ich Dein Problem nicht so ganz und kann daher auch nicht recht sagen, wo es besser aufgehoben ist. Jedenfalls wäre es gut, wenn Du noch einige Angaben machen könntest.
Ich habe beispielsweise nicht präsent, was Quaternionen genau sind, und ich denke, dass es einige hier noch nie gehört haben. Vielleicht gibst Du einfach mal ein Beispiel an.
Was macht denn die Funktion quat2dcm? Ist die aus einer Toolbox oder eine eigene Funktion?
Kannst Du die Formel angeben oder beschreiben, mit der Du den Drehwinkel extrahierst? (Was ist eigentlich mit der Drehachse?) Sonst ist es schwierig, den Code zu überprüfen.
Insgesamt wäre ein lauffähiges Beispiel super, an dem wir Deinen Code ausprobieren könnten.
Herzliche Grüße
Bijick
_________________
>> why
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.10.2008, 12:57
Titel:
Ach da liegt der Hase im Pfeffer
Also ich mag Quaternionen auch nicht und verstehe sie auch nur soweit wie es unbedingt notwendig ist... Da mann sie aber ohne weiteres in Drehmatrizen umrechnen kann, können wir sie aus der Problemformulierung aber eigentlich auch entfernen
Nehmen wir also an wir haben zwei Drehmatrizen d1 und d2 gegeben. Beide drehen das Koordinatensystem präsentiert durch die Matrix ks = eye(3) auf die Koordinatensysteme ks1 und ks2. Und ich möchte jetzt wissen um welche Achse und welchen Winkel ich ks2 drehen muss um es auf ks1 abzubilden.
Der Code durch läuft so wie er ist ein Beispiel...
Code:
%erstellt eine Drehmatrix
R = angle2dcm(10, 0, 0);
%sie rotiert beispielsweise diesen Vektor...
figure(1);
clf;
line([01], [00], [00]);
view(45, -45);
%hier hin
figure(2);
clf;
x_ = R * [100]';
%normalisieren des Vektors aus optischen Gründen
x_ = x_ / norm(x_);
line([0 x_(1)], [0 x_(2)], [0 x_(3)]);
view(45, -45);
%überprüfen, ob die Determinante von R - eye(3)null bzw. nahenull ist
if(abs(det(R - eye(3))) < 1e-17)
%wenn ja, dann die Eigenvektorlösung aus Wikipedia (funktioniert nicht richtig) [V, D] = eig(R);
if(norm(V(:, 1)) == 1)
v = V(:, 1);
elseif(norm(V(:, 2)) == 1)
v = V(:, 2);
elseif(norm(V(:, 3)) == 1);
v = V(:, 3);
end else
%ansonsten die einfachere Variante
v = null(R - eye(3));
end
%einen Vector, der senkrecht auf v steht erstellen
if(v(3) == 0) && (v(2) == 0)
w = cross(v, [v(2) v(1) v(3)])';
else
w = cross(v, [v(1) v(3) v(2)])';
end
%und jetzt müsste meiner Meinung nach die folgende Abbildungen
%wieder mit Abbildung eins überein stimmen
figure(3);
clf;
linie = line([0 x_(1)], [0 x_(2)], [0 x_(3)]);
%Umrechung in Grad da die rotate Funktion die Angabe in Grad möchte
rotate(linie, v, -ang_g * 360 / (2*pi));
view(45, -45);
axis([-11-11-11]);
%tut sie aber nicht und schon gar nicht für andere Rotationsmatrizen
Und wenn das Problem gelöst ist, dann kommt dazu, dass ich den Winkel zwischen den beiden rotierten Koordinatensystemen brauche (die müssen sich ja wieder aufeinander abbilden lassen)
Danke
Sandro
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.