前言——因为之前总是记混旋转的左乘和右乘和其中的一些规则,所以这篇文章的目的是为了更容易地记住旋转的一些特性,所以并没有太多的基础知识介绍。
在看这篇博客之前,你应该已经知道了一件事情就是旋转矩阵的列向量就是旋转后的坐标系的基向量是旋转之前的坐标系中的向量表示。有点绕好像,这里我不太会描述,情况是这样:
对于下面的旋转,设原始的坐标系为 A A A系,其坐标系的三个基向量为:
X A = ( 1 , 0 , 0 ) , Y A = ( 0 , 1 , 0 ) , Z A = ( 0 , 0 , 1 ) X_A=(1,0,0), Y_A=(0,1,0), Z_A=(0,0,1) XA=(1,0,0),YA=(0,1,0),ZA=(0,0,1) (为了简单描述, Z A Z_A ZA没有画出来。)
B B B系是绕着 Z A Z_A ZA逆时针旋转角 α \alpha α得到的坐标系。 B B B系中的三个基向量可以表达为:
X B = ( c o s ( α ) , s i n ( α ) , 0 ) , Y B = ( − s i n ( α ) , c o s ( α ) , 0 ) , Z B = ( 0 , 0 , 1 ) X_B=(cos(\alpha),sin(\alpha),0), Y_B=(-sin(\alpha),cos(\alpha),0), Z_B=(0,0,1) XB=(cos(α),sin(α),0),YB=(−sin(α),cos(α),0),ZB=(0,0,1)
因此我们知道旋转矩阵 B A R = [ X B ⋅ X A Y B ⋅ X A Z B ⋅ X A X B ⋅ Y A Y B ⋅ Y A Z B ⋅ Y A X B ⋅ Z A Y B ⋅ Z A Z B ⋅ Z A ] = [ cos ( α ) − sin ( α ) 0 sin ( α ) cos ( α ) 0 0 0 1 ] _B^A \!R = { {\left[\begin{array}{l l l}{X_B\cdot X_A}&{Y_B\cdot X_A}&{Z_B\cdot X_A}\\ {X_B\cdot Y_A}&{Y_B\cdot Y_A}&{Z_B\cdot Y_A}\\ {X_B\cdot Z_A}&{Y_B\cdot Z_A}&{Z_B\cdot Z_A}\end{array}\right]}} = {\left[\begin{array}{l l l}{\cos(\alpha)}&{-\sin(\alpha)}&{0}\\ {\sin(\alpha)}&{\cos(\alpha)}&{0}\\ {0}&{0}&{1}\end{array}\right]} BAR= XB⋅XAXB⋅YAXB⋅ZAYB⋅XAYB⋅YAYB⋅ZAZB⋅XAZB⋅YAZB⋅ZA = cos(α)sin(α)0−sin(α)cos(α)0001
如果不知道为什么可以看这篇文章:旋转矩阵及左右乘的意义,看这一篇就够了 或者 视频
该旋转矩阵可以叫做坐标系 A A A到坐标系 B B B的旋转矩阵;或者说是在坐标系 A A A中观察坐标系 B B B时,坐标系 B B B发生的旋转。
那么对于坐标系 A A A中的一点 A P = ( A P X , A P Y , A P Z ) = ( cos ( θ ) , sin ( θ ) , 0 ) ^{A}\!P= (^{A}\!P_{X},^A\!\!P_{Y},^A\!\!P_{Z})=(\cos(\theta),\sin(\theta),0) AP=(APX,APY,APZ)=(cos(θ),sin(θ),0),
其在 B B B系中的坐标就是 B P = ( B P X , B P Y , B P Z ) = ( cos ( α + θ ) , sin ( α + θ ) , 0 ) ^{B}\!P= (^B\!P_{X},^B\!\!P_{Y},^B\!\!P_{Z})=(\cos(\alpha+\theta),\sin(\alpha+\theta),0) BP=(BPX,BPY,BPZ)=(cos(α+θ),sin(α+θ),0)。
此时我们有第一个结论: A P = B A R ⋅ B P ^{A}\!P= _{B}^{A}\!\!\!R \cdot ^{B}\!\!\!P AP=BAR⋅BP
从物理意义上讲就是在 B B B系下的坐标需要经过由 A A A到 B B B系的旋转矩阵旋转会得到在 A A A系下的相应坐标。
从符号上记忆就是旋转矩阵左下角的B和向量左上角的 B B B被约掉,最后只剩下 A A A,就是 A P ^{A}\!P AP。
这是符合物理常识的,比如我们有三个人(甲乙丙),其中甲在x=0处,乙在x=5处,丙在x=10处,那么我们知道乙相对于甲的坐标就是+5,那么乙看到丙的距离是5,甲看到丙的距离就是5+5=10。
简单证明:
B A R ⋅ B P = [ X B ⋅ X A Y B ⋅ X A Z B ⋅ X A X B ⋅ Y A Y B ⋅ Y A Z B ⋅ Y A X B ⋅ Z A Y B ⋅ Z A Z B ⋅ Z A ] ⋅ [ B P X B P Y B P Z ] _{B}^{A}\!R \cdot ^{B}\!\!P ={ {\left[\begin{array}{l l l}{X_B\cdot X_A}&{Y_B\cdot X_A}&{Z_B\cdot X_A}\\ {X_B\cdot Y_A}&{Y_B\cdot Y_A}&{Z_B\cdot Y_A}\\ {X_B\cdot Z_A}&{Y_B\cdot Z_A}&{Z_B\cdot Z_A}\end{array}\right]}} \cdot { {\left[\begin{array}{l}{^B\!P_{X}}\\ {^B\!P_{Y}}\\ {^B\!P_{Z}}\end{array}\right]}} BAR⋅BP= XB⋅XAXB⋅YAXB⋅ZAYB⋅XAYB⋅YAYB⋅ZAZB⋅XAZB⋅YAZB⋅ZA ⋅ BPXBPYBPZ
取计算结果后的第一行:
B P X ⋅ X B ⋅ X A + B P Y ⋅ Y B ⋅ X A + B P Z ⋅ Z B ⋅ X A = cos ( θ ) cos ( α ) − sin ( θ ) sin ( α ) + 0 = cos ( α + θ ) = A P X ^B\!P_{X}\cdot X_B\cdot X_A+^B\!\!P_{Y}\cdot Y_B\cdot X_A+^B\!\!P_{Z}\cdot Z_B\cdot X_A \\= \cos(\theta)\cos(\alpha) -\sin(\theta)\sin(\alpha)+ 0 \\= \cos(\alpha+\theta) \\=\ ^{A}\!P_X BPX⋅XB⋅XA+BPY⋅YB⋅XA+BPZ⋅ZB⋅XA=cos(θ)cos(α)−sin(θ)sin(α)+0=cos(α+θ)= APX
第二行第三行可以同样计算得到,所以就可以简单证明出来这个方程是成立的。
我们假设另一个坐标系 C C C是相对于坐标系 B B B沿着 Z Z Z轴方向逆时针旋转了 β \beta β,因此我们知道:
C B R = [ X C ⋅ X B Y C ⋅ X B Z C ⋅ X B X C ⋅ Y B Y C ⋅ Y B Z C ⋅ Y B X C ⋅ Z B Y C ⋅ Z B Z C ⋅ Z B ] = [ cos ( β ) − sin ( β ) 0 sin ( β ) cos ( β ) 0 0 0 1 ] _C^B \!R = { {\left[\begin{array}{l l l}{X_C\cdot X_B}&{Y_C\cdot X_B}&{Z_C\cdot X_B}\\ {X_C\cdot Y_B}&{Y_C\cdot Y_B}&{Z_C\cdot Y_B}\\ {X_C\cdot Z_B}&{Y_C\cdot Z_B}&{Z_C\cdot Z_B}\end{array}\right]}} = {\left[\begin{array}{l l l}{\cos(\beta)}&{-\sin(\beta)}&{0}\\ {\sin(\beta)}&{\cos(\beta)}&{0}\\ {0}&{0}&{1}\end{array}\right]} CBR= XC⋅XBXC⋅YBXC⋅ZBYC⋅XBYC⋅YBYC⋅ZBZC⋅XBZC⋅YBZC⋅ZB = cos(β)sin(β)0−sin(β)cos(β)0001
此时我们有第二个结论:
C A R = B A R ⋅ C B R _{C}^{A}\!R = _{B}^{A}\!\!\!R \cdot _{C}^{B}\!\!\!R CAR=BAR⋅CBR
这也是所谓的矩阵右乘,就是说 A A A到 B B B的旋转矩阵右乘 B B B到 C C C的旋转矩阵就可以到 A A A到 C C C的旋转矩阵。
从符号上记忆就是旋转矩阵 B A R _{B}^{A}\!R BAR左下角的B和旋转矩阵 C B R _{C}^{B}\!R CBR左上角的 B B B被约掉,最后就得到 C A R _{C}^{A}\!R CAR。
从旋转矩阵的物理意义理解就是:我们知道 C B R _{C}^{B}\!R CBR中每一个列向量都是坐标系C的基向量在B系下的向量表示,那么 C B R _{C}^{B}\!R CBR可以表示为: C B R = [ B X C , B Y C , B Z C ] _{C}^{B}\!R=[^B\!\textbf{X}_C,^B\!\!\textbf{Y}_C,^B\!\!\textbf{Z}_C] CBR=[BXC,BYC,BZC]
这里以 B X C ^B\textbf{X}_C BXC为例,我们其实可以把它看作是 B B B系下的一个向量的坐标,那么我们要得到它在 A A A系下的坐标,就是要左乘旋转矩阵 B A R _{B}^{A}\!R BAR,因此我们就到了 A X C ^A\textbf{X}_C AXC,同理我们可以得到 A Y C ^A\textbf{Y}_C AYC和 A Z C ^A\textbf{Z}_C AZC,我们将这三者拼起来就是: C A R = [ A X C , A Y C , A Z C ] _{C}^{A}\!R=[^A\!\textbf{X}_C,^A\!\!\textbf{Y}_C,^A\!\!\textbf{Z}_C] CAR=[AXC,AYC,AZC]
简单证明:
B A R ⋅ C B R = [ cos ( α ) − sin ( α ) 0 sin ( α ) cos ( α ) 0 0 0 1 ] ⋅ [ cos ( β ) − sin ( β ) 0 sin ( β ) cos ( β ) 0 0 0 1 ] _{B}^{A}\!R \cdot _{C}^{B}\!\!\!R={\left[\begin{array}{l l l}{\cos(\alpha)}&{-\sin(\alpha)}&{0}\\ {\sin(\alpha)}&{\cos(\alpha)}&{0}\\ {0}&{0}&{1}\end{array}\right]} \cdot {\left[\begin{array}{l l l}{\cos(\beta)}&{-\sin(\beta)}&{0}\\ {\sin(\beta)}&{\cos(\beta)}&{0}\\ {0}&{0}&{1}\end{array}\right]} BAR⋅CBR= cos(α)sin(α)0−sin(α)cos(α)0001 ⋅ cos(β)sin(β)0−sin(β)cos(β)0001
取计算结果的第一行就是: cos ( α ) cos ( β ) − sin ( α ) sin ( β ) = cos ( α + β ) \cos(\alpha)\cos(\beta)-\sin(\alpha)\sin(\beta) = \cos(\alpha+\beta) cos(α)cos(β)−sin(α)sin(β)=cos(α+β)
而 C A R _{C}^{A}\!R CAR的第一行也正是 cos ( α + β ) \cos(\alpha+\beta) cos(α+β),其他两行也可以同理证明得到。
本文里的方法略显粗糙,其中黑字和红字就是为了方便自己理解和记忆,如果想更深入地了解旋转矩阵,可以参考文章里给出的两个链接。