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

Warum immer positiver Drehwinkel

 

dabauer82
Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 23.11.2009, 11:20     Titel: Warum immer positiver Drehwinkel
  Antworten mit Zitat      
Hallo Freunde,

ich verstehe nicht, warum ich ständig einen positiven Drehwinkel bekomme.

ich mache folgendes: ich stelle aus dreiorientierungen eine rotationsmatrix auf und berechne dann den drehwinkel. aber dieser ist, auch bei negativen Orientierungen immer positiv. Warum? Wie kann ich ihn negativ Programmierne?

hier mein code:

Code:


function out = calcOrientation( angle_R, angle_P, angle_Y)
%Berechnet aus den drei Roll, Pitch und Yaw-Winkel eine Drehachse und
%Drehwinkel


%% Bestimme Drehmatrix

% Drehwinkel radiant
angle_R_rad = angle_R*(pi/180);
angle_P_rad = angle_P*(pi/180);
angle_Y_rad = angle_Y*(pi/180);

% homogene Rotationsmatrizen erstellen
Rx = makehgtform('xrotate',angle_R_rad);
Ry = makehgtform('yrotate',angle_P_rad);
Rz = makehgtform('zrotate',angle_Y_rad);

% bestimme Gesamtrotationsmatrix
% Achtung, Konvention. Nur Rotationen um die gleiche Achse sind
% vertauschbar. Hier ist demnmach keine Rotationmatrix beliebig
% poristinierbar, deswegen wird grundsätzlich zu erst um x, dann y und dann
% z gedreht!
Rxyz = Rx*Ry*Rz;

% bestimme Eigenvektoren und Eigenwerte
[Vxyz,Dxyz] = eig(Rxyz, 'nobalance');

% Kann nicht einfach die imaginären Eigenwerte löschen, da dadurch die
% Spur zur Berechnung der Eigenvektoren verfälscht wird
% Dupliziere einfach die Eigenwertmatrix und nutze zur Bestimmung der
% Achse die Matrix Dxyz und zur Bestimmung der Winkel die Matrix Dxyz2
Dxyz2 = Dxyz;

% Lösche nun die komplexe Eigenwerte: Setze diese = 0"
Dxyz(imag(Dxyz)~=0)=0;

% Finde Eigenwert 1 - betrachte nicht die homogene Matrix, also 3x3
[r,c] = find(round(Dxyz(1:3,1:3)) == 1);

% Finde Eigenvektor = Drehachse zum Eigenwert 1
axis = Vxyz(1:3,c);



%% Bestimme Drehwinkel
% TRACE(A) is the sum of the diagonal elements of A, which is
% also the sum of the eigenvalues of A.
% sum(diag(A)) ist sehr viel schneller als trace(A), vorallem wenn man Dxyz
% kennt!
spur = sum(diag(Dxyz2));
angle = acosd(0.5*(spur-2));
out = {axis,angle};
end
Private Nachricht senden Benutzer-Profile anzeigen


Nicolas S.
Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 23.11.2009, 18:24     Titel:
  Antworten mit Zitat      
Schau mal den Wertebereich der acos-Funktion an:
Code:

plot(acosd(-1:0.01:1))
 

_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen
 
dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 24.11.2009, 10:52     Titel:
  Antworten mit Zitat      
ok, dumm. das haette man wissen können das cosinus symmetrisch ist. aber es muss doch schon mal vor mir einmensch auf die idee gekommen sein eine negative rotation durchzuführen oder? Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Nicolas S.
Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 24.11.2009, 11:10     Titel:
  Antworten mit Zitat      
Naja, man findet halt zu jeder Rotation unendlich viele positive und negative Rotationen, die genau identisch sind (nämlich um phi + 2*pi*i mit i in der Menge der positiven und negativen ganzen Zahlen).
Man muß sich für eine entscheiden. Die meisten wollen zwischen 0 und 360, will man zwischen -180 und 180 muss man ja nur die Werte >180 entsprechend umrechnen.

(Für Nullrotationen gibt es sogar noch mehr identische unendlich viele Rotationen, nämlich noch um jeden Beliebigen Vektor.)
_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen
 
dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 24.11.2009, 11:38     Titel:
  Antworten mit Zitat      
ok, das seh ich ein. Ich muss dennoch an diese Orientierungsinformation rankommen:

im Moment versuche ich es über diesen Weg:

Code:

% Führe Testrotation durch, um Vorzeichen des Drehwinkels rauszufinden.
% cos ist symmetrisch zu 0 - daher ist cos(-10) = cos(10). Die Richtung der
% Drehung geht somit verloren. Folgende Testrotation überprüft die
% die Richtigkeit der Drehung
% Die Idee ist, das die resultiere Drehachse und der resultierende
% Drehwinkel natürlich der Drehung um die Hauptkoordinaten entsprechen
% muss. Somit wid überprüft, ob ein gedrehter Testvektor mit beiden
% Matrizen zu dem selben Endevektor führt

% Tesvektor
P = [1 1 1 1];

% Drehmatrix um Drehachse und Winkel
Raxis = MAKEHGTFORM('axisrotate',axis,acos(0.5*(spur-2)));

% Drehung um Hauptkoordinaten udn Drehachse
Paxis = P*Raxis
Pxyz = P*Rxyz

% Überprüfung, wenn unterschiedlich, Drehwinkelorientierung falsch
if (sum(abs(Paxis-Pxyz)) > 1e-6 )
%    disp('bla');
    angle = (-1)*angle;
end

out = {axis,angle};


mit

Code:
Rxyz = Rx*Ry*Rz;
Private Nachricht senden Benutzer-Profile anzeigen
 
Nicolas S.
Forum-Century

Forum-Century


Beiträge: 146
Anmeldedatum: 15.07.09
Wohnort: ---
Version: R2014a/b
     Beitrag Verfasst am: 24.11.2009, 11:47     Titel:
  Antworten mit Zitat      
Naja, es geht auch einfach mit
Code:

 if ang > 180
   ang = ang-360;
end
 


Für beide "ang" muss die gleiche Rotationsmatrix rauskommen.
_________________

--
The programmer suggested it.
Private Nachricht senden Benutzer-Profile anzeigen
 
dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 24.11.2009, 12:09     Titel:
  Antworten mit Zitat      
Hm, das versteh ich nun nicht. Wenn ich als Eingansvariable eine Drehung von -10 Grad um die x-Achse eingebe, dann bekomme ich als Ausgangs angle aber auch +10. Und dieser ist kleiner als die von dir vorgeschlagenen 180°
Private Nachricht senden Benutzer-Profile anzeigen
 
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 - 2025 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.