Re: rotation angles from rotation matrix
- To: mathgroup at smc.vnet.net
- Subject: [mg80096] Re: rotation angles from rotation matrix
- From: sashap <pavlyk at gmail.com>
- Date: Sun, 12 Aug 2007 07:21:44 -0400 (EDT)
- References: <f9jjlf$2hb$1@smc.vnet.net>
Hi Will, the reason, I think, the solve was failing for inexact input is that inexact matrix fails to satisfy the same algebraic constraints that the symbolic does, hence Solve concludes that there are no solutions: In[64]:= m = {{0.977431, 0.158491, 0.139673}, {-0.0822761, 0.894559, -0.439311}, {-0.194572, 0.417905, 0.88741}}; In[66]:= Transpose[m].m - IdentityMatrix[3] // Norm Out[66]= 1.38282*10^-6 In[10]:= rm[\[Phi]_, \[Theta]_, \[Psi]_] := RotationMatrix[\[Psi], {0, 1, 0}].RotationMatrix[\[Theta], {0, 0, 1}].RotationMatrix[\[Phi], {0, 1, 0}] In[54]:= sm = rm[\[Phi], \[Theta], \[Psi]]; In[55]:= Transpose[sm].sm // Simplify Out[55]= {{1,0,0},{0,1,0},{0,0,1}} Now to how to find angles: Observe that In[59]:= sm[[2, 2]] Out[59]= Cos[\[Theta]] Thus In[43]:= \[Theta]aprox = ArcCos[m[[2, 2]]] Out[43]= 0.463353 Also In[62]:= sm[[2, {1, 3}]]/Sin[\[Theta]] Out[62]= {Cos[\[Phi]],Sin[\[Phi]]} and thus we find another angle: In[44]:= \[Phi]aprox = Mod[ArcTan @@ (m[[2, {1, 3}]]/Sin[\[Theta]aprox]), 2 Pi] Out[44]= 4.52725 And, finally, In[63]:= sm[[{1, 3}, 2]]/Sin[\[Theta]] Out[63]= {-Cos[\[Psi]],Sin[\[Psi]]} In[48]:= \[Psi]aprox = Mod[ArcTan @@ ({-1, 1}*m[[{1, 3}, 2]]/Sin[\[Theta]aprox]), 2 Pi] Out[48]= 1.93329 Verify that the solution indeed gives your matrix back as much as it is possible with machine numbers: In[51]:= rm[\[Phi]aprox, \[Theta]aprox, \[Psi]aprox] - m // Norm Out[51]= 1.35436*10^-6 Hope it helps, Oleksandr Pavlyk Wolfram Research On Aug 11, 1:06 am, will <willpower... at hotmail.com> wrote: > Dear Math forum, > > I found some useful code for retrieving the Euler angles of a rotation fr= om a rotation matrix; see > > http://forums.wolfram.com/mathgroup/archive/2001/Aug/msg00286.html > > which goes as follows: > > In[1]:= > Needs["Geometry`Rotations`"] > > In[2]:= > B=RotationMatrix3D[Pi/3,Pi/4,Pi/6]; > > In[3]:= > Solve[RotationMatrix3D[=CF=95,=CE=B8,=CF=88]\[Equal]B,{=CF=95,=CE=B8,=CF= =88}] > > From In[3]:= > Solve::ifun: Inverse functions are being used by Solve, so some > solutions may \ > not be found. > > Out[3]= > {{\[Psi] -> Pi/6, \[Theta] -> Pi/4, \[Phi] -> Pi/3}} > > However, I noticed that if instead of exact rotations being entered, nume= rical approximations are entered: > > In[4]:= > A=RotationMatrix3D[Pi/3.,Pi/4.,Pi/6.]; > > then solve no longer finds the solution... > > In[5]:= > Solve[RotationMatrix3D[=CF=95,=CE=B8,=CF=88]\[Equal]A,{=CF=95,=CE=B8,=CF= =88}] > > Out[5]= > {} > > my problem is that i have a rotation matrix > > {{0.977431, 0.158491, 0.139673}, {-0.0822761, > 0.894559, -0.439311}, {-0.194572, 0.417905, 0.88741}} > > and i really want to find the rotations that are described by this matrix= , either in Euler angles (for mathematica vs 5.2), or (preferably) in xyz (= pitch-roll-yaw) convention (for mathematica vs 6). I am sorry if this is a = very simple problem, but i don't know much about matrix maths... > > Thank you in advance for your help, > > Will