欧拉角、四元数和旋转矩阵

欧拉角、四元数和旋转矩阵

旋转变换

旋转变换最为直观的表示方法是“轴-角”:绕着某一个过原点轴,旋转某一角度。
轴可以用一个单位长度的点

    [



     w


     1



    ,



     w


     2



    ,



     w


     3



    ]



   [w_1,w_2,w_3]


[w1​,w2​,w3​]表示:原点到该点的射线即为此轴。 一个旋转变换可以用用欧拉角、四元数或者旋转矩阵表示。以下讨论不同表示方法之间的关系,以及旋转变换的合成、取逆等操作。

旋转矩阵

旋转可以看做一种特殊的坐标变换,而坐标变换可以用用

    3


    ×


    3



   3\times 3


3×3矩阵




    R



   R


R来表示。对一个坐标施加旋转的结果是





     x


     ′



    =


    R


    x



   x'=Rx


x′=Rx。 旋转矩阵是正交矩阵,即




    ∣


    R


    ∣


    =


    1



   |R|=1


∣R∣=1,旋转变换不改变向量的长度。

欧拉角的物理意义

任何一个旋转可以表示为依次绕着三个旋转轴旋三个角度的组合。这三个角度称为欧拉角。 本文中提到的欧拉角指:绕着世界坐标系的x,y,z轴,依次旋转的结果。其取值范围如下:

      θ


      x



     ∈


     (


     −


     π


     ,


     π


     )


     ,



      θ


      y



     ∈


     (


     −



      π


      2



     ,



      π


      2



     )


     ,



      θ


      z



     ∈


     (


     −


     π


     ,


     π


     )



    \theta_x\in (-\pi,\pi), \theta_y \in (-\frac{\pi}{2}, \frac{\pi}{2}), \theta_z \in (-\pi, \pi)


 θx​∈(−π,π),θy​∈(−2π​,2π​),θz​∈(−π,π)

欧拉角

    →



   \to


→旋转矩阵

单独绕一个轴旋转

    θ



   \theta


θ角度的旋转矩阵为:<br> <img src="https://img-blog.csdnimg.cn/img_convert/d8d711bb7a8f0ab024bf52998eb71ea3.png" alt="这里写图片描述">

如果依次绕x轴、y轴、z轴旋转,该变换的旋转矩阵为:

     R


     =



      R


      z



     ⋅



      R


      y



     ⋅



      R


      x




    R=R_z \cdot R_y \cdot R_x 


 R=Rz​⋅Ry​⋅Rx​

记三个轴欧拉角的正弦和余弦函数为

     s


     x



    ,



     c


     x



    ,



     s


     y



    ,



     c


     y



    ,



     s


     z



    ,



     c


     z




   s_x, c_x, s_y, c_y, s_z, c_z


sx​,cx​,sy​,cy​,sz​,cz​。使用matlab的syms功能可以轻松推导旋转矩阵




    R



   R


R:






     [








           c


           y




           c


           z










           c


           z




           s


           x




           s


           y



          −



           c


           x




           s


           z










           s


           x




           s


           z



          +



           c


           x




           c


           z




           s


           y












           c


           y




           s


           z










           c


           x




           c


           z



          +



           s


           x




           s


           y




           s


           z










           c


           x




           s


           y




           s


           z



          −



           c


           z




           s


           x











          −



           s


           y










           c


           y




           s


           x










           c


           x




           c


           y








     ]



    \left[ \begin{matrix} c_yc_z & c_z s_x s_y - c_x s_z & s_x s_z + c_x c_z s_y \\ c_y s_z & c_x c_z + s_x s_y s_z & c_x s_y s_z - c_z s_x \\ -s_y & c_y s_x & c_x c_y \end{matrix}\right]


 ⎣⎡​cy​cz​cy​sz​−sy​​cz​sx​sy​−cx​sz​cx​cz​+sx​sy​sz​cy​sx​​sx​sz​+cx​cz​sy​cx​sy​sz​−cz​sx​cx​cy​​⎦⎤​

旋转矩阵

    →



   \to


→欧拉角

设旋转矩阵i行j列元素为

     r



      i


      j





   r_{ij}


rij​。根据旋转矩阵的表达式,利用三角函数可以推导出欧拉角取值:







      θ


      x



     =


     a


     t


     a


     n


     2


     (



      r


      32



     ,



      r


      33



     )



    \theta_x = atan2(r_{32},r_{33})


 θx​=atan2(r32​,r33​)







      θ


      y



     =


     a


     t


     a


     n


     2


     (


     −



      r


      31



     ,





        r


        32


        2



       +



        r


        33


        2





     )



    \theta_y = atan2(-r_{31}, \sqrt{r_{32}^2+r_{33}^2})


 θy​=atan2(−r31​,r322​+r332​
        <svg width="400em" height="1.8800000000000001em" viewbox="0 0 400000 1944" preserveaspectratio="xMinYMin slice">
         <path d="M1001,80H400000v40H1013.1s-83.4,268,-264.1,840c-180.7,

572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7s-12,0,-12,0c-1.3,-3.3,-3.7,-11.7, -7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744c-10,12,-21,25,-33,39s-32,39,-32,39 c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30c26.7,-32.7,52,-63,76,-91s52,-60,52,-60 s208,722,208,722c56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5, -658.5c53.7,-170.3,84.5,-266.8,92.5,-289.5c4,-6.7,10,-10,18,-10z M1001 80H400000v40H1013z"></path> </svg>​)

      θ


      z



     =


     a


     t


     a


     n


     2


     (



      r


      21



     ,



      r


      11



     )



    \theta_z = atan2(r_{21},r_{11})


 θz​=atan2(r21​,r11​)

四元数的物理意义

设有一个通过原点

    [


    0


    ,


    0


    ,


    0


    ]



   [0,0,0]


[0,0,0]的旋转轴,该轴上单位长度的点为




    [



     w


     1



    ,



     w


     2



    ,



     w


     3



    ]



   [w_1,w_2,w_3]


[w1​,w2​,w3​]。绕此轴旋转




    θ



   \theta


θ角的变换可以用一个向量表示:<br> 




     [


     cos


     ⁡



      θ


      2



     ,



      w


      1



     sin


     ⁡



      θ


      2



     ,



      w


      2



     sin


     ⁡



      θ


      2



     ,



      w


      3



     sin


     ⁡



      θ


      2



     ]



    [\cos \frac{\theta}{2}, w_1 \sin \frac{\theta}{2}, w_2 \sin \frac{\theta}{2},w_3 \sin \frac{\theta}{2}]


 [cos2θ​,w1​sin2θ​,w2​sin2θ​,w3​sin2θ​]

也记为

    q


    =


    [



     q


     0



    ,



     q


     1



    ,



     q


     2



    ,



     q


     3



    ]



   q=[q_0,q_1,q_2,q_3]


q=[q0​,q1​,q2​,q3​],或者




    q


    =



     q


     0



    +



     q


     1



    i


    +



     q


     2



    j


    +



     q


     3



    k



   q=q_0+q_1i+q_2j+q_3k


q=q0​+q1​i+q2​j+q3​k。四元数的模长为1:<br> 





      q


      0


      2



     +



      q


      1


      2



     +



      q


      2


      2



     +



      q


      3


      2



     =




       cos


       ⁡



      2




      θ


      2



     +




       sin


       ⁡



      2




      θ


      2



     (



      w


      1


      2



     +



      w


      2


      2



     +



      w


      3


      3



     )


     =




       cos


       ⁡



      2




      θ


      2



     +




       sin


       ⁡



      2




      θ


      2



     =


     1



    q_0^2+q_1^2+q_2^2+q_3^2 = \cos^2 \frac{\theta}{2} + \sin^2 \frac{\theta}{2} (w_1^2+w_2^2+w_3^3)=\cos^2 \frac{\theta}{2} + \sin^2 \frac{\theta}{2} = 1


 q02​+q12​+q22​+q32​=cos22θ​+sin22θ​(w12​+w22​+w33​)=cos22θ​+sin22θ​=1

四元数

    →



   \to


→旋转矩阵

此段公式暂不确定,请您参看评论讨论

利用罗德里格旋转公式可以获得绕某过原点一轴

    [



     w


     1



    ,



     w


     2



    ,



     w


     3



    ]



   [w_1,w_2,w_3]


[w1​,w2​,w3​]旋转某一角度




    θ



   \theta


θ的旋转矩阵




    R



   R


R:<br> 




     [







          cos


          ⁡


          θ


          +



           w


           1


           2



          (


          1


          −


          cos


          ⁡


          θ


          )









           w


           1




           w


           2



          (


          1


          −


          cos


          ⁡


          θ


          )









           w


           2



          sin


          ⁡


          θ











           w


           1




           w


           2



          (


          1


          −


          cos


          ⁡


          θ


          )








          cos


          ⁡


          θ


          +



           w


           2


           2



          (


          1


          −


          cos


          ⁡


          θ


          )








          −



           w


           1



          sin


          ⁡


          θ










          −



           w


           2



          sin


          ⁡


          θ









           w


           1



          sin


          ⁡


          θ








          cos


          ⁡


          θ







     ]



    \left[ \begin{matrix} \cos \theta + w_1^2(1-\cos\theta) & w_1w_2(1-\cos \theta) & w_2 \sin \theta \\ w_1w_2(1-\cos \theta) & \cos \theta + w_2^2(1-\cos \theta) & -w_1 \sin \theta \\ -w_2 \sin \theta & w_1 \sin \theta & \cos \theta \end{matrix} \right]


 ⎣⎡​cosθ+w12​(1−cosθ)w1​w2​(1−cosθ)−w2​sinθ​w1​w2​(1−cosθ)cosθ+w22​(1−cosθ)w1​sinθ​w2​sinθ−w1​sinθcosθ​⎦⎤​

代入四元组的表示方法,可得:

     [







          1


          −


          2



           q


           2


           2



          −


          2



           q


           3


           2









          2



           q


           1




           q


           2



          −


          2



           q


           3




           q


           0









          2



           q


           1




           q


           3



          +


          2



           q


           2




           q


           0











          2



           q


           1




           q


           2



          +


          2



           q


           3




           q


           0









          1


          −


          2



           q


           1


           2



          −


          2



           q


           3


           2









          2



           q


           2




           q


           3



          −


          2



           q


           1




           q


           0











          2



           q


           1




           q


           3



          −


          2



           q


           2




           q


           0









          2



           q


           2




           q


           3



          +


          2



           q


           1




           q


           0









          1


          −


          2



           q


           1


           2



          −


          2



           q


           2


           2








     ]



    \left[ \begin{matrix} 1-2q_2^2-2q_3^2 & 2 q_1 q_2 - 2 q_3 q_0 & 2q_1q_3 + 2q_2q_0 \\ 2q_1q_2 + 2q_3q_0 & 1-2q_1^2-2q_3^2 & 2q_2q_3-2q_1q_0 \\ 2q_1q_3 - 2q_2q_0 & 2q_2q_3 + 2q_1q_0 & 1-2q_1^2-2q_2^2 \end{matrix} \right] 


 ⎣⎡​1−2q22​−2q32​2q1​q2​+2q3​q0​2q1​q3​−2q2​q0​​2q1​q2​−2q3​q0​1−2q12​−2q32​2q2​q3​+2q1​q0​​2q1​q3​+2q2​q0​2q2​q3​−2q1​q0​1−2q12​−2q22​​⎦⎤​

旋转矩阵

    →



   \to


→四元数

此段公式暂不确定,请您参看评论讨论

根据旋转矩阵的表达式,利用三角函数性质,可以由旋转矩阵得到四元数:

      q


      0



     =





        1


        +



         r


         11



        +



         r


         22



        +



         r


         33





      2




    q_0 = \frac {\sqrt{1+r_{11}+r_{22}+r_{33}}}{2}


 q0​=21+r11​+r22​+r33​
               <svg width="400em" height="1.08em" viewbox="0 0 400000 1080" preserveaspectratio="xMinYMin slice">
                <path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,

-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8, -50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0, 35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5, -221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467 s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422 s-65,47,-65,47z M834 80H400000v40H845z"></path> </svg>​​

      q


      1



     =





        r


        32



       −



        r


        23





       4



        q


        0






    q_1 = \frac {r_{32}-r_{23}}{4q_0}


 q1​=4q0​r32​−r23​​







      q


      2



     =





        r


        13



       −



        r


        31





       4



        q


        0






    q_2 = \frac {r_{13}-r_{31}}{4q_0}


 q2​=4q0​r13​−r31​​







      q


      3



     =





        r


        21



       −



        r


        12





       4



        q


        0






    q_3 = \frac {r_{21}-r_{12}}{4q_0}


 q3​=4q0​r21​−r12​​

开根号要求

    1


    +


    T


    r


    (


    R


    )


    >


    0



   1+Tr(R)>0


1+Tr(R)>0(其中




    T


    r



   Tr


Tr表示矩阵的迹,等于对角元素之和,也等于特征值之和),分式要求





     q


     0



    ≠


    0



   q_0\neq0


q0​​=0。<br> 某些情况下(例如




    θ


    =


    π



   \theta=\pi


θ=π),





     q


     0




   q_0


q0​接近零,




    T


    r


    (


    R


    )



   Tr(R)


Tr(R)接近-1,需要使用以下方式求解(来源于[此处](http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm))。

如果

     r


     11



    ,



     r


     22



    ,



     r


     33




   r_{11},r_{22},r_{33}


r11​,r22​,r33​中,





     r


     11




   r_{11}


r11​最大:<br> 




     S


     =




       1


       +



        r


        11



       −



        r


        22



       −



        r


        33






    S=\sqrt{1+r_{11}-r_{22}-r_{33}}


 S=1+r11​−r22​−r33​
        <svg width="400em" height="1.08em" viewbox="0 0 400000 1080" preserveaspectratio="xMinYMin slice">
         <path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,

-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8, -50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0, 35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5, -221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467 s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422 s-65,47,-65,47z M834 80H400000v40H845z"></path> </svg>​

      q


      0



     =





        r


        32



       −



        r


        23




      S




    q_0 = \frac{r_{32}-r_{23}}{S}


 q0​=Sr32​−r23​​







      q


      1



     =


     S


     /


     4



    q_1 = S/4


 q1​=S/4







      q


      2



     =





        r


        12



       +



        r


        21




      S




    q_2 = \frac{r_{12}+r_{21}}{S}


 q2​=Sr12​+r21​​







      q


      3



     =





        r


        21



       +



        r


        12




      S




    q_3 = \frac {r_{21}+r_{12}}{S}


 q3​=Sr21​+r12​​

如果

     r


     11



    ,



     r


     22



    ,



     r


     33




   r_{11},r_{22},r_{33}


r11​,r22​,r33​中,





     r


     22




   r_{22}


r22​最大:<br> 




     S


     =




       1


       −



        r


        11



       +



        r


        22



       −



        r


        33






    S=\sqrt{1-r_{11}+r_{22}-r_{33}}


 S=1−r11​+r22​−r33​
        <svg width="400em" height="1.08em" viewbox="0 0 400000 1080" preserveaspectratio="xMinYMin slice">
         <path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,

-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8, -50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0, 35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5, -221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467 s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422 s-65,47,-65,47z M834 80H400000v40H845z"></path> </svg>​

      q


      0



     =





        r


        13



       −



        r


        31




      S




    q_0 = \frac{r_{13}-r_{31}}{S}


 q0​=Sr13​−r31​​







      q


      1



     =





        r


        12



       +



        r


        21




      S




    q_1 = \frac {r_{12}+r_{21}}{S}


 q1​=Sr12​+r21​​







      q


      2



     =


     S


     /


     4



    q_2 = S/4


 q2​=S/4







      q


      3



     =





        r


        23



       +



        r


        32




      S




    q_3 = \frac {r_{23}+r_{32}}{S}


 q3​=Sr23​+r32​​

如果

     r


     11



    ,



     r


     22



    ,



     r


     33




   r_{11},r_{22},r_{33}


r11​,r22​,r33​中,





     r


     33




   r_{33}


r33​最大:<br> 




     S


     =




       1


       −



        r


        11



       −



        r


        22



       +



        r


        33






    S=\sqrt{1-r_{11}-r_{22}+r_{33}}


 S=1−r11​−r22​+r33​
        <svg width="400em" height="1.08em" viewbox="0 0 400000 1080" preserveaspectratio="xMinYMin slice">
         <path d="M95,702c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,

-10,-9.5,-14c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54c44.2,-33.3,65.8, -50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10s173,378,173,378c0.7,0, 35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429c69,-144,104.5,-217.7,106.5, -221c5.3,-9.3,12,-14,20,-14H400000v40H845.2724s-225.272,467,-225.272,467 s-235,486,-235,486c-2.7,4.7,-9,7,-19,7c-6,0,-10,-1,-12,-3s-194,-422,-194,-422 s-65,47,-65,47z M834 80H400000v40H845z"></path> </svg>​

      q


      0



     =





        r


        21



       −



        r


        12




      S




    q_0 = \frac {r_{21}-r_{12}}{S}


 q0​=Sr21​−r12​​







      q


      1



     =





        r


        13



       +



        r


        31




      S




    q_1 = \frac {r_{13}+r_{31}}{S}


 q1​=Sr13​+r31​​







      q


      2



     =





        r


        23



       −



        r


        32




      S




    q_2 = \frac {r_{23}-r_{32}}{S}


 q2​=Sr23​−r32​​







      q


      3



     =


     S


     /


     4



    q_3 = S/4


 q3​=S/4

变换的逆

使用欧拉角表示时,必须颠倒三个旋转轴的顺序,同时对旋转角度取反。
使用旋转矩阵表示时,求矩阵的逆即可:

     R


     ∗



    =



     R



      −


      1





   R^*=R^{-1}


R∗=R−1。<br> 使用四元组表示时,考虑其物理意义,对后三位取反即可:





     q



      −


      1




    =


    [



     q


     0



    ,


    −



     q


     1



    ,


    −



     q


     2



    ,


    −



     q


     3



    ]



   q^{-1}=[q_0,-q_1,-q_2,-q_3]


q−1=[q0​,−q1​,−q2​,−q3​]。

向量的叉乘

接下去讨论之前,需要先复习向量的叉乘。

三维空间中的一个点可以表示为向量

    [


    x


    i


    ,


    y


    j


    ,


    z


    k


    ]



   [xi,yj,zk]


[xi,yj,zk],其中




    i


    ,


    j


    ,


    k



   i,j,k


i,j,k是三个坐标轴:




    [


    1


    ,


    0


    ,


    0


    ]


    ,


    [


    0


    ,


    1


    ,


    0


    ]


    ,


    [


    0


    ,


    0


    ,


    1


    ]



   [1,0,0],[0,1,0],[0,0,1]


[1,0,0],[0,1,0],[0,0,1]。<br> 两个向量




    a


    ,


    b



   a,b


a,b叉乘的结果是一个向量,其长度为




    ∣


    a


    ∣


    ∣


    b


    ∣


    sin


    ⁡


    θ



   |a||b| \sin \theta


∣a∣∣b∣sinθ。




    θ



   \theta


θ表示从向量




    a



   a


a到




    b



   b


b的小于180°的角度。其方向垂直于




    a


    ,


    b



   a,b


a,b所在平面,遵循右手定则:四指从




    a



   a


a转向




    b



   b


b,拇指方向为叉乘结果方向。

四元组作为一种向量,其叉乘涉及到虚数单位的乘法,遵循以下原则:

     i


     ×


     i


     =


     −


     1



    i\times i = -1


 i×i=−1






     i


     ×


     j


     =


     −


     j


     ×


     i



    i\times j = -j\times i


 i×j=−j×i






     i


     ×


     j


     =


     k


     ,


     j


     ×


     k


     =


     i


     ,


     k


     ×


     i


     =


     j



    i\times j = k, j\times k = i, k \times i = j


 i×j=k,j×k=i,k×i=j

叉乘满足反交换律:

     a


     ×


     b


     =


     −


     b


     ×


     a



    a\times b = -b\times a


 a×b=−b×a<br> 联想叉乘的物理意义:交换了




    a


    ,


    b



   a,b


a,b顺序,则拇指方向反转。

叉乘满足加法分配律:

     (


     a


     +


     b


     )


     ×


     c


     =


     a


     ×


     c


     +


     b


     ×


     c



    (a+b)\times c = a\times c + b\times c


 (a+b)×c=a×c+b×c

特别要注意,叉乘不满足结合律:

     (


     a


     ×


     b


     )


     ×


     c


     ≠


     a


     ×


     (


     b


     ×


     c


     )



    (a\times b) \times c \neq a \times ( b\times c )


 (a×b)×c​=a×(b×c)

四元数的叉乘

四元数既不是矢量也不是标量。 可以看做一个标量

     q


     0




   q_0


q0​和一个三维矢量




    [



     q


     1



    ,



     q


     2



    ,



     q


     3



    ]



   [q_1,q_2,q_3]


[q1​,q2​,q3​]的结合体:




    q


    =



     q


     0



    +



     q


     1



    i


    +



     q


     2



    j


    +



     q


     3



    k



   q=q_0+q_1i+q_2j+q_3k


q=q0​+q1​i+q2​j+q3​k。<br> 两个四元数





     a


     1



    +



     a


     2



    i


    +



     a


     3



    j


    +



     a


     4



    k



   a_1+a_2i+a_3j+a_4k


a1​+a2​i+a3​j+a4​k,





     b


     1



    +



     b


     2



    i


    +



     b


     3



    j


    +



     b


     4



    k



   b_1+b_2i+b_3j+b_4k


b1​+b2​i+b3​j+b4​k,相乘的结果




    q


    =


    a


    ×


    b



   q=a \times b


q=a×b:<br> 





      q


      0



     =



      a


      1




      b


      1



     −



      a


      2




      b


      2



     −



      a


      3




      b


      3



     −



      a


      4




      b


      4




    q_0 = a_1b_1-a_2b_2-a_3b_3-a_4b_4


 q0​=a1​b1​−a2​b2​−a3​b3​−a4​b4​







      q


      1



     =



      a


      1




      b


      2



     +



      a


      2




      b


      1



     +



      a


      3




      b


      4



     −



      a


      4




      b


      3




    q_1 = a_1b_2+a_2b_1+a_3b_4-a_4b_3


 q1​=a1​b2​+a2​b1​+a3​b4​−a4​b3​







      q


      2



     =



      a


      1




      b


      3



     −



      a


      2




      b


      4



     +



      a


      3




      b


      1



     +



      a


      4




      b


      2




    q_2 = a_1b_3-a_2b_4+a_3b_1+a_4b_2


 q2​=a1​b3​−a2​b4​+a3​b1​+a4​b2​







      q


      3



     =



      a


      1




      b


      4



     +



      a


      2




      b


      3



     −



      a


      3




      b


      2



     +



      a


      4




      b


      1




    q_3 = a_1b_4+a_2b_3-a_3b_2+a_4b_1


 q3​=a1​b4​+a2​b3​−a3​b2​+a4​b1​

四元数叉乘不满足交换律、结合律。

变换的组合

使用欧拉角表示时,很难直接组合两个变换。
使用旋转矩阵表示时,依次做矩阵相乘即可:

    R


    =



     R


     2




     R


     1




   R=R_2R_1


R=R2​R1​。<br> 使用四元组表示时,需要对两个四元组叉乘:




    q


    =



     q


     2



    ×



     q


     1




   q=q_2 \times q_1


q=q2​×q1​。 由于叉乘不满足结合律,当有一系列变化





     q


     1



    ,



     q


     2



    ,



     q


     3



    .


    .


    .



   q_1,q_2,q_3...


q1​,q2​,q3​...陆续发生时,要用括号保证乘法发生的顺序:<br> 




     q


     =



      q


      4



     ×


     (



      q


      3



     ×


     (



      q


      2



     ×



      q


      1



     )


     )



    q = q_4 \times (q_3\times (q_2\times q_1))


 q=q4​×(q3​×(q2​×q1​))

使用四元数

首先把待旋转的点

    (


    x


    ,


    y


    ,


    z


    )



   (x,y,z)


(x,y,z)表示成四元数形式:




    p


    =


    [


    0


    ,


    x


    ,


    y


    ,


    z


    ]



   p=[0,x,y,z]


p=[0,x,y,z]。这里的四元数不再表示一个旋转,所以模长不一定为1。<br> 对该点




    p



   p


p施加旋转变换




    q



   q


q,通过四元组的两次叉乘实现:





     p


     ′



    =


    q


    ×


    p


    ×



     q



      −


      1




    =


    [


    0


    ,



     x


     ′



    ,



     y


     ′



    ,



     z


     ′



    ]



   p'= q \times p \times q^{-1} = [0,x',y',z']


p′=q×p×q−1=[0,x′,y′,z′]。

利用matlab的syms功能(参看附录),可以得到对三维点

    [


    x


    ,


    y


    ,


    z


    ]



   [x,y,z]


[x,y,z]施加变换




    [



     q


     0



    ,



     q


     1



    ,



     q


     2



    ,



     q


     3



    ]



   [q_0,q_1,q_2,q_3]


[q0​,q1​,q2​,q3​]的结果:<br> 





      x


      ′



     =


     x


     (



      q


      0


      2



     +



      q


      1


      2



     −



      q


      2


      2



     −



      q


      3


      2



     )


     +


     2


     y


     (



      q


      1




      q


      2



     −



      q


      0




      q


      3



     )


     +


     2


     z


     (



      q


      0




      q


      2



     +



      q


      1




      q


      3



     )



    x' = x(q_0^2 + q_1^2 - q_2^2 - q_3^2) + 2y(q_1q_2 - q_0q_3)+ 2z(q_0q_2 + q_1q_3) 


 x′=x(q02​+q12​−q22​−q32​)+2y(q1​q2​−q0​q3​)+2z(q0​q2​+q1​q3​)







      y


      ′



     =


     2


     x


     (



      q


      0




      q


      3



     +



      q


      1




      q


      2



     )


     +


     y


     (



      q


      0


      2



     −



      q


      1


      2



     +



      q


      2


      2



     −



      q


      3


      2



     )


     +


     2


     z


     (


     −



      q


      0




      q


      1



     +



      q


      2




      q


      3



     )



    y'= 2x(q_0q_3+ q_1q_2)+y(q_0^2- q_1^2+ q_2^2- q_3^2) + 2z(-q_0q_1 + q_2q_3)


 y′=2x(q0​q3​+q1​q2​)+y(q02​−q12​+q22​−q32​)+2z(−q0​q1​+q2​q3​)







      z


      ′



     =


     2


     x


     (


     −



      q


      0




      q


      2



     +



      q


      1




      q


      3



     )


     +


     2


     y


     (



      q


      0




      q


      1



     +



      q


      2




      q


      3



     )


     +


     z


     (



      q


      0


      2



     −



      q


      1


      2



     −



      q


      2


      2



     +



      q


      3


      2



     )



    z'=2x(-q_0q_2+ q_1q_3)+ 2y(q_0q_1+ q_2q_3)+z(q_0^2 - q_1^2 - q_2^2 + q_3^2)


 z′=2x(−q0​q2​+q1​q3​)+2y(q0​q1​+q2​q3​)+z(q02​−q12​−q22​+q32​)

附录

以下代码推导对三维点

    [


    x


    ,


    y


    ,


    z


    ]



   [x,y,z]


[x,y,z]<br> 施加变换




    [



     q


     0



    ,



     q


     1



    ,



     q


     2



    ,



     q


     3



    ]



   [q_0,q_1,q_2,q_3]


[q0​,q1​,q2​,q3​]的结果。

clear;clc;close all;
syms a1 a2 a3 a4 b1 b2 b3 b4
syms q0 q1 q2 q3
syms x y z

% a: rotation, b: 3D vector
a1 = q0;
a2 = q1;
a3 = q2;
a4 = q3;

b1 = 0;
b2 = x;
b3 = y;
b4 = z;

% c = a (*) b
c1 = a1*b1-a2*b2-a3*b3-a4*b4;
c2 = a1*b2+a2*b1+a3*b4-a4*b3;
c3 = a1*b3-a2*b4+a3*b1+a4*b2;
c4 = a1*b4+a2*b3-a3*b2+a4*b1;

% d = conj(a)
d1 = a1;
d2 = -a2;
d3 = -a3;
d4 = -a4;

% e = a (*) b (*) conj(a) = c (*) d
e1 = c1*d1-c2*d2-c3*d3-c4*d4;
e2 = c1*d2+c2*d1+c3*d4-c4*d3;
e3 = c1*d3-c2*d4+c3*d1+c4*d2;
e4 = c1*d4+c2*d3-c3*d2+c4*d1;

expand(e1)
expand(e2)
expand(e3)
expand(e4)
posted @ 2020-12-28 11:31  刘桓湚  阅读(1086)  评论(0)    收藏  举报