WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Minimaler Rotationswinkel

 

SandroK
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 27.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2008, 16:29     Titel: Minimaler Rotationswinkel
  Antworten mit Zitat      
Hallo Leute,

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...
Code:

R = quat2dcm(q);

if (abs(det(R - eye(3))) < 1e-17)
    [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
    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

%übers Skalarprodukt den Winkel berechnen
ang_g = acos(dot(w, R*w) / (norm(w) * norm(R*w)));
 

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) Smile
Private Nachricht senden Benutzer-Profile anzeigen


SandroK
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 27.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2008, 01:40     Titel:
  Antworten mit Zitat      
Wird erledigt, jetzt weiß ich, dass es sowas gibt Wink

Habe gerade noch die Abteilung für allgemeine mathematische Fragen entdeckt. Ist das Problem da vielleicht besser aufgehoben?

Sandro
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 28.10.2008, 12:21     Titel:
  Antworten mit Zitat      
Hallo Sandro,

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
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2008, 13:57     Titel:
  Antworten mit Zitat      
Ach da liegt der Hase im Pfeffer Smile

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.

Den folgenden Algorithmus zur Berechnung der Drehachse und des Drehwinkels hab ich aus Angaben von http://de.wikipedia.org/wiki/Rotationsmatrix#Eigenschaften

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([0 1], [0 0], [0 0]);
view(45, -45);

%hier hin
figure(2);
clf;
x_ = R * [1 0 0]';
%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. nahe null 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

%übers Skalarprodukt den Winkel berechnen
ang_g = acos(dot(w, R*w) / (norm(w) * norm(R*w)));

%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([-1 1 -1 1 -1 1]);

%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
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.