Verfasst am: 23.11.2009, 11:20
Titel: Warum immer positiver Drehwinkel
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 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
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?
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.)
_________________
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 = [1111];
% Drehmatrix um Drehachse und Winkel
Raxis = MAKEHGTFORM('axisrotate',axis,acos(0.5*(spur-2)));
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°
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.