最近在看人头姿态和视线方向检测的东西,需要考虑坐标系与坐标系之间的旋转.用欧拉角表示坐标系的旋转时存在两种旋转方法,另外旋转的顺序也会对旋转结果有影响,查了一些资料总结一下结果.
描述坐标系B\textbf{B}B相对于坐标系A\textbf{A}A的姿态有两种方式:第一种是绕固定坐标轴旋转,第二种是绕自身坐标轴旋转.假设坐标系A\textbf{A}A为世界坐标系(不动),坐标系B\textbf{B}B为旋转坐标系,两个坐标系在开始时重合,则:
-
绕固定坐标轴旋转:
先将B\textbf{B}B绕A\textbf{A}A的X\textbf{X}X轴旋转α\alphaα,再将B\textbf{B}B绕A\textbf{A}A的Y\textbf{Y}Y轴旋转β\betaβ,最后将B\textbf{B}B绕A\textbf{A}A的Z\textbf{Z}Z轴旋转γ\gammaγ.旋转过程中坐标系A\textbf{A}A是不动的,其三个坐标轴也是固定的,因此称这种旋转方法为绕固定轴旋转.注意这里的旋转方向为先X\textbf{X}X轴,再Y\textbf{Y}Y轴,最后Z\textbf{Z}Z轴.
-
绕自身坐标轴旋转:
先将B\textbf{B}B绕B\textbf{B}B的Z\textbf{Z}Z轴旋转γ\gammaγ,再将B\textbf{B}B绕B\textbf{B}B的Y\textbf{Y}Y轴旋转β\betaβ,最后将B\textbf{B}B绕B\textbf{B}B的X\textbf{X}X轴旋转α\alphaα.旋转过程中坐标系B\textbf{B}B是变化的,其三个坐标轴也是变化的,称这种旋转方法为绕固自身旋转.注意这里的旋转方向为先Z\textbf{Z}Z轴,再Y\textbf{Y}Y轴,最后X\textbf{X}X轴.和第一种旋转方式的旋转顺序不同,原因是后面要给出的结论.
-
结论:
以绕固定轴方式,先X\textbf{X}X轴转α\alphaα,再Y\textbf{Y}Y轴转β\betaβ,最后Z\textbf{Z}Z轴转γ\gammaγ的旋转和以绕自身轴方式,先Z\textbf{Z}Z轴转γ\gammaγ,再Y\textbf{Y}Y轴转β\betaβ,最后X\textbf{X}X轴转α\alphaα的旋转是等效的,下面给出"僵硬"的数学证明.
-
证明:
我们知道,坐标轴的旋转可以用旋转矩阵来表示,为了证明上述两种旋转方法是等效的,只需要证明两种旋转方法对应的旋转矩阵是相同的.
-
对于绕固定轴方式,先X\textbf{X}X轴转α\alphaα,再Y\textbf{Y}Y轴转β\betaβ,最后Z\textbf{Z}Z轴转γ\gammaγ的旋转,其旋转矩阵R\textbf{R}R容易得到:
RX(α)=[1000cos(α)−sin(α)0sin(α)cos(α)]R_X(\alpha) = \left [\begin{matrix} 1&0&0 \\ 0&cos(\alpha)&-sin(\alpha) \\0&sin(\alpha)&cos(\alpha)\end{matrix}\right ]RX(α)=⎣⎡1000cos(α)sin(α)0−sin(α)cos(α)⎦⎤
RY(β)=[cos(β)0sin(β)010−sin(β)0cos(β)]R_Y(\beta) = \left [\begin{matrix} cos(\beta)&0&sin(\beta) \\ 0&1&0 \\-sin(\beta)&0&cos(\beta)\end{matrix}\right ]RY(β)=⎣⎡cos(β)0−sin(β)010sin(β)0cos(β)⎦⎤
RZ(γ)=[cos(γ)−sin(γ)0sin(γ)cos(γ)0001]R_Z(\gamma) = \left [\begin{matrix} cos(\gamma)&-sin(\gamma)&0 \\ sin(\gamma)&cos(\gamma)&0 \\0&0&1\end{matrix}\right ]RZ(γ)=⎣⎡cos(γ)sin(γ)0−sin(γ)cos(γ)0001⎦⎤
R=RZ(γ)×RY(α)×RX(α)=[cos(β)cos(γ)sin(α)sin(β)cos(γ)−cos(α)sin(γ)cos(α)sin(β)cos(γ)+sin(α)sin(γ)cos(β)sin(γ)sin(α)sin(β)sin(γ)+cos(α)cos(γ)cos(α)sin(β)sin(γ)−sin(α)cos(γ)−sin(β)sin(α)cos(γ)cos(α)cos(γ)]\textbf{R} = R_Z(\gamma) \times R_Y(\alpha) \times R_X(\alpha) = \\ \\ \left [\begin{matrix} cos(\beta)cos(\gamma)&sin(\alpha)sin(\beta)cos(\gamma)-cos(\alpha)sin(\gamma)&cos(\alpha)sin(\beta)cos(\gamma)+sin(\alpha)sin(\gamma)\\cos(\beta)sin(\gamma)&sin(\alpha)sin(\beta)sin(\gamma)+cos(\alpha)cos(\gamma)&cos(\alpha)sin(\beta)sin(\gamma)-sin(\alpha)cos(\gamma)\\-sin(\beta)&sin(\alpha)cos(\gamma)&cos(\alpha)cos(\gamma)\end{matrix}\right ]R=RZ(γ)×RY(α)×RX(α)=⎣⎡cos(β)cos(γ)cos(β)sin(γ)−sin(β)sin(α)sin(β)cos(γ)−cos(α)sin(γ)sin(α)sin(β)sin(γ)+cos(α)cos(γ)sin(α)cos(γ)cos(α)sin(β)cos(γ)+sin(α)sin(γ)cos(α)sin(β)sin(γ)−sin(α)cos(γ)cos(α)cos(γ)⎦⎤
-
对于绕自身轴方式,先Z\textbf{Z}Z轴转γ\gammaγ,再Y\textbf{Y}Y轴转β\betaβ,最后X\textbf{X}X轴转α\alphaα的旋转,其旋转矩阵R\textbf{R}R.首先给出坐标系绕任意以单位向量表示方向的定轴(x,y,z)(x,y,z)(x,y,z)旋转θ\thetaθ的旋转矩阵为:
r=[cos(θ)+(1−cos(θ))x2(1−cos(θ))xy−sin(θ)z(1−cos(θ))xz+sin(θ)y(1−cos(θ))xy+sin(θ)zcos(θ)+(1−cos(θ))y2(1−cos(θ))yz−sin(θ)x(1−cos(θ))xz−sin(θ)y(1−cos(θ))yz+sin(θ)xcos(θ)+(1−cos(θ))z2]\textbf{r} = \left [\begin{matrix} cos(\theta)+(1-cos(\theta))x^2&(1-cos(\theta))xy-sin(\theta)z&(1-cos(\theta))xz+sin(\theta)y\\(1-cos(\theta))xy+sin(\theta)z&cos(\theta)+(1-cos(\theta))y^2&(1-cos(\theta))yz-sin(\theta)x\\(1-cos(\theta))xz-sin(\theta)y&(1-cos(\theta))yz+sin(\theta)x&cos(\theta)+(1-cos(\theta))z^2\end{matrix}\right ]r=⎣⎡cos(θ)+(1−cos(θ))x2(1−cos(θ))xy+sin(θ)z(1−cos(θ))xz−sin(θ)y(1−cos(θ))xy−sin(θ)zcos(θ)+(1−cos(θ))y2(1−cos(θ))yz+sin(θ)x(1−cos(θ))xz+sin(θ)y(1−cos(θ))yz−sin(θ)xcos(θ)+(1−cos(θ))z2⎦⎤
则先Z\textbf{Z}Z轴转γ\gammaγ对应的旋转矩阵RZ(γ)R_Z(\gamma)RZ(γ):
RZ(γ)=[cos(γ)−sin(γ)0sin(γ)cos(γ)0001]R_Z(\gamma) = \left [\begin{matrix} cos(\gamma)&-sin(\gamma)&0 \\ sin(\gamma)&cos(\gamma)&0 \\0&0&1\end{matrix}\right ]RZ(γ)=⎣⎡cos(γ)sin(γ)0−sin(γ)cos(γ)0001⎦⎤
旋转后的Y\textbf{Y}Y轴由(0,1,0)(0,1,0)(0,1,0)变成了(−sin(γ),cos(γ),0)(-sin(\gamma),cos(\gamma),0)(−sin(γ),cos(γ),0),再按照绕任意轴的公式计算得到绕此时的Y\textbf{Y}Y轴旋转β\betaβ对应的旋转矩阵为:
RY(β)=[cos(β)−sin2(γ)(cos(β)−1)cos(γ)sin(γ)(cos(β)−1)sin(β)cos(γ)cos(γ)sin(γ)(cos(β)−1)cos(β)−cos2(γ)(cos(β)−1)sin(β)sin(γ)−sin(β)cos(γ)−sin(β)sin(γ)cos(β)]R_Y(\beta) = \left [\begin{matrix} cos(\beta)-sin^2(\gamma)(cos(\beta)-1)&cos(\gamma)sin(\gamma)(cos(\beta)-1)&sin(\beta)cos(\gamma) \\ cos(\gamma)sin(\gamma)(cos(\beta)-1)&cos(\beta)-cos^2(\gamma)(cos(\beta)-1)&sin(\beta)sin(\gamma) \\-sin(\beta)cos(\gamma)&-sin(\beta)sin(\gamma)&cos(\beta)\end{matrix}\right ]RY(β)=⎣⎡cos(β)−sin2(γ)(cos(β)−1)cos(γ)sin(γ)(cos(β)−1)−sin(β)cos(γ)cos(γ)sin(γ)(cos(β)−1)cos(β)−cos2(γ)(cos(β)−1)−sin(β)sin(γ)sin(β)cos(γ)sin(β)sin(γ)cos(β)⎦⎤
则两步旋转后的旋转矩阵为RY(β)×RZ(γ)R_Y(\beta)\times R_Z(\gamma)RY(β)×RZ(γ):
RY(β)×RZ(γ)=[cos(β)cos(γ)−sin(γ)sin(β)cos(γ)cos(β)sin(γ)cos(γ)sin(β)sin(γ)−sin(β)0cos(β)]R_Y(\beta)\times R_Z(\gamma)=\left[\begin{matrix}cos(\beta)cos(\gamma)&-sin(\gamma)&sin(\beta)cos(\gamma)\\cos(\beta)sin(\gamma)&cos(\gamma)&sin(\beta)sin(\gamma)\\-sin(\beta)&0&cos(\beta)\end{matrix}\right]RY(β)×RZ(γ)=⎣⎡cos(β)cos(γ)cos(β)sin(γ)−sin(β)−sin(γ)cos(γ)0sin(β)cos(γ)sin(β)sin(γ)cos(β)⎦⎤
旋转后的X\textbf{X}X轴由(1,0,0)(1,0,0)(1,0,0)变成了(cos(β)cos(γ),−sin(γ),sin(β)cos(γ))(cos(\beta)cos(\gamma),-sin(\gamma),sin(\beta)cos(\gamma))(cos(β)cos(γ),−sin(γ),sin(β)cos(γ)),再按照绕任意轴的公式计算得到绕此时的X\textbf{X}X轴旋转α\alphaα对应的旋转矩阵为RX(α)R_X(\alpha)RX(α):
这个矩阵实在太长了我不想写了,反正就是按照上面的任意轴公式,把x=cos(β)cos(γ),y=−sin(γ),z=sin(β)cos(γ)x=cos(\beta)cos(\gamma),y=-sin(\gamma),z=sin(\beta)cos(\gamma)x=cos(β)cos(γ),y=−sin(γ),z=sin(β)cos(γ)和θ=γ\theta=\gammaθ=γ往里一代就行了.
最后总的旋转矩阵R=RX(α)×RY(β)×RZ(γ)\textbf{R} = R_X(\alpha)\times R_Y(\beta)\times R_Z(\gamma)R=RX(α)×RY(β)×RZ(γ) ,把各部的结果代进去一算,就得到了最终结果:
R=[cos(β)cos(γ)sin(α)sin(β)cos(γ)−cos(α)sin(γ)cos(α)sin(β)cos(γ)+sin(α)sin(γ)cos(β)sin(γ)sin(α)sin(β)sin(γ)+cos(α)cos(γ)cos(α)sin(β)sin(γ)−sin(α)cos(γ)−sin(β)sin(α)cos(γ)cos(α)cos(γ)]\textbf{R} = \left [\begin{matrix} cos(\beta)cos(\gamma)&sin(\alpha)sin(\beta)cos(\gamma)-cos(\alpha)sin(\gamma)&cos(\alpha)sin(\beta)cos(\gamma)+sin(\alpha)sin(\gamma)\\cos(\beta)sin(\gamma)&sin(\alpha)sin(\beta)sin(\gamma)+cos(\alpha)cos(\gamma)&cos(\alpha)sin(\beta)sin(\gamma)-sin(\alpha)cos(\gamma)\\-sin(\beta)&sin(\alpha)cos(\gamma)&cos(\alpha)cos(\gamma)\end{matrix}\right ]R=⎣⎡cos(β)cos(γ)cos(β)sin(γ)−sin(β)sin(α)sin(β)cos(γ)−cos(α)sin(γ)sin(α)sin(β)sin(γ)+cos(α)cos(γ)sin(α)cos(γ)cos(α)sin(β)cos(γ)+sin(α)sin(γ)cos(α)sin(β)sin(γ)−sin(α)cos(γ)cos(α)cos(γ)⎦⎤
和第一种旋转方法得到的结果相同.于是证明了前面给出的结论.之所以说这是一种很"僵硬"的证明办法,是因为整个过程是用matlab强行代公式计算出来的,中间结果可能看起来很啰嗦式子很长,但是你把他们都乘起来,就能化简出相同的结果.实际上应该有更优雅的立体几何投影证明方法,但是空间想象能力实在太差,想不出来.如果有清楚的朋友请指点一下.
-
-
经过和泡儿鱼的讨论,想出了比较简洁的证明方法,写在下面:
-
证明2:
旋转矩阵可以用来表示坐标系和坐标系之间旋转的变换关系,也可以用来表示同一个坐标系下坐标旋转前后的变换关系,从后者的角度出发可以得到一个比较简洁又清晰的证明方法.
我们的任务是证明:以绕固定轴方式,先绕X\textbf{X}X轴转α\alphaα,再绕Y\textbf{Y}Y轴转β\betaβ,最后绕Z\textbf{Z}Z轴转γ\gammaγ的旋转和以绕自身轴方式,先绕Z\textbf{Z}Z轴转γ\gammaγ,再绕Y\textbf{Y}Y轴转β\betaβ,最后绕X\textbf{X}X轴转α\alphaα的旋转是等效的.在上述僵硬的证明方法中,我们通过计算证明了两种方式下坐标系前后的变换矩阵是相同的.下面的方法中,我们证明A坐标系中有一个向量,按照这两种方式去旋转,旋转后它们在原A坐标系下转到了同一个位置,即证明了上述结论.
假设有一个固定的世界坐标系A\textbf{A}A,其中有一个向量a\textbf{a}a,它在A\textbf{A}A中的坐标为Ra\textbf{Ra}Ra.
-
对于第一种方式的变换:
向量a\textbf{a}a先绕A\textbf{A}A的X\textbf{X}X轴转α\alphaα,再绕A\textbf{A}A的Y\textbf{Y}Y轴转β\betaβ,最后绕A\textbf{A}A的Z\textbf{Z}Z轴转γ\gammaγ,则三步旋转过后它在坐标系A\textbf{A}A中的坐标:
Ra’=RZ(γ)×RY(α)×RX(α)×Ra\textbf{Ra'}=R_Z(\gamma) \times R_Y(\alpha) \times R_X(\alpha) \times\textbf{Ra}Ra’=RZ(γ)×RY(α)×RX(α)×Ra
其中:
RX(α)=[1000cos(α)−sin(α)0sin(α)cos(α)]R_X(\alpha) = \left [\begin{matrix} 1&0&0 \\ 0&cos(\alpha)&-sin(\alpha) \\0&sin(\alpha)&cos(\alpha)\end{matrix}\right ]RX(α)=⎣⎡1000cos(α)sin(α)0−sin(α)cos(α)⎦⎤
RY(β)=[cos(β)0sin(β)010−sin(β)0cos(β)]R_Y(\beta) = \left [\begin{matrix} cos(\beta)&0&sin(\beta) \\ 0&1&0 \\-sin(\beta)&0&cos(\beta)\end{matrix}\right ]RY(β)=⎣⎡cos(β)0−sin(β)010sin(β)0cos(β)⎦⎤
RZ(γ)=[cos(γ)−sin(γ)0sin(γ)cos(γ)0001]R_Z(\gamma) = \left [\begin{matrix} cos(\gamma)&-sin(\gamma)&0 \\ sin(\gamma)&cos(\gamma)&0 \\0&0&1\end{matrix}\right ]RZ(γ)=⎣⎡cos(γ)sin(γ)0−sin(γ)cos(γ)0001⎦⎤
-
对于第二种方式的变换:
假设除了不动的世界坐标系A\textbf{A}A以外,还有一个和向量a\textbf{a}a固连在一起的向量坐标系B\textbf{B}B.固连的向量坐标系和向量a\textbf{a}a是固连的不会产生相对运动,即向量a\textbf{a}a怎么转固连坐标系B\textbf{B}B就怎么转.那么显然,任何转动后,向量a\textbf{a}a在固连坐标系B\textbf{B}B下的坐标都是不变的,且始终等于未发生任何转动时向量a\textbf{a}a在世界坐标系A\textbf{A}A下的坐标Ra\textbf{Ra}Ra.
第二种方式的变换为:向量a\textbf{a}a先绕B\textbf{B}B的Z\textbf{Z}Z轴转γ\gammaγ,再绕B\textbf{B}B的Y\textbf{Y}Y轴转β\betaβ,最后绕B\textbf{B}B的X\textbf{X}X轴转α\alphaα,将转动步骤倒过来叙述更方便
-
对于第三步转动,即向量a\textbf{a}a绕第二次转动后的固连坐标系B”\textbf{B''}B”的X\textbf{X}X轴转α\alphaα,有:
Ra2=RX(α)×Ra3\textbf{Ra2} = R_X(\alpha) \times \textbf{Ra3}Ra2=RX(α)×Ra3
其中Ra2\textbf{Ra2}Ra2为三次转动后向量a\textbf{a}a在第二次转动后的固连坐标系B”\textbf{B''}B”中的坐标,Ra3\textbf{Ra3}Ra3为三次转动后向量a\textbf{a}a在第三次转动后的固连坐标系B”’\textbf{B'''}B”’中的坐标.RX(α)R_X(\alpha)RX(α)为第二次转动后的固连坐标系B”\textbf{B''}B”和第三次转动后的固连坐标系B”’\textbf{B'''}B”’之间的旋转矩阵.由于第三次旋转就是绕着B”\textbf{B''}B”的X\textbf{X}X轴转了α\alphaα,因此RX(α)R_X(\alpha)RX(α),或者说B”\textbf{B''}B”和B”’\textbf{B'''}B”’之间的变换矩阵就是:
RX(α)=[1000cos(α)−sin(α)0sin(α)cos(α)]R_X(\alpha) = \left [\begin{matrix} 1&0&0 \\ 0&cos(\alpha)&-sin(\alpha) \\0&sin(\alpha)&cos(\alpha)\end{matrix}\right ]RX(α)=⎣⎡1000cos(α)sin(α)0−sin(α)cos(α)⎦⎤
-
同理对于第二步转动,有:
Ra1=RY(β)×Ra2\textbf{Ra1} = R_Y(\beta) \times \textbf{Ra2}Ra1=RY(β)×Ra2 ,各变量的意义类似第三步不再赘述.
RY(β)=[cos(β)0sin(β)010−sin(β)0cos(β)]R_Y(\beta) = \left [\begin{matrix} cos(\beta)&0&sin(\beta) \\ 0&1&0 \\-sin(\beta)&0&cos(\beta)\end{matrix}\right ]RY(β)=⎣⎡cos(β)0−sin(β)010sin(β)0cos(β)⎦⎤
-
同理对于第一步转动有:
Ra0=RZ(γ)×Ra1\textbf{Ra0} = R_Z(\gamma) \times \textbf{Ra1}Ra0=RZ(γ)×Ra1,其中Ra0\textbf{Ra0}Ra0为三次转动后向量a\textbf{a}a在第0次转动后的固连坐标系B”\textbf{B''}B”中的坐标,也就是在世界坐标系中的坐标Ra’\textbf{Ra'}Ra’,即:
Ra’=RZ(γ)×Ra1\textbf{Ra'} = R_Z(\gamma) \times \textbf{Ra1}Ra’=RZ(γ)×Ra1,其中:
RZ(γ)=[cos(γ)−sin(γ)0sin(γ)cos(γ)0001]R_Z(\gamma) = \left [\begin{matrix} cos(\gamma)&-sin(\gamma)&0 \\ sin(\gamma)&cos(\gamma)&0 \\0&0&1\end{matrix}\right ]RZ(γ)=⎣⎡cos(γ)sin(γ)0−sin(γ)cos(γ)0001⎦⎤
-
把三步转动穿起来看,有:
Ra’=RZ(γ)×Ra1=RZ(γ)×(RY(β)×Ra2)=RZ(γ)×(RY(β)×(RX(α)×Ra3))=RZ(γ)×RY(β)×RX(α)×Ra3\textbf{Ra'} = R_Z(\gamma) \times \textbf{Ra1} = R_Z(\gamma) \times(R_Y(\beta) \times \textbf{Ra2}) = R_Z(\gamma) \times(R_Y(\beta) \times (R_X(\alpha) \times \textbf{Ra3}))=\\R_Z(\gamma) \times R_Y(\beta) \times R_X(\alpha) \times \textbf{Ra3}Ra’=RZ(γ)×Ra1=RZ(γ)×(RY(β)×Ra2)=RZ(γ)×(RY(β)×(RX(α)×Ra3))=RZ(γ)×RY(β)×RX(α)×Ra3
又因为Ra3\textbf{Ra3}Ra3是第三次转动后向量a\textbf{a}a在第三次转动后的固连坐标系B”’\textbf{B'''}B”’的坐标,由于相对位置不变,这个值就等于未发生转动时向量a\textbf{a}a在世界坐标系A\textbf{A}A中的坐标,即:
Ra3=Ra\textbf{Ra3} = \textbf{Ra}Ra3=Ra,则有:
Ra’=RZ(γ)×RY(α)×RX(α)×Ra3=RZ(γ)×RY(α)×RX(α)×Ra\textbf{Ra'}=R_Z(\gamma) \times R_Y(\alpha) \times R_X(\alpha) \times\textbf{Ra3} = R_Z(\gamma) \times R_Y(\alpha) \times R_X(\alpha) \times\textbf{Ra}Ra’=RZ(γ)×RY(α)×RX(α)×Ra3=RZ(γ)×RY(α)×RX(α)×Ra与第一种方式的变换结果相同.即同一个向量经过两种方式的变换后在世界坐标系中的坐标相同,也证明了这两种变换是等效的.
-
-
总结一下就是,如果是坐标系或者向量绕着固定的坐标轴旋转,相当于每转一次产生一个旋转矩阵,然后按旋转顺序将这些旋转矩阵左乘起来.如果是坐标系或者向量绕着自身的坐标轴旋转,相当于每转一次产生一个旋转矩阵,然后按旋转顺序将这些矩阵右乘起来.要注意后者的每一步旋转产生的旋转矩阵,不要以世界坐标系为基准去算,而是以每次旋转前的坐标系去算,也就是每次旋转矩阵只描述当前这次旋转前后的坐标系之间的转换矩阵!!!
费了半天劲希望把事情说明白了,我其实很担心哪个地方有笔误没写清楚,如果有的话请帮忙指出来.谢谢!
网上也找到了其他类似的证明方法,看起来似乎更简洁也更容易理解,贴出来供参考:
blog.miskcoo.com/2016/12/rotation-in-3d-space
-