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

Rotationsmatrizen - Drehung eines Vektors um beliebige Achse

 

Benni939
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 20.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2018, 16:07     Titel: Rotationsmatrizen - Drehung eines Vektors um beliebige Achse
  Antworten mit Zitat      
Hallo,

mittels Rotationsmatrizen drehe ich einen Vektor n um eine beliebig im Raum angeordnete Achse mit Richtungsvektor d.
Rechne ich nun den Winkel zwischen dem gedrehten Vektor und dem originalen Vektor aus, so müsste sich doch genau mein gewünschter Drehwinkel ergeben.
Erkennt Ihr ein Problem in der Umsetzung mit Matlab oder liegt ein mathematischer (Denk)Fehler vor?


Code:
%Angabe in kartesischen Koordinaten x,y,z
d=[1;2;3]/norm([1;2;3]);%Einheitsrichtungsvektor der Drehachse

n=[4;5;6]/norm([4;5;6]); %zu verdrehender Vektor im Raum
phi_soll=45; %gewünschte Verdrehung um d in Grad

%Drehungen der Drehachse, bis diese auf der z-Achse liegt, dann Drehung mit
%dem Sollwinkel um z-Achse und Zurückdrehen
%Drehwinkel um die x-und y-Achse ergeben sich aus Drehachsenlage --> Angabe in Grad

nRot=rotx(atan(d(2)/d(3))*180/pi)*... %Drehung um x-Achse in xz-Ebene
    roty(-atan(d(1)/d(3))*180/pi)*...%Drehung um y-Achse auf z-Achse
    rotz(phi_soll)*...%Drehung mit Sollwinkel um z-Achse
    roty(atan(d(1)/d(3))*180/pi)*... %Zurückdrehen um y-Achse
    rotx(-atan(d(2)/d(3))*180/pi)*...%Zurückdrehen um x-Achse
    n;

phi_ist=acos(dot(nRot,n))*180/pi; %zwischen ursprünglichem und verdrehtem Vektor tatsächlich auftretender Winkel
 


Die Abweichung zwischen dem Solldrehwinkel und dem berechneten Drehwinkel phi_ist hängt stark ab vom gewählten Vektor n.

Ich danke Euch für Hinweise.

Viele Grüße

Benni
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 22.06.2018, 16:23     Titel: Re: Rotationsmatrizen - Drehung eines Vektors um beliebige A
  Antworten mit Zitat      
Hallo Benni939,

Das ist ein Denkfehler. Drehe z.B. den Einheitsvektor [1,0,0] um 157 Grad um die X-Achse. Das ändert den Vektor natürlich nicht und der Winkel zwischen den beiden Vektoren ist 0 Grad, nicht 157. Anderes Beispiel ist ein Vektor, der um 1 Grad vom Einheitsvektor in X-Richtung abweicht. Drehe ihn um 180 Grad um die X-Achse. Dann ist der Winkel zwischen den beiden Vektoren 2 Grad, nicht 180.

Den Dreh-Winkel wirst Du erst dann finden, wenn Du beide Vektoren in die Ebene projizierst, die senkrecht zur Dreh-Achse liegt.

Hier ist eine Funktion zum erzeugen der Dreh-Matrix: https://www.mathworks.com/matlabcen.....=8946659&tab=function
Oder falls nur der 3D-Fall benötigt wird:
Code:
s = sin(alpha);
c = cos(alpha);

% Normalized vector to rotate around:
u = u(:);
u = u ./ sqrt(u.' * u);
           
% 3D rotation matrix:
x  = u(1);
y  = u(2);
z  = u(3);
mc = 1 - c;
R  = [c + x * x * mc,      x * y * mc - z * s,   x * z * mc + y * s; ...
      x * y * mc + z * s,  c + y * y * mc,       y * z * mc - x * s; ...
      x * z * mc - y * s,  y * z * mc + x * s,   c + z * z .* mc];

Dann ist der rotierte Vektor:
Code:

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Benni939
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 20.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.06.2018, 17:46     Titel:
  Antworten mit Zitat      
Richtig, danke, Jan.
Das habe ich bei der Verallgemeinerung meines Problems übersehen, denn meine Vektoren n sind eigentlich bereits Normalenvektoren zur Drehachse n. Dann müsste die Überprüfung des Drehwinkels doch eigentlich so funktionieren wie von mir oben genannt.

Deine Beispiele schaue ich mir noch an.

Gruß und ein schönes Wochenende

Benni
Private Nachricht senden Benutzer-Profile anzeigen
 
Benni939
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 20.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2018, 10:00     Titel:
  Antworten mit Zitat      
Hallo Jan,

mit dem von Dir geposteten Code (bei mir ist nur der 3D-Fall relevant) funktioniert alles perfekt. Vielen Dank.
Grundsätzlich würde sich noch die Frage stellen, warum bei den beiden Herangehensweisen noch eine Differenz von 0,7 ° zwischen den berechneten Vektoren n auftritt.

Viele Grüße

Benni
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.06.2018, 11:43     Titel:
  Antworten mit Zitat      
Hallo Benni939,

Schwer zu sagen. Poste bitte den Code, mit dem Du diese Abweichung erhältst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Benni939
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 20.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2018, 16:18     Titel:
  Antworten mit Zitat      
So sieht der zugehörige Code mit Beispielvektoren aus.

Code:
d=[0.249180019975658;   0.280146401237410;   0.927053025192550]; % Einheitsrichtungsvektor der Drehachse

n=[-0.967550739733434;   0.030606602968215;   0.250816271194733]; % zu verdrehender Vektor im Raum normal zur Drehachse
phi_soll=45; % gewünschte Verdrehung um d in Grad

% Ansatz 1

% Drehwinkel ergeben sich aus der Lage der Drehachse --> Angabe in Grad
% Drehungen der Drehachse, bis diese auf der z-Achse liegt, dann Drehung mit
% dem Sollwinkel und Zurückdrehen
nRot1=rotx(atan(d(2)/d(3))*180/pi)*... % Drehung um x-Achse in xz-Ebene
    roty(-atan(d(1)/d(3))*180/pi)*...% Drehung um y-Achse auf z-Achse
    rotz(phi_soll)*...% Drehung mit Sollwinkel um z-Achse
    roty(atan(d(1)/d(3))*180/pi)*... % Zurückdrehen um y-Achse
    rotx(-atan(d(2)/d(3))*180/pi)*...% Zurückdrehen um x-Achse
    n;

phi_ist1=acos(dot(n,nRot1))*180/pi; % zwischen ursprünglichem und verdrehtem Vektor tatsächlich auftretender Winkel

%Ansatz 2

s = sin(phi_soll/180*pi);
c = cos(phi_soll/180*pi);

% Normalized vector to rotate around:
u = d;
u = u ./ sqrt(u.' * u);
           
% 3D rotation matrix:
x  = u(1);
y  = u(2);
z  = u(3);
mc = 1 - c;
R  = [c + x * x * mc,      x * y * mc - z * s,   x * z * mc + y * s; ...
      x * y * mc + z * s,  c + y * y * mc,       y * z * mc - x * s; ...
      x * z * mc - y * s,  y * z * mc + x * s,   c + z * z .* mc];

nRot2=R*n;


Mit dem 1. Ansatz ergeben sich statt der gewünschten 45 ° Verdrehwinkel nur 39,37 °, beim 2. Ansatz sind es tatsächlich 45 °.

Viele Grüße

Benni
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.06.2018, 16:59     Titel:
  Antworten mit Zitat      
Hallo Benni939,

Erkläre noch mal, wie Du auf die erste Formel kommst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Benni939
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 20.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.06.2018, 10:06     Titel:
  Antworten mit Zitat      
Hallo Jan,

die Formel bzw. Herangehensweise ist http://www-lehre.inf.uos.de/~cg/2010/PDF/kap-13.pdf (Rotation um eine beliebige Achse) entnommen, wobei ich davon ausging, dass die dort angegebenen Rotationsmatrizen den Matlab-Funktionen rotx, roty und rotz entsprechen.

Viele Grüße

Benni
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 27.06.2018, 14:58     Titel:
  Antworten mit Zitat      
Hallo Benni939,

"rotx(-atan(d(2)/d(3))*180/pi)*...% Zurückdrehen um x-Achse"

Das klingt verdächtig: |rotx| ist eine Drehung um die X-Achse, damit kann man also die X-Achse nirgendwohin drehen.
Ich denke, hier ist ein Bug im Code, weiß aber nicht genau, wo er ist. Ich sehe auch keine eindeutige Zuordnung zwischen dieser Formel und dem geposteten Paper.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Benni939
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 20.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.06.2018, 15:26     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für Deine Mühe. Naja, das Wichtigste war ja, eine funktionierende Lösung zu haben.

Viele Grüße

Benni
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 - 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.